Skip to content

Commit 5847d21

Browse files
author
Victor Badaró
authored
Merge pull request #1 from victorbadaro/feature/crud-users
Methods to find, create, update and delete users
2 parents 8e7da1d + 805304e commit 5847d21

5 files changed

Lines changed: 181 additions & 2 deletions

File tree

src/config/database.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { Pool } from 'pg';
22

3-
const databaseConfig = new Pool({
3+
const connection = new Pool({
44
host: process.env.DB_HOST,
55
port: process.env.DB_PORT,
66
user: process.env.DB_USERNAME,
77
password: process.env.DB_PASSWORD,
88
database: process.env.DB_DATABASE
9-
});
9+
});
10+
11+
export { connection };

src/controllers/UserController.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import User from '../models/User';
2+
3+
class UserController {
4+
async index(request, response) {
5+
const users = await User.find();
6+
7+
return response.json(users);
8+
}
9+
10+
async find(request, response) {
11+
const { id } = request.params;
12+
const result = await User.find({ where: { id } });
13+
const user = result[0];
14+
15+
if (!user)
16+
return response.status(400).json({ error: 'User not found!' });
17+
18+
return response.json(user);
19+
}
20+
21+
async create(request, response) {
22+
const { name, email } = request.body;
23+
const result = await User.find({ where: { email } });
24+
const userFoundByEmail = result[0];
25+
26+
if (userFoundByEmail)
27+
return response.status(400).json({ error: 'Email already exists!' });
28+
29+
const user = await User.create({ name, email });
30+
31+
return response.status(201).json(user);
32+
}
33+
34+
async update(request, response) {
35+
const { id } = request.params;
36+
const { name, email } = request.body;
37+
let result = await User.find({ where: { id: Number(id) } });
38+
const user = result[0];
39+
40+
if (!user)
41+
return response.status(400).json({ error: 'User not found!' });
42+
43+
result = await User.find({ where: { email } });
44+
const userFoundByEmail = result[0];
45+
46+
if (userFoundByEmail && userFoundByEmail.id !== Number(id))
47+
return response.status(400).json({ error: 'Email already exists!' });
48+
49+
await User.update({ name, email }, { where: { id } });
50+
51+
return response.status(204).send();
52+
}
53+
54+
async delete(request, response) {
55+
const { id } = request.params;
56+
const result = await User.find({ where: { id } });
57+
const user = result[0];
58+
59+
if (!user)
60+
return response.status(400).json({ error: 'User not found!' });
61+
62+
await User.delete({ where: { id } });
63+
return response.status(204).send();
64+
}
65+
}
66+
67+
export default new UserController();

src/models/User.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { connection as database } from '../config/database';
2+
3+
class User {
4+
async find(filters) {
5+
let query = 'SELECT * FROM users';
6+
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 users = result.rows;
21+
22+
return users;
23+
}
24+
25+
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 users (${fields.join(', ')}) VALUES (${values.join(', ')}) RETURNING *`;
44+
const result = await database.query(query);
45+
const user = result.rows[0];
46+
47+
return user;
48+
}
49+
50+
async update(data, filters) {
51+
const fieldsToUpdate = [];
52+
53+
Object.keys(data).forEach(field => {
54+
fieldsToUpdate.push(`${field} = '${data[field]}'`);
55+
});
56+
57+
let query = `UPDATE users 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;
73+
}
74+
75+
async delete(filters) {
76+
let query = 'DELETE FROM users';
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+
});
89+
90+
await database.query(query);
91+
return;
92+
}
93+
}
94+
95+
export default new User();

src/routes/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { Router } from 'express';
2+
import { router as usersRouter } from './usersRoutes';
23

34
const router = Router();
45

6+
router.use('/users', usersRouter);
7+
58
export { router };

src/routes/usersRoutes.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Router } from 'express';
2+
import UserController from '../controllers/UserController';
3+
4+
const router = Router();
5+
6+
router.get('/', UserController.index);
7+
router.post('/', UserController.create);
8+
router.get('/:id', UserController.find);
9+
router.put('/:id', UserController.update);
10+
router.delete('/:id', UserController.delete);
11+
12+
export { router };

0 commit comments

Comments
 (0)