added usersHasPlaces mvc to api

This commit is contained in:
Pau 2025-04-06 20:54:16 +02:00
parent e7df50e5b3
commit 027d8c7dee
3 changed files with 390 additions and 0 deletions

View File

@ -0,0 +1,230 @@
import {
getUserHasPlacesListModel,
countUserHasPlacesListModel,
insertUserHasPlacesModel,
modifyUserHasPlacesModel,
softDeleteUserHasPlacesModel
} from "../../models/resource_types/usersHasPlacesModel";
import { error404 } from "../../utils/errors.js"
import { sendResponseNotFound } from "../../utils/responses.js"
import { noResults } from "../../validators/result-validators.js"
import mysql from "../../adapters/mysql.js"
import { errorHandler } from "../../utils/errors.js"
const getUserHasPlacesListController = (req, res, next, config) => {
const conn = mysql.start(config)
Promise.all([
getUserHasPlacesListModel({...req.query, conn}),
countUserHasPlacesListModel({...req.query, conn})
])
.then(([getResults, countResults]) => {
next({
_data: {usersHasPlaces: 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 getUserHasPlacesByUuidController = (req, res, next, config) => {
const uuid_user_has_places = req.params.uuid
const conn = mysql.start(config)
getUserHasPlacesListModel({ uuid_user_has_places, conn })
.then((response) => {
if (noResults(response)) {
const err = error404()
const error = errorHandler(err, config.environment)
return sendResponseNotFound(res, error)
}
const result = {
_data: {
usersHasPlaces: response
}
}
next(result)
})
.catch((err) => {
const error = errorHandler(err, config.environment)
res.status(error.code).json(error)
})
.finally(() => {
mysql.end(conn)
})
}
const getUserHasPlacesByUserUuidController = (req, res, next, config) => {
const uuid_user = req.params.uuid
const conn = mysql.start(config)
getUserHasPlacesListModel({ uuid_user, conn })
.then((response) => {
if (noResults(response)) {
const err = error404()
const error = errorHandler(err, config.environment)
return sendResponseNotFound(res, error)
}
const result = {
_data: {
usersHasPlaces: response
}
}
next(result)
})
.catch((err) => {
const error = errorHandler(err, config.environment)
res.status(error.code).json(error)
})
.finally(() => {
mysql.end(conn)
})
}
const getUserHasPlacesByPlaceUuidController = (req, res, next, config) => {
const uuid_place = req.params.uuid
const conn = mysql.start(config)
getUserHasPlacesListModel({ uuid_place, conn })
.then((response) => {
if (noResults(response)) {
const err = error404()
const error = errorHandler(err, config.environment)
return sendResponseNotFound(res, error)
}
const result = {
_data: {
usersHasPlaces: response
}
}
next(result)
})
.catch((err) => {
const error = errorHandler(err, config.environment)
res.status(error.code).json(error)
})
.finally(() => {
mysql.end(conn)
})
}
const postUserHasPlacesController = (req, res, next, config) => {
const conn = mysql.start(config)
insertUserHasPlacesModel({...req.body, conn})
.then((response) => {
const result = {
_data: {
usersHasPlaces: response
}
}
next(result)
})
.catch((err) => {
const error = errorHandler(err, config.environment)
return res.status(error.code).json(error)
})
.finally(() => {
mysql.end(conn)
})
}
const putUserHasPlacesController = (req, res, next, config) => {
const conn = mysql.start(config)
modifyUserHasPlacesModel({...req.body, conn})
.then((response) => {
const result = {
_data: {
usersHasPlaces: response
}
}
next(result)
})
.catch((err) => {
const error = errorHandler(err, config.environment)
return res.status(error.code).json(error)
})
.finally(() => {
mysql.end(conn)
})
}
const deleteUserHasPlacesController = (req, res, next, config) => {
const conn = mysql.start(config)
const uuid_user_has_places = req.params.uuid
const deleted_by = req.auth.user || null
softDeleteUserHasPlacesModel({uuid_user_has_places, deleted_by, conn})
.then(() => {
next({})
})
.catch((err) => {
const error = errorHandler(err, config.environment)
return res.status(error.code).json(error)
})
.finally(() => {
mysql.end(conn)
})
}
const deleteUserHasPlacesByUserUuidController = (req, res, next, config) => {
const conn = mysql.start(config)
const uuid_user = req.params.uuid
const deleted_by = req.auth.user || null
softDeleteUserHasPlacesModel({uuid_user, deleted_by, conn})
.then(() => {
next({})
})
.catch((err) => {
const error = errorHandler(err, config.environment)
return res.status(error.code).json(error)
})
.finally(() => {
mysql.end(conn)
})
}
const deleteUserHasPlacesByPlaceUuidController = (req, res, next, config) => {
const conn = mysql.start(config)
const uuid_place = req.params.uuid
const deleted_by = req.auth.user || null
softDeleteUserHasPlacesModel({uuid_place, deleted_by, conn})
.then(() => {
next({})
})
.catch((err) => {
const error = errorHandler(err, config.environment)
return res.status(error.code).json(error)
})
.finally(() => {
mysql.end(conn)
})
}
export {
getUserHasPlacesListController,
getUserHasPlacesByUuidController,
getUserHasPlacesByUserUuidController,
getUserHasPlacesByPlaceUuidController,
postUserHasPlacesController,
putUserHasPlacesController,
deleteUserHasPlacesController,
deleteUserHasPlacesByUserUuidController,
deleteUserHasPlacesByPlaceUuidController
}

View File

@ -0,0 +1,60 @@
import { getUserHasPlacesListQuery, countUserHasPlacesListQuery, insertUserHasPlacesQuery, modifyUserHasPlacesQuery, softDeleteUserHasPlacesQuery
} from "../../repositories/resource_types/usersHasPlacesRepository";
import { randomUUID as uuidv4 } from 'node:crypto'
import dayjs from 'dayjs'
import mysql from '../../adapters/mysql.js'
import { error404 } from '../../utils/errors.js'
const getUserHasPlacesListModel = ({conn, ...rest}) => {
const now = dayjs.utc().format('YYYY-MM-DD HH:mm:ss')
const paramsToSearch = {...rest, now}
return mysql
.execute(getUserHasPlacesListQuery(paramsToSearch), conn, paramsToSearch)
.then(queryResult => queryResult.map(({id, created, deleted, createdBy, deletedBy, ...resultFiltered}) => resultFiltered))
}
const countUserHasPlacesListModel = ({conn, ...rest}) => {
const now = dayjs.utc().format('YYYY-MM-DD HH:mm:ss')
const paramsToSearch = {...rest, now}
return mysql
.execute(countUserHasPlacesListQuery(paramsToSearch), conn, paramsToSearch)
.then(results => results[0].count)
}
const insertUserHasPlacesModel = ({conn, ...params}) => {
const now = dayjs.utc().format('YYYY-MM-DD HH:mm:ss')
const uuid = uuidv4()
return mysql
.execute(insertUserHasPlacesQuery({...params, uuid, now}), conn, {...params, uuid, now})
.then(queryResult => queryResult[1].map(({id, created, deleted, createdBy, deletedBy, ...resultFiltered}) => resultFiltered))
}
const modifyUserHasPlacesModel = ({conn, ...params}) => {
return mysql
.execute(modifyUserHasPlacesQuery(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 softDeleteUserHasPlacesModel = ({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(softDeleteUserHasPlacesQuery(params), conn, params)
}
export {
getUserHasPlacesListModel,
countUserHasPlacesListModel,
insertUserHasPlacesModel,
modifyUserHasPlacesModel,
softDeleteUserHasPlacesModel
}

View File

@ -0,0 +1,100 @@
import { pagination } from "../../utils/pagination";
const _userHasPlacesSelectQuery = (_pagination = '') => ({ count }) => ({ uuid, uuidUser, uuidPlace }) => {
const uuidCondition = uuid ? 'AND up.uuid = :uuid ' : '';
const uuidUserCondition = uuidUser ? 'AND up.fk_user = (SELECT id FROM mydb.users WHERE uuid = :uuidUser)' : '';
const uuidPlaceCondition = uuidPlace ? 'AND up.fk_place = (SELECT id FROM mydb.places WHERE uuid = :uuidPlace)' : '';
return `
SELECT
up.uuid,
up.fk_user,
up.fk_place,
up.created,
up.createdby,
u.username AS user_username,
u.uuid AS user_uuid,
p.name AS place_name,
p.uuid AS place_uuid
FROM mydb.users_has_places AS up
JOIN mydb.users AS u ON up.fk_user = u.id
JOIN mydb.places AS p ON up.fk_place = p.id
WHERE up.created <= :now
AND (up.deleted > :now OR up.deleted IS NULL)
AND u.deleted IS NULL
AND up.created <= :now
AND (up.deleted > :now OR up.deleted IS NULL)
AND true
${uuidCondition}
${uuidUserCondition}
${uuidPlaceCondition}
${_pagination}
`;
}
const getUserHasPlacesListQuery = ({ limit, page, ...rest }) =>
_userHasPlacesSelectQuery(pagination({ limit, page }))({ count: false })(rest);
const countUserHasPlacesListQuery = rest =>
_userHasPlacesSelectQuery()({ count: 'COUNT(DISTINCT(up.uuid)) AS count' })(rest);
const insertUserHasPlacesQuery = ({ uuidUser, uuidPlace, createdBy }) => {
const uuidUserCondition = uuidUser ? '(SELECT id FROM mydb.users WHERE uuid = :uuidUser),' : null;
const uuidPlaceCondition = uuidPlace ? '(SELECT id FROM mydb.places WHERE uuid = :uuidPlace),' : null;
const createdByCondition = createdBy ? 'createdBy = :createdBy' : null;
return `
INSERT INTO mydb.users_has_places (
uuid,
fk_user,
fk_place,
created,
createdBy
)
VALUES (
:uuid
${uuidUserCondition}
${uuidPlaceCondition}
:now,
${createdByCondition}
);
SELECT * FROM mydb.users_has_places WHERE uuid = UUID();
`
}
const modifyUserHasPlacesQuery = () => {
const uuidUserCondition = uuidUser ? 'fk_user = (SELECT id FROM mydb.users WHERE uuid = :uuidUser)' : ``;
const uuidPlaceCondition = uuidPlace ? 'fk_place = (SELECT id FROM mydb.places WHERE uuid = :uuidPlace)' : ``;
return `
UPDATE mydb.users_has_places
SET
${uuidUserCondition}
${uuidPlaceCondition}
uuid = :uuid
WHERE
users_has_places.uuid = :uuid
AND
users_has_places.deleted IS NULL;
SELECT * FROM mydb.users_has_places WHERE uuid = :uuid;
`
}
const softDeleteUserHasPlacesQuery = () => {
return `
UPDATE
mydb.users_has_places
SET
deleted = :now, deletedBy = :deletedBy
WHERE
users_has_places.uuid = :uuid
AND
users_has_places.deleted IS NULL;
`
}
export {
getUserHasPlacesListQuery,
countUserHasPlacesListQuery,
insertUserHasPlacesQuery,
modifyUserHasPlacesQuery,
softDeleteUserHasPlacesQuery
};