insert and modify reports fixed for multiple report types

This commit is contained in:
Pau 2025-05-30 11:11:43 +02:00
parent 0588ea770e
commit 7c06ada685
1 changed files with 65 additions and 61 deletions

View File

@ -52,19 +52,14 @@ const countUserHasPlacesListQuery = rest =>
_userHasPlacesSelectQuery()({ count: 'COUNT(DISTINCT(up.uuid)) AS count' })(rest); _userHasPlacesSelectQuery()({ count: 'COUNT(DISTINCT(up.uuid)) AS count' })(rest);
const insertUserHasPlacesQuery = ({ user_uuid, place_uuid, description, createdBy, report_type_uuid, images }) => { const insertUserHasPlacesQuery = ({ user_uuid, place_uuid, description, createdBy, report_type_uuid, images }) => {
const report_type_uuidStatements = report_type_uuid && report_type_uuid.length > 0
? report_type_uuid.map(rt =>
`INSERT INTO dbmaster.report_report_type (report_uuid, report_type_uuid) VALUES (:uuid, '${rt}');`
).join('\n ')
: '';
const user_uuidCondition = user_uuid ? '(SELECT id FROM dbmaster.users WHERE uuid = :user_uuid)' : 'NULL'; const user_uuidCondition = user_uuid ? '(SELECT id FROM dbmaster.users WHERE uuid = :user_uuid)' : 'NULL';
const place_uuidCondition = place_uuid ? '(SELECT id FROM dbmaster.places WHERE uuid = :place_uuid)' : 'NULL'; const place_uuidCondition = place_uuid ? '(SELECT id FROM dbmaster.places WHERE uuid = :place_uuid)' : 'NULL';
const createdByCondition = createdBy ? ':createdBy' : 'NULL'; const createdByCondition = createdBy ? ':createdBy' : 'NULL';
const descriptionCondition = description ? ':description' : 'NULL'; const descriptionCondition = description ? ':description' : 'NULL';
const imagesCondition = images ? ':images' : 'NULL'; const imagesCondition = images ? ':images' : 'NULL';
return ` // Main insert statement
const mainInsert = `
INSERT INTO dbmaster.users_has_places ( INSERT INTO dbmaster.users_has_places (
uuid, uuid,
fk_user, fk_user,
@ -84,59 +79,15 @@ const insertUserHasPlacesQuery = ({ user_uuid, place_uuid, description, createdB
${descriptionCondition}, ${descriptionCondition},
${createdByCondition}, ${createdByCondition},
:now :now
); );`;
${report_type_uuidStatements} // Report types insert (if any)
const reportTypesInsert = (report_type_uuid && report_type_uuid.length > 0)
SELECT ? `INSERT INTO dbmaster.report_report_type (report_uuid, report_type_uuid)
up.*, VALUES ${report_type_uuid.map(rt => `(:uuid, '${rt}')`).join(', ')};`
u.username AS user_username,
u.uuid AS user_uuid,
p.name AS place_name,
p.uuid AS place_uuid,
GROUP_CONCAT(rt.uuid) AS report_type_uuids,
GROUP_CONCAT(rt.name) AS report_type_names
FROM dbmaster.users_has_places AS up
LEFT JOIN dbmaster.users AS u ON up.fk_user = u.id
LEFT JOIN dbmaster.places AS p ON up.fk_place = p.id
LEFT JOIN dbmaster.report_report_type AS rrt ON rrt.report_uuid = up.uuid
LEFT JOIN dbmaster.report_types AS rt ON rt.uuid = rrt.report_type_uuid
WHERE up.created <= :now
AND (up.deleted > :now OR up.deleted IS NULL)
AND u.deleted IS NULL
AND p.deleted IS NULL
GROUP BY up.uuid;
`;
}
const modifyUserHasPlacesQuery = ({user_uuid, place_uuid, report_type_uuid, rating, images, description}) => {
const user_uuidCondition = user_uuid ? 'fk_user = (SELECT id FROM dbmaster.users WHERE uuid = :user_uuid),' : '';
const place_uuidCondition = place_uuid ? 'fk_place = (SELECT id FROM dbmaster.places WHERE uuid = :place_uuid),' : '';
const report_type_uuidCondition = report_type_uuid !== undefined
? `DELETE FROM dbmaster.report_report_type WHERE report_uuid = :uuid;${
Array.isArray(report_type_uuid) && report_type_uuid.length > 0
? ' ' + report_type_uuid.map(rt =>
`INSERT INTO dbmaster.report_report_type (report_uuid, report_type_uuid) VALUES (:uuid, '${rt}');`
).join(' ')
: ''
}`
: ''; : '';
const ratingCondition = rating ? 'rating = :rating,' : '';
const imagesCondition = images ? 'images = :images,' : '';
const descriptionCondition = description ? 'description = :description,' : '';
return `
${report_type_uuidCondition}
UPDATE dbmaster.users_has_places
SET
${user_uuidCondition}
${place_uuidCondition}
${ratingCondition}
${imagesCondition}
${descriptionCondition}
uuid = :uuid
WHERE uuid = :uuid AND deleted IS NULL;
const finalSelect = `
SELECT SELECT
up.*, up.*,
u.username AS user_username, u.username AS user_username,
@ -154,8 +105,61 @@ const modifyUserHasPlacesQuery = ({user_uuid, place_uuid, report_type_uuid, rati
AND (up.deleted > :now OR up.deleted IS NULL) AND (up.deleted > :now OR up.deleted IS NULL)
AND u.deleted IS NULL AND u.deleted IS NULL
AND p.deleted IS NULL AND p.deleted IS NULL
GROUP BY up.uuid; GROUP BY up.uuid;`;
`;
return mainInsert + reportTypesInsert + finalSelect;
}
const modifyUserHasPlacesQuery = ({user_uuid, place_uuid, report_type_uuid, rating, images, description}) => {
const user_uuidCondition = user_uuid ? 'fk_user = (SELECT id FROM dbmaster.users WHERE uuid = :user_uuid),' : '';
const place_uuidCondition = place_uuid ? 'fk_place = (SELECT id FROM dbmaster.places WHERE uuid = :place_uuid),' : '';
const ratingCondition = rating !== undefined ? 'rating = :rating,' : '';
const imagesCondition = images !== undefined ? 'images = :images,' : '';
const descriptionCondition = description !== undefined ? 'description = :description,' : '';
// Report types handling
const deleteReportTypes = (report_type_uuid !== undefined)
? `DELETE FROM dbmaster.report_report_type WHERE report_uuid = :uuid;`
: '';
const insertReportTypes = (report_type_uuid !== undefined && Array.isArray(report_type_uuid) && report_type_uuid.length > 0)
? `INSERT INTO dbmaster.report_report_type (report_uuid, report_type_uuid)
VALUES ${report_type_uuid.map(rt => `(:uuid, '${rt}')`).join(', ')};`
: '';
// Main update statement
const mainUpdate = `
UPDATE dbmaster.users_has_places
SET
${user_uuidCondition}
${place_uuidCondition}
${ratingCondition}
${imagesCondition}
${descriptionCondition}
uuid = :uuid
WHERE uuid = :uuid AND deleted IS NULL;`;
const finalSelect = `
SELECT
up.*,
u.username AS user_username,
u.uuid AS user_uuid,
p.name AS place_name,
p.uuid AS place_uuid,
GROUP_CONCAT(rt.uuid) AS report_type_uuids,
GROUP_CONCAT(rt.name) AS report_type_names
FROM dbmaster.users_has_places AS up
LEFT JOIN dbmaster.users AS u ON up.fk_user = u.id
LEFT JOIN dbmaster.places AS p ON up.fk_place = p.id
LEFT JOIN dbmaster.report_report_type AS rrt ON rrt.report_uuid = up.uuid
LEFT JOIN dbmaster.report_types AS rt ON rt.uuid = rrt.report_type_uuid
WHERE up.uuid = :uuid
AND (up.deleted > :now OR up.deleted IS NULL)
AND u.deleted IS NULL
AND p.deleted IS NULL
GROUP BY up.uuid;`;
return deleteReportTypes + insertReportTypes + mainUpdate + finalSelect;
} }
const softDeleteUserHasPlacesQuery = () => { const softDeleteUserHasPlacesQuery = () => {