UNPKG

@tasolutions/express-core

Version:
207 lines (175 loc) 12.8 kB
//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 }); };