From c22a8d0fbec99d223f130e909b416ce9df499ce4 Mon Sep 17 00:00:00 2001 From: Pau Date: Tue, 8 Apr 2025 13:42:22 +0200 Subject: [PATCH] added report types and coordinates model and controller --- .../resource_types/coordinatesController.js | 146 ++++++++++++++++++ .../resource_types/reportTypesController.js | 137 ++++++++++++++++ src/models/resource_types/coordinatesModel.js | 63 ++++++++ src/models/resource_types/reportTypesModel.js | 63 ++++++++ 4 files changed, 409 insertions(+) create mode 100644 src/controllers/resource_types/coordinatesController.js create mode 100644 src/controllers/resource_types/reportTypesController.js create mode 100644 src/models/resource_types/coordinatesModel.js create mode 100644 src/models/resource_types/reportTypesModel.js diff --git a/src/controllers/resource_types/coordinatesController.js b/src/controllers/resource_types/coordinatesController.js new file mode 100644 index 0000000..57d15da --- /dev/null +++ b/src/controllers/resource_types/coordinatesController.js @@ -0,0 +1,146 @@ +import { + getCoordinatesListModel, + countCoordinatesListModel, + insertCoordinatesModel, + modifyCoordinatesModel, + softDeleteCoordinatesModel +} from "../../models/resource_types/coordinatesModel"; +import { error404 } from "../../utils/errors"; +import { sendResponseNotFound } from "../../utils/responses"; +import { noResults } from "../../validators/result-validators"; +import mysql from "../../adapters/mysql.js"; +import { errorHandler } from "../../utils/errors"; + +const getCoordinatesListController = (req, res, next, config) => { + const conn = mysql.start(config) + + Promise.all([ + getCoordinatesListModel({...req.query, conn}), + countCoordinatesListModel({...req.query, conn}) + ]) + .then(([getResults, countResults]) => { + next({ + _data: {coordinates: getResults}, + _page: { + totalElements: countResults, + limit: req.query.limit || 100, + page: req.query.page || (countResults && 1) || 0 + } + }) + }) + .catch((err) => { + const error = errorHandler(err, config.environment) + return res.status(error.code).json(error) + }) + .finally(() => { + mysql.end(conn) + }) +} + +const getCoordinatesByUuidController = (req, res, next, config) => { + const uuid_coordinates = req.params.uuid + const conn = mysql.start(config) + + getCoordinatesListModel({ uuid_coordinates, conn }) + .then((response) => { + if (noResults(response)) { + const err = error404() + const error = errorHandler(err, config.environment) + return sendResponseNotFound(res, error) + } + + const result = { + _data: { + coordinates: response + } + } + next(result) + }) + .catch((err) => { + const error = errorHandler(err, config.environment) + res.status(error.code).json(error) + }) + .finally(() => { + mysql.end(conn) + }) +} + +const postCoordinatesController = (req, res, next, config) => { + const conn = mysql.start(config) + + insertCoordinatesModel({ ...req.body, conn }) + .then((response) => { + const result = { + _data: { + coordinates: response + } + } + next(result) + }) + .catch((err) => { + const error = errorHandler(err, config.environment) + return res.status(error.code).json(error) + }) + .finally(() => { + mysql.end(conn) + }) +} + +const putCoordinatesController = (req, res, next, config) => { + const uuid_coordinates = req.params.uuid + const conn = mysql.start(config) + + modifyCoordinatesModel({ ...req.body, uuid: uuid_coordinates, conn }) + .then((response) => { + const result = { + _data: { + coordinates: response + } + } + next(result) + }) + .catch((err) => { + const error = errorHandler(err, config.environment) + return res.status(error.code).json(error) + }) + .finally(() => { + mysql.end(conn) + }) +} + +const deleteCoordinatesController = (req, res, next, config) => { + const uuid_coordinates = req.params.uuid + const conn = mysql.start(config) + + softDeleteCoordinatesModel({ uuid: uuid_coordinates, conn }) + .then((response) => { + if (noResults(response)) { + const err = error404() + const error = errorHandler(err, config.environment) + return sendResponseNotFound(res, error) + } + + const result = { + _data: { + coordinates: response + } + } + next(result) + + }) + .catch((err) => { + const error = errorHandler(err, config.environment) + return res.status(error.code).json(error) + }) + .finally(() => { + mysql.end(conn) + }) +} + +export { + getCoordinatesListController, + getCoordinatesByUuidController, + postCoordinatesController, + putCoordinatesController, + deleteCoordinatesController +} diff --git a/src/controllers/resource_types/reportTypesController.js b/src/controllers/resource_types/reportTypesController.js new file mode 100644 index 0000000..09959c8 --- /dev/null +++ b/src/controllers/resource_types/reportTypesController.js @@ -0,0 +1,137 @@ +import mysql from "../../adapters/mysql.js"; +import { errorHandler } from "../../utils/errors.js"; +import { error404 } from "../../utils/errors.js"; +import { sendResponseNotFound } from "../../utils/responses.js"; +import { noResults } from "../../validators/result-validators.js"; +import { + getReportTypesListModel, + countReportTypesListModel, + insertReportTypesListModel, + modifyReportTypesListModel, + softDeleteReportTypesListModel +} from "../../models/resource_types/reportTypesModel.js"; + +const getReportTypesListController = (req, res, next, config) => { + const conn = mysql.start(config); + + Promise.all([ + getReportTypesListModel({ ...req.query, conn }), + countReportTypesListModel({ ...req.query, conn }) + ]) + .then(([getResults, countResults]) => { + next({ + _data: { report_types: getResults }, + _page: { + totalElements: countResults, + limit: req.query.limit || 100, + page: req.query.page || (countResults && 1) || 0 + } + }); + }) + .catch((err) => { + const error = errorHandler(err, config.environment); + return res.status(error.code).json(error); + }) + .finally(() => { + mysql.end(conn); + }); +} + +const getReportTypesByUuidController = (req, res, next, config) => { + const uuid_report_type = req.params.uuid; + const conn = mysql.start(config); + + getReportTypesListModel({ uuid: uuid_report_type, conn }) + .then((response) => { + if (noResults(response)) { + const err = error404(); + const error = errorHandler(err, config.environment); + return sendResponseNotFound(res, error); + } + + const result = { + _data: { + report_types: response + } + } + next(result); + }) + .catch((err) => { + const error = errorHandler(err, config.environment); + return res.status(error.code).json(error); + }) + .finally(() => { + mysql.end(conn); + }); +} + +const postReportTypesController = (req, res, next, config) => { + const conn = mysql.start(config); + const created_by = req.auth.user || null + + insertReportTypesListModel({ ...req.body, created_by, conn }) + .then((response) => { + const result = { + _data: { + report_types: response + } + } + next(result); + }) + .catch((err) => { + const error = errorHandler(err, config.environment); + return res.status(error.code).json(error); + }) + .finally(() => { + mysql.end(conn); + }); +} + +const putReportTypesController = (req, res, next, config) => { + const conn = mysql.start(config); + const uuid_report_type = req.params.uuid; + + modifyReportTypesListModel({ ...req.body, uuid: uuid_report_type, conn }) + .then((response) => { + const result = { + _data: { + report_types: response + } + } + next(result); + }) + .catch((err) => { + const error = errorHandler(err, config.environment); + return res.status(error.code).json(error); + }) + .finally(() => { + mysql.end(conn); + }); +} + +const softDeleteReportTypesController = (req, res, next, config) => { + const conn = mysql.start(config); + const uuid_report_type = req.params.uuid; + const deleted_by = req.auth.user || null + + softDeleteReportTypesListModel({ uuid: uuid_report_type, deleted_by, conn }) + .then(() => { + const result = {} + next(result); + }) + .catch((err) => { + const error = errorHandler(err, config.environment); + return res.status(error.code).json(error); + }) + .finally(() => { + mysql.end(conn); + }); +} + +export { + getReportTypesListController, + getReportTypesByUuidController, + postReportTypesController, + putReportTypesController, + softDeleteReportTypesController +} \ No newline at end of file diff --git a/src/models/resource_types/coordinatesModel.js b/src/models/resource_types/coordinatesModel.js new file mode 100644 index 0000000..fef13b9 --- /dev/null +++ b/src/models/resource_types/coordinatesModel.js @@ -0,0 +1,63 @@ +import { + getCoordinatesListQuery, + countCoordinatesListQuery, + insertCoordinatesQuery, + updateCoordinatesQuery, + softDeleteCoordinatesQuery +} from "../../repositories/resource_types/coordinatesRepository"; +import { randomUUID as uuidv4 } from 'node:crypto' +import dayjs from 'dayjs' +import mysql from '../../adapters/mysql.js' +import { error404 } from '../../utils/errors.js' + +const getCoordinatesListModel = ({conn, ...rest}) => { + const now = dayjs.utc().format('YYYY-MM-DD HH:mm:ss') + const paramsToSearch = {...rest, now} + return mysql + .execute(getCoordinatesListQuery(paramsToSearch), conn, paramsToSearch) + .then(queryResult => queryResult.map(({id, created, deleted, createdBy, deletedBy, ...resultFiltered}) => resultFiltered)) +} + +const countCoordinatesListModel = ({conn, ...rest}) => { + const now = dayjs.utc().format('YYYY-MM-DD HH:mm:ss') + const paramsToSearch = {...rest, now} + return mysql + .execute(countCoordinatesListQuery(paramsToSearch), conn, paramsToSearch) + .then(results => results[0].count) +} + +const insertCoordinatesModel = ({conn, ...params}) => { + const now = dayjs.utc().format('YYYY-MM-DD HH:mm:ss') + const uuid = uuidv4() + return mysql + .execute(insertCoordinatesQuery({...params, uuid, now}), conn, {...params, uuid, now}) + .then(queryResult => queryResult[1].map(({id, created, deleted, createdBy, deletedBy, ...resultFiltered}) => resultFiltered)) +} + +const modifyCoordinatesModel = ({conn, ...params}) => { + return mysql + .execute(updateCoordinatesQuery(params), conn, params) + .then(queryResult => { + const deletedItem = queryResult[1].find(item => item.deleted !== null); + + if (deletedItem) { + throw error404() + } + return queryResult[1].map(({id, created, deleted, createdBy, deletedBy, ...resultFiltered}) => resultFiltered) + }) +} + +const softDeleteCoordinatesModel = ({uuid, deleted, deletedBy, conn}) => { + const deletedData = deleted ? dayjs.utc(deleted).format('YYYY-MM-DD HH:mm:ss') : dayjs.utc().format('YYYY-MM-DD HH:mm:ss') + const params = {uuid, deletedBy, deleted: deletedData} + return mysql + .execute(softDeleteCoordinatesQuery(params), conn, params) +} + +export { + getCoordinatesListModel, + countCoordinatesListModel, + insertCoordinatesModel, + modifyCoordinatesModel, + softDeleteCoordinatesModel +} diff --git a/src/models/resource_types/reportTypesModel.js b/src/models/resource_types/reportTypesModel.js new file mode 100644 index 0000000..a09b9cb --- /dev/null +++ b/src/models/resource_types/reportTypesModel.js @@ -0,0 +1,63 @@ +import { + getReportTypesListQuery, + countReportTypesListQuery, + insertReportTypesQuery, + updateReportTypesQuery, + softDeleteReportTypesQuery, +} from "../../repositories/resource_types/reportTypesRepository"; +import { randomUUID as uuidv4 } from 'node:crypto' +import dayjs from 'dayjs' +import mysql from '../../adapters/mysql.js' +import { error404 } from '../../utils/errors.js' + +const getReportTypesListModel = ({conn, ...rest}) => { + const now = dayjs.utc().format('YYYY-MM-DD HH:mm:ss') + const paramsToSearch = {...rest, now} + return mysql + .execute(getReportTypesListQuery(paramsToSearch), conn, paramsToSearch) + .then(queryResult => queryResult.map(({id, created, deleted, createdBy, deletedBy, ...resultFiltered}) => resultFiltered)) +} + +const countReportTypesListModel = ({conn, ...rest}) => { + const now = dayjs.utc().format('YYYY-MM-DD HH:mm:ss') + const paramsToSearch = {...rest, now} + return mysql + .execute(countReportTypesListQuery(paramsToSearch), conn, paramsToSearch) + .then(results => results[0].count) +} + +const insertReportTypesModel = ({conn, ...params}) => { + const now = dayjs.utc().format('YYYY-MM-DD HH:mm:ss') + const uuid = uuidv4() + return mysql + .execute(insertReportTypesQuery({...params, uuid, now}), conn, {...params, uuid, now}) + .then(queryResult => queryResult[1].map(({id, created, deleted, createdBy, deletedBy, ...resultFiltered}) => resultFiltered)) +} + +const modifyReportTypesModel = ({conn, ...params}) => { + return mysql + .execute(updateReportTypesQuery(params), conn, params) + .then(queryResult => { + const deletedItem = queryResult[1].find(item => item.deleted !== null); + + if (deletedItem) { + throw error404() + } + return queryResult[1].map(({id, created, deleted, createdBy, deletedBy, ...resultFiltered}) => resultFiltered) + }) +} + +const softDeleteReportTypesModel = ({uuid, deleted, deletedBy, conn}) => { + const deletedData = deleted ? dayjs.utc(deleted).format('YYYY-MM-DD HH:mm:ss') : dayjs.utc().format('YYYY-MM-DD HH:mm:ss') + const params = {uuid, deletedBy, deleted: deletedData} + return mysql + .execute(softDeleteReportTypesQuery(params), conn, params) +} + +export { + getReportTypesListModel, + countReportTypesListModel, + insertReportTypesModel, + modifyReportTypesModel, + softDeleteReportTypesModel +} \ No newline at end of file