@tasolutions/express-core
Version:
All libs for express
207 lines (175 loc) • 12.8 kB
JavaScript
//crud.js
const express = require('express');
const _ = require('lodash');
const actionsDefault = ['CREATE', 'LIST', 'DETAIL', 'UPDATE', 'DELETE', 'COUNT', 'EXPORT', 'DOCUMENT'];
const actionList = require('./actionList');
const { create, readMany, readManyPaginate, update, getByIds, readOne, count, remove, exportToExcel } = require('../core/crudJWT');
const {
documentList,
documentCreate,
documentGenerate,
documentPreview,
documentReview,
documentExportMedias,
documentExportByRecordAndTemplate,
documentExportByRecordAndKey,
documentExportByRecordAndKeyOrId,
documentGetExistingFile
} = require('../core/modules/document/services');
module.exports = (Collection, auth = false, configs = { actions: actionsDefault, onlyOwner: false, onlyAdminOwner: false, isFilterMerchant: true, includeFields: [], query: false, sort: false }) => {
// ======
// Routes
// ======
let router = express.Router();
const actions = configs.actions ? configs.actions : actionsDefault;
const path = configs.path;
if (auth && actions) {
if (actions.includes('CREATE')) {
addActionToList(Collection, 'CREATE', 'POST', path);
router.post('', setAction(Collection, 'CREATE'), auth, (req, res) => create(req, res, Collection, configs));
}
if (actions.includes('LIST')) {
addActionToList(Collection, 'LIST', 'GET', `${path}/paginate`);
router.get('/paginate', setAction(Collection, 'LIST'), auth, (req, res) => readManyPaginate(req, res, Collection, configs));
addActionToList(Collection, 'LIST', 'GET', path);
router.get('', setAction(Collection, 'LIST'), auth, (req, res) => readMany(req, res, Collection, configs));
}
if (actions.includes('UPDATE')) {
addActionToList(Collection, 'UPDATE', 'PUT', `${path}/:_id`);
router.put('/:_id', setAction(Collection, 'UPDATE'), auth, (req, res) => update(req, res, Collection, configs));
}
if (actions.includes('DETAIL')) {
addActionToList(Collection, 'DETAIL', 'POST', `${path}/find-in-ids`);
router.post('/find-in-ids', setAction(Collection, 'DETAIL'), auth, (req, res) => getByIds(req, res, Collection, configs));
addActionToList(Collection, 'DETAIL', 'GET', `${path}/:_id`);
router.get('/:_id', setAction(Collection, 'DETAIL'), auth, (req, res) => readOne(req, res, Collection, configs));
}
if (actions.includes('DELETE')) {
addActionToList(Collection, 'DELETE', 'DELETE', `${path}/:_id`);
router.delete('/:_id', setAction(Collection, 'DELETE'), auth, (req, res) => remove(req, res, Collection, configs));
}
if (actions.includes('COUNT')) {
addActionToList(Collection, 'COUNT', 'GET', `${path}/count`);
router.get('/count', setAction(Collection, 'COUNT'), auth, (req, res) => count(req, res, Collection, configs));
}
if (actions.includes('EXPORT')) {
addActionToList(Collection, 'EXPORT', 'GET', `${path}/export`);
router.get('/export', setAction(Collection, 'EXPORT'), auth, (req, res) => exportToExcel(req, res, Collection, configs));
}
if (actions.includes('DOCUMENT')) {
addActionToList(Collection, 'DOCUMENT', 'POST', `${path}/document/templates`);
router.post('/document/templates', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentCreate(req, res, Collection, configs));
addActionToList(Collection, 'DOCUMENT', 'PUT', `${path}/document/templates/:_id`);
router.put('/document/templates/:_id', setAction(Collection, 'DOCUMENT'), auth, (req, res) => update(req, res, Collection, { is_docs_template: true }));
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/document/templates`);
router.get('/document/templates', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentList(req, res, Collection, configs));
// Thêm API preview - chỉ hiển thị dữ liệu đã xử lý mà không tạo file
addActionToList(Collection, 'DOCUMENT', 'POST', `${path}/document/templates/:_id/preview`);
router.post('/document/templates/:_id/preview', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentPreview(req, res, Collection, configs));
// API review - tạo file thực tế để xem trước
addActionToList(Collection, 'DOCUMENT', 'POST', `${path}/document/templates/:_id/review`);
router.post('/document/templates/:_id/review', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentReview(req, res, Collection, configs));
// API generate - tạo file cho nhiều bản ghi
addActionToList(Collection, 'DOCUMENT', 'POST', `${path}/document/templates/:_id/generate`);
router.post('/document/templates/:_id/generate', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentGenerate(req, res, Collection, configs));
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/document/medias/paginate`);
router.get('/document/medias/paginate', setAction(Collection, 'DOCUMENT'), auth, (req, res) => readManyPaginate(req, res, Collection, { is_docs_media: true }));
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/document/medias`);
router.get('/document/medias', setAction(Collection, 'DOCUMENT'), auth, (req, res) => readMany(req, res, Collection, { is_docs_media: true }));
// Thêm API mới để export các file media được nối lại
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/document/medias/export`);
router.get('/document/medias/export', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentExportMedias(req, res, Collection, { is_docs_media: true }));
// API export gộp: theo record ID và templateId hoặc templateKey
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/:_id/templates/:_templateKeyOrId/export`);
router.get('/:_id/templates/:_templateKeyOrId/export', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentExportByRecordAndKeyOrId(req, res, Collection));
// (Giữ lại route cũ cho backward compatibility)
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/:_id/templates/:_templateId/export`);
router.get('/:_id/templates/:_templateId/export', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentExportByRecordAndTemplate(req, res, Collection));
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/:_id/templates/key/:_templateKey/export`);
router.get('/:_id/templates/key/:_templateKey/export', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentExportByRecordAndKey(req, res, Collection));
}
} else if (actions) {
if (actions.includes('CREATE')) {
addActionToList(Collection, 'CREATE', 'POST', path);
router.post('', (req, res) => create(req, res, Collection, configs));
}
if (actions.includes('UPDATE')) {
addActionToList(Collection, 'UPDATE', 'PUT', `${path}/:_id`);
router.put('/:_id', (req, res) => update(req, res, Collection, configs));
}
if (actions.includes('LIST')) {
addActionToList(Collection, 'LIST', 'GET', `${path}/paginate`);
router.get('/paginate', (req, res) => readManyPaginate(req, res, Collection, configs));
addActionToList(Collection, 'LIST', 'GET', path);
router.get('', (req, res) => readMany(req, res, Collection, configs));
}
if (actions.includes('DETAIL')) {
addActionToList(Collection, 'DETAIL', 'POST', `${path}/find-in-ids`);
router.post('/find-in-ids', (req, res) => getByIds(req, res, Collection, configs));
addActionToList(Collection, 'DETAIL', 'GET', `${path}/:_id`);
router.get('/:_id', (req, res) => readOne(req, res, Collection, configs));
}
if (actions.includes('DELETE')) {
addActionToList(Collection, 'DELETE', 'DELETE', `${path}/:_id`);
router.delete('/:_id', (req, res) => remove(req, res, Collection, configs));
}
if (actions.includes('COUNT')) {
addActionToList(Collection, 'COUNT', 'GET', `${path}/count`);
router.get('/count', (req, res) => count(req, res, Collection, configs));
}
if (actions.includes('EXPORT')) {
addActionToList(Collection, 'EXPORT', 'GET', `${path}/export`);
router.get('/export', (req, res) => exportToExcel(req, res, Collection, configs));
}
if (actions.includes('DOCUMENT')) {
addActionToList(Collection, 'DOCUMENT', 'POST', `${path}/document/templates`);
router.post('/document/templates', (req, res) => documentCreate(req, res, Collection, configs));
addActionToList(Collection, 'DOCUMENT', 'PUT', `${path}/document/templates/:_id`);
router.put('/document/templates/:_id', (req, res) => update(req, res, Collection, { is_docs_template: true }));
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/document/templates`);
router.get('/document/templates', (req, res) => documentList(req, res, Collection, configs));
// Thêm API preview - chỉ hiển thị dữ liệu đã xử lý mà không tạo file
addActionToList(Collection, 'DOCUMENT', 'POST', `${path}/document/templates/:_id/preview`);
router.post('/document/templates/:_id/preview', (req, res) => documentPreview(req, res, Collection));
// API review - tạo file thực tế để xem trước
addActionToList(Collection, 'DOCUMENT', 'POST', `${path}/document/templates/:_id/review`);
router.post('/document/templates/:_id/review', (req, res) => documentReview(req, res, Collection));
// API generate - tạo file cho nhiều bản ghi
addActionToList(Collection, 'DOCUMENT', 'POST', `${path}/document/templates/:_id/generate`);
router.post('/document/templates/:_id/generate', (req, res) => documentGenerate(req, res, Collection, configs));
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/document/medias/paginate`);
router.get('/document/medias/paginate', (req, res) => readManyPaginate(req, res, Collection, { is_docs_media: true }));
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/document/medias`);
router.get('/document/medias', (req, res) => readMany(req, res, Collection, { is_docs_media: true }));
// Thêm API mới để export các file media được nối lại
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/document/medias/export`);
router.get('/document/medias/export', (req, res) => documentExportMedias(req, res, Collection, { is_docs_media: true }));
// API export gộp: theo record ID và templateId hoặc templateKey
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/:_id/templates/:_templateKeyOrId/export`);
router.get('/:_id/templates/:_templateKeyOrId/export', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentExportByRecordAndKeyOrId(req, res, Collection));
// (Giữ lại route cũ cho backward compatibility)
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/:_id/templates/:_templateId/export`);
router.get('/:_id/templates/:_templateId/export', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentExportByRecordAndTemplate(req, res, Collection));
addActionToList(Collection, 'DOCUMENT', 'GET', `${path}/:_id/templates/key/:_templateKey/export`);
router.get('/:_id/templates/key/:_templateKey/export', setAction(Collection, 'DOCUMENT'), auth, (req, res) => documentExportByRecordAndKey(req, res, Collection));
}
}
return router;
};
const setAction = (Collection, action) => {
return async (req, res, next) => {
req.key = `${Collection.modelName}_${action}`.toUpperCase();
next();
};
};
const addActionToList = (Collection, action, method, path) => {
const controllerKey = Collection.modelName.toUpperCase();
actionList.push({
controller: controllerKey,
controller_name: _.startCase(controllerKey.toLowerCase()),
key: `${Collection.modelName}_${action}`.toUpperCase(),
name: _.startCase(`${Collection.modelName} ${action}`.toLocaleLowerCase()),
path,
method
});
};