Skip to content

Commit f53d0fd

Browse files
author
Victor
committed
feat: add inheritance concept on user and product model classes
1 parent 5847d21 commit f53d0fd

3 files changed

Lines changed: 112 additions & 90 deletions

File tree

src/models/Model.js

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { connection as database } from '../config/database';
2+
3+
class Model {
4+
constructor(table) {
5+
this.table = table;
6+
}
7+
8+
async find(filters) {
9+
let query = `SELECT * FROM ${this.table}`;
10+
11+
if (filters)
12+
Object.keys(filters).forEach(filter => {
13+
query += ` ${filter}`;
14+
15+
Object.keys(filters[filter]).forEach(field => {
16+
if (filters[filter][field] !== null)
17+
query += ` ${field} = '${filters[filter][field]}'`;
18+
else
19+
query += ` ${field} = null`;
20+
});
21+
});
22+
23+
const result = await database.query(query);
24+
const products = result.rows;
25+
26+
return products;
27+
}
28+
29+
async create(data) {
30+
const fields = [];
31+
const values = [];
32+
33+
Object.keys(data).forEach(field => {
34+
fields.push(field);
35+
36+
if (data[field] !== null) {
37+
if (Array.isArray(data[field])) {
38+
const newArray = data[field].map(item => `'${item}'`);
39+
40+
values.push(`ARRAY[${newArray}]`);
41+
} else
42+
values.push(`'${data[field]}'`);
43+
} else
44+
values.push('null');
45+
});
46+
47+
const query = `INSERT INTO ${this.table} (${fields.join(', ')}) VALUES (${values.join(', ')}) RETURNING *`;
48+
const result = await database.query(query);
49+
const user = result.rows[0];
50+
51+
return user;
52+
}
53+
54+
async update(data, filters) {
55+
const fieldsToUpdate = [];
56+
57+
Object.keys(data).forEach(field => {
58+
fieldsToUpdate.push(`${field} = '${data[field]}'`);
59+
});
60+
61+
let query = `UPDATE ${this.table} SET ${fieldsToUpdate.join(', ')}`;
62+
63+
if (filters)
64+
Object.keys(filters).forEach(filter => {
65+
query += ` ${filter.toUpperCase()}`;
66+
67+
Object.keys(filters[filter]).forEach(field => {
68+
if (filters[filter][field] !== null)
69+
query += ` ${field} = '${filters[filter][field]}'`;
70+
else
71+
query += ` ${field} = null`;
72+
});
73+
});
74+
75+
await database.query(query);
76+
return;
77+
}
78+
79+
async delete(filters) {
80+
let query = `DELETE FROM ${this.table}`;
81+
82+
if (filters)
83+
Object.keys(filters).forEach(filter => {
84+
query += ` ${filter.toUpperCase()}`;
85+
86+
Object.keys(filters[filter]).forEach(field => {
87+
if (filters[filter][field] !== null)
88+
query += ` ${field} = '${filters[filter][field]}'`;
89+
else
90+
query += ` ${field} = null`;
91+
});
92+
});
93+
94+
await database.query(query);
95+
return;
96+
}
97+
}
98+
99+
export { Model };

src/models/Product.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Model } from "./Model";
2+
3+
class Product extends Model {
4+
constructor() {
5+
super('products');
6+
}
7+
}
8+
9+
export default new Product();

src/models/User.js

Lines changed: 4 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,8 @@
1-
import { connection as database } from '../config/database';
1+
import { Model } from './Model';
22

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;
3+
class User extends Model {
4+
constructor() {
5+
super('users');
926
}
937
}
948

0 commit comments

Comments
 (0)