Skip to content

Commit 676afab

Browse files
author
Victor
committed
feat: add methods to find, create, update and delete products
1 parent 89aefb7 commit 676afab

2 files changed

Lines changed: 124 additions & 2 deletions

File tree

src/controllers/ProductController.js

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,71 @@
1+
import Product from "../models/Product";
2+
import User from "../models/User";
3+
14
class ProductController {
25
async index(request, response) {
6+
const products = await Product.find();
37

8+
return response.json(products);
49
}
510

611
async find(request, response) {
712
const { id } = request.params;
13+
const result = await Product.find({ where: { id } });
14+
const product = result[0];
15+
16+
if (!product)
17+
return response.status(400).json({ erro: 'Product not found!' });
18+
19+
return response.json(product);
820
}
921

1022
async create(request, response) {
11-
const { description } = req.body;
23+
const { description, user_id } = request.body;
24+
25+
if (!description)
26+
return response.status(400).json({ error: 'Product description can\'t be null' });
27+
28+
if (user_id === null)
29+
return response.status(400).json({ error: 'User ID can\'t be null' });
30+
31+
const result = await User.find({ where: { id: user_id } });
32+
const user = result[0];
33+
34+
if (!user)
35+
return response.status(400).json({ erro: 'User not found!' });
36+
37+
const product = await Product.create({ description, user_id });
38+
39+
return response.status(201).json(product);
1240
}
1341

1442
async update(request, response) {
1543
const { id } = request.params;
16-
const { description } = req.body;
44+
const { description } = request.body;
45+
const result = await Product.find({ where: { id } });
46+
const product = result[0];
47+
48+
if (!product)
49+
return response.status(400).json({ error: 'Product not found!' });
50+
51+
if (!description)
52+
return response.status(400).json({ error: 'Product description can\'t be null' });
53+
54+
await Product.update({ description }, { where: { id } });
55+
56+
return response.status(204).send();
1757
}
1858

1959
async delete(request, response) {
2060
const { id } = request.params;
61+
const result = await Product.find({ where: { id } });
62+
const product = result[0];
63+
64+
if (!product)
65+
return response.status(400).json({ error: 'Product not found!' });
66+
67+
await Product.delete({ where: { id } });
68+
return response.status(204).send();
2169
}
2270
}
2371

src/models/Product.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,93 @@ import { connection as database } from '../config/database';
22

33
class Product {
44
async find(filters) {
5+
let query = 'SELECT * FROM products';
56

7+
if (filters)
8+
Object.keys(filters).forEach(filter => {
9+
query += ` ${filter}`;
10+
11+
Object.keys(filters[filter]).forEach(field => {
12+
if (filters[filter][field] !== null)
13+
query += ` ${field} = '${filters[filter][field]}'`;
14+
else
15+
query = ` ${field} = null`;
16+
});
17+
});
18+
19+
const result = await database.query(query);
20+
const products = result.rows;
21+
22+
return products;
623
}
724

825
async create(data) {
26+
const fields = [];
27+
const values = [];
28+
29+
Object.keys(data).forEach(field => {
30+
fields.push(field);
31+
32+
if (data[field] !== null) {
33+
if (Array.isArray(data[field])) {
34+
const newArray = data[field].map(item => `'${item}'`);
35+
36+
values.push(`ARRAY[${newArray}]`);
37+
} else
38+
values.push(`'${data[field]}'`);
39+
} else
40+
values.push('null');
41+
});
42+
43+
const query = `INSERT INTO products (${fields.join(', ')}) VALUES (${values.join(', ')}) RETURNING *`;
44+
const result = await database.query(query);
45+
const user = result.rows[0];
946

47+
return user;
1048
}
1149

1250
async update(data, filters) {
51+
const fieldsToUpdate = [];
1352

53+
Object.keys(data).forEach(field => {
54+
fieldsToUpdate.push(`${field} = '${data[field]}'`);
55+
});
56+
57+
let query = `UPDATE products SET ${fieldsToUpdate.join(', ')}`;
58+
59+
if (filters)
60+
Object.keys(filters).forEach(filter => {
61+
query += ` ${filter.toUpperCase()}`;
62+
63+
Object.keys(filters[filter]).forEach(field => {
64+
if (filters[filter][field] !== null)
65+
query += ` ${field} = '${filters[filter][field]}'`;
66+
else
67+
query += ` ${field} = null`;
68+
});
69+
});
70+
71+
await database.query(query);
72+
return;
1473
}
1574

1675
async delete(filters) {
76+
let query = 'DELETE FROM products';
77+
78+
if (filters)
79+
Object.keys(filters).forEach(filter => {
80+
query += ` ${filter.toUpperCase()}`;
81+
82+
Object.keys(filters[filter]).forEach(field => {
83+
if (filters[filter][field] !== null)
84+
query += ` ${field} = '${filters[filter][field]}'`;
85+
else
86+
query += ` ${field} = null`;
87+
});
88+
});
1789

90+
await database.query(query);
91+
return;
1892
}
1993
}
2094

0 commit comments

Comments
 (0)