UNPKG

ksmf

Version:

Modular Microframework for create minimalistic CLI/Web application or REST API

249 lines (235 loc) 7.41 kB
/** * @author Antonio Membrides Espinosa * @email tonykssa@gmail.com * @date 21/05/2022 * @copyright Copyright (c) 2020-2030 * @license GPL * @version 1.0 **/ const Controller = require('../plugin/Controller'); class DataController extends Controller { /** * @type {Object|null} */ helper = null; /** * @type {Console|null} */ logger = null; /** * @type {String} */ srvName; /** * @description configure action * @param {Object} cfg * @param {String} [cfg.modelName] * @param {String} [cfg.srvName] * @param {Object} [cfg.srv] * @returns {DataController} self */ configure(cfg) { this.modelName = cfg?.modelName || this.modelName || ""; this.srvName = cfg?.srvName || this.srvName || this.modelName || ""; this.srv = cfg?.srv || this.srv || null; return this; } async init() { //... Define logger service as global for his controller this.logger = await this.helper.get('logger'); //... Define user service as global for his controller this.srv = typeof this.srv === "object" ? this.srv : (await this.helper.get(typeof this.srv === "string" ? this.srv : { name: this.srvName, path: 'service', module: this.module, moduleType: this.module._?.type, dependency: { dao: 'dao', helper: 'helper' } })); this.initValidations(); } /** * @description define groups of validations based on a certain action */ initValidations() { // middlewares } /** * @description get the DTO list * @param {Object} req * @param {Object} res * @example {{page?: Number; size?: Number; total?: Number; data?: Object[] }} */ async list(req, res) { const query = this.srv?.extract(req.query); try { query.flow = req.flow; const data = await this.srv.select(query); res.json(data); } catch (error) { this.logger?.error({ flow: req.flow, src: this.module + ":Controller:Data:list", error: error.message || error, data: query }); res.status(500).end(); } } /** * @description get the DTO by id * @param {Object} req * @param {Object} res * @returns {Promise<any>} DTO */ async select(req, res) { let params; try { params = this.srv.extract(req.query); params.query.id = req.params['id']; params.flow = req.flow; const data = await this.srv.select(params); res.json(data); } catch (error) { this.logger?.error({ flow: req.flow, src: this.module + ":Controller:Data:select", error: error.message || error, data: params }); res.status(500).end(); } } /** * @description create new DTO * @param {Object} req * @param {Object} res * @returns {Promise<any>} DTO */ async insert(req, res) { const config = { flow: req.flow }; const payload = req.body; try { const data = await this.srv.insert({ data: payload }, config); this.logger?.info({ flow: req.flow, src: this.module + ":Controller:Data:insert", data }); res.status(config?.action === "create" ? 201 : 200); res.json(data); } catch (error) { this.logger?.error({ flow: req.flow, src: this.module + ":Controller:Data:insert", error: error.message || error, data: payload }); res.status(500).end(); } } /** * @description update user by id * @param {Object} req * @param {Object} res * @returns {Promise<any>} DTO */ async update(req, res) { const config = { flow: req.flow }; const params = this.srv?.extract(req.query); params.query.id = req.body.id || req.params['id']; params.data = req.body; try { const data = await this.srv.update(params, config); this.logger?.info({ flow: req.flow, src: this.module + ":Controller:Data:update", data }); res.status(config?.action === "create" ? 201 : 200); res.json(data); } catch (error) { this.logger?.error({ flow: req.flow, src: this.module + ":Controller:Data:update", error: error.message || error, data: params }); res.status(500).end(); } } /** * @description update user by id * @param {Object} req * @param {Object} res * @returns {Promise<any>} DTO */ async clone(req, res) { const config = { flow: req.flow }; const params = this.srv?.extract(req.query); const keypid = this.srv.getPKs()[0] || "id"; const target = { where: { [keypid]: req.params['id'] } } params.data = req.body; params?.strict && (config.strict = params.strict); try { const data = await this.srv.clone(target, params, config); this.logger?.info({ flow: req.flow, src: this.module + ":Controller:Data:clone", data }); res.json(data); } catch (error) { this.logger?.error({ flow: req.flow, src: this.module + ":Controller:Data:clone", error: error.message || error, data: { params, target } }); res.status(500).end(); } } /** * @description delete user by id * @param {Object} req * @param {Object} res * @returns {Promise<any>} DTO */ async delete(req, res) { const config = { flow: req.flow }; const params = this.srv?.extract(req.query); params.query.id = req.body.id || req.params['id']; try { const data = await this.srv.delete(params, config); this.logger?.info({ flow: req.flow, src: this.module + ":Controller:Data:delete", data }); res.json(data); } catch (error) { this.logger?.error({ flow: req.flow, src: this.module + ":Controller:Data:delete", error: error.message || error, data: params }); res.status(500).end(); } } } module.exports = DataController;