Я пытаюсь использовать классы ES6 для создания моделей данных (из базы данных MySQL) в API, который я создаю. Я предпочитаю не использовать библиотеку ORM/ODM, так как это будет очень простой и простой API. Но я изо всех сил пытаюсь понять, как определить эти модели.
Мои объекты данных (это лишь некоторые упрощенные примеры):
КЛИЕНТ
Модель данных
id
name
groupId
status (enum of: active, suspended, closed)
Частные методы
_getState(status) {
var state = (status == 'active' ? 'good' : 'bad');
return state;
}
Запросы
Я хочу иметь возможность:
-
findById: предоставление единственного customer.id, возврат данных для этого конкретного клиента, т.е.
SELECT * FROM customers WHERE id =?
-
findByGroupId: Предоставление group.id возвращает данные для всех клиентов (в массиве объектов), принадлежащих к этой группе, то есть
SELECT * FROM customers WHERE groupId =?
Полезная нагрузка
Для каждого объекта клиента я хочу вернуть JSON следующим образом:
findById(1);
:
[{
"id" : 1,
"name" : "John Doe",
"groupId" : 2,
"status" : "active",
"state" : "good"
}]
findByGroupId(2);
:
[{
"id" : 1,
"name" : "John Doe",
"groupId" : 2,
"status" : "active",
"state" : "good"
},
{
"id" : 4,
"name" : "Pete Smith",
"groupId" : 2,
"status" : "suspended",
"state" : "bad"
}]
GROUP
Модель данных
id
title
Запросы
Я хочу иметь возможность:
- findById: Предоставление единственной group.id возвращает данные для этой конкретной группы, то есть
SELECT * FROM groups WHERE id =?
Полезная нагрузка
Для каждого объекта группы я хочу вернуть JSON следующим образом:
findById(2);
:
{
"id" : 2,
"title" : "This is Group 2",
"customers" : [{
"id" : 1,
"name" : "John Doe",
"groupId" : 2,
"status" : "active",
"state" : "good"
},
{
"id" : 4,
"name" : "Pete Smith",
"groupId" : 2,
"status" : "suspended",
"state" : "bad"
}]
}
Требования:
- Необходимо использовать классы ES6
- Каждая модель в своем собственном файле (например,
customer.js
) для экспорта
Вопросов:
Мои главные вопросы:
- Где я могу определить структуру данных, включая поля, требующие преобразования данных, используя частные методы (например,
_getState()
) - Должны ли
findById
,findByGroupId
и т.д. Определяться в рамках класса? Или, если это по отдельным методам (в том же файле, что и класс), что бы создать экземпляр объекта? - Как я должен рассматривать случай, когда один объект является дочерним по отношению к другому, например, возвращая объекты Customer, принадлежащие объекту Group, в виде массива объектов в группе
findById
? - Где должны быть определены SQL-запросы, которые будут подключаться к БД? В
getById
,getByGroupId
и т.д.?
ОБНОВИТЬ!!
Это то, что я придумал - (было бы здорово, если бы кто-то мог рассмотреть и прокомментировать):
Модель КЛИЕНТА
'use strict';
class Cust {
constructor (custData) {
this.id = custData.id;
this.name = custData.name;
this.groupId = custData.groupId;
this.status = custData.status;
this.state = this._getState(custData.status);
}
_getState(status) {
let state = (status == 'active' ? 'good' : 'bad');
return state;
}
}
exports.findById = ((id) => {
return new Promise ((resolve, reject) => {
let custData = 'do the MySQL query here';
let cust = new Cust (custData);
let Group = require(appDir + process.env.PATH_API + process.env.PATH_MODELS + 'group');
Group.findById(cust.groupId).then(
(group) => {
cust.group = group;
resolve (cust)
},
(err) => {
resolve (cust);
}
);
});
});
Модель GROUP
'use strict';
class Group {
constructor (groupData) {
this.id = groupData.id;
this.title = groupData.title;
}
}
exports.findById = ((id) => {
return new Promise ((resolve, reject) => {
let groupData = 'do the MySQL query here';
if (id != 2){
reject('group - no go');
};
let group = new Group (groupData);
resolve (group);
});
});
CUSTOMER Controller (где экземпляр модели клиента)
'use strict';
var Cust = require(appDir + process.env.PATH_API + process.env.PATH_MODELS + 'cust');
class CustController {
constructor () {
}
getCust (req, res) {
Cust.findById(req.params.id).then(
(cust) => {
res(cust);
},
(err) => {
res(err);
}
)
}
}
module.exports = CustController;
Кажется, это работает хорошо, и я смог использовать Class
, Promise
и let
сделать его более дружественным к ES6.
Поэтому я хотел бы получить некоторый вклад в мой подход. Кроме того, я правильно использую export
и required
функции в этом контексте?