diff --git a/server/api/helpers/users/remove-related-files.js b/server/api/helpers/users/remove-related-files.js deleted file mode 100644 index 15352984..00000000 --- a/server/api/helpers/users/remove-related-files.js +++ /dev/null @@ -1,31 +0,0 @@ -/*! - * Copyright (c) 2024 PLANKA Software GmbH - * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md - */ - -module.exports = { - sync: true, - - inputs: { - recordOrRecords: { - type: 'ref', - required: true, - }, - }, - - fn(inputs) { - const users = _.isPlainObject(inputs.recordOrRecords) - ? [inputs.recordOrRecords] - : inputs.recordOrRecords; - - const fileManager = sails.hooks['file-manager'].getInstance(); - - users.forEach(async (user) => { - if (user.avatar) { - await fileManager.deleteDir( - `${sails.config.custom.userAvatarsPathSegment}/${user.avatar.dirname}`, - ); - } - }); - }, -}; diff --git a/server/api/hooks/query-methods/helpers.js b/server/api/hooks/query-methods/helpers.js index 3597db73..78fc7cd6 100644 --- a/server/api/hooks/query-methods/helpers.js +++ b/server/api/hooks/query-methods/helpers.js @@ -21,8 +21,8 @@ const makeWhereQueryBuilder = (Model) => (criteria) => { throw new Error('Unknown column'); } - parts.push(`${columnName} = $${index + 1}`); values.push(value); + parts.push(`${columnName} = $${values.length}`); } return [parts.join(' AND '), values]; diff --git a/server/api/hooks/query-methods/models/Card.js b/server/api/hooks/query-methods/models/Card.js index 03012ce0..1134f8a7 100644 --- a/server/api/hooks/query-methods/models/Card.js +++ b/server/api/hooks/query-methods/models/Card.js @@ -206,12 +206,12 @@ const update = async (criteria, values) => { const cards = await Card.update(criteria).set(values).fetch().usingConnection(db); let tasks = []; - if (card) { + if (!_.isUndefined(values.isClosed)) { tasks = await Task.update({ linkedCardId: sails.helpers.utils.mapRecords(cards), }) .set({ - isCompleted: card.isClosed, + isCompleted: values.isClosed, }) .fetch() .usingConnection(db); @@ -232,8 +232,8 @@ const updateOne = async (criteria, values) => { .set({ ...values }) .usingConnection(db); - let tasks = []; - if (card) { + let tasks; + if (!_.isUndefined(values.isClosed) && card) { tasks = await Task.update({ linkedCardId: card.id, }) diff --git a/server/api/hooks/query-methods/models/List.js b/server/api/hooks/query-methods/models/List.js index b333c015..edfc4a3f 100644 --- a/server/api/hooks/query-methods/models/List.js +++ b/server/api/hooks/query-methods/models/List.js @@ -52,19 +52,24 @@ const getOneTrashByBoardId = (boardId) => }); const updateOne = async (criteria, values) => { - if (!_.isUndefined(values.type)) { + if (values.type) { return sails.getDatastore().transaction(async (db) => { const [whereQuery, whereQueryValues] = buildWhereQuery(criteria); const queryResult = await sails - .sendNativeQuery(`SELECT type FROM list WHERE ${whereQuery} FOR UPDATE`, whereQueryValues) + .sendNativeQuery( + `SELECT type FROM list WHERE ${whereQuery} LIMIT 1 FOR UPDATE`, + whereQueryValues, + ) .usingConnection(db); if (queryResult.rowCount === 0) { return { list: null }; } - const [{ type: prevType }] = queryResult.rows; + const prev = { + type: queryResult.rows[0].type, + }; const list = await List.updateOne(criteria) .set({ ...values }) @@ -74,18 +79,15 @@ const updateOne = async (criteria, values) => { let tasks = []; if (list) { - const prevTypeState = List.TYPE_STATE_BY_TYPE[prevType]; + const prevTypeState = List.TYPE_STATE_BY_TYPE[prev.type]; const typeState = List.TYPE_STATE_BY_TYPE[list.type]; - let isClosed; - if (prevTypeState === List.TypeStates.CLOSED && typeState === List.TypeStates.OPENED) { - isClosed = false; - } else if ( - prevTypeState === List.TypeStates.OPENED && - typeState === List.TypeStates.CLOSED - ) { - isClosed = true; - } + const transitions = { + [`${List.TypeStates.CLOSED}->${List.TypeStates.OPENED}`]: false, + [`${List.TypeStates.OPENED}->${List.TypeStates.CLOSED}`]: true, + }; + + const isClosed = transitions[`${prevTypeState}->${typeState}`]; if (!_.isUndefined(isClosed)) { cards = await Card.update({ diff --git a/server/api/hooks/query-methods/models/User.js b/server/api/hooks/query-methods/models/User.js index 8f9f0a17..3886a7ba 100644 --- a/server/api/hooks/query-methods/models/User.js +++ b/server/api/hooks/query-methods/models/User.js @@ -96,13 +96,13 @@ const updateOne = async (criteria, values) => { } } - let prevAvatar; + let prev; if (!_.isUndefined(values.avatar)) { const [whereQuery, whereQueryValues] = buildWhereQuery(criteria); const queryResult = await sails .sendNativeQuery( - `SELECT avatar FROM user_account WHERE ${whereQuery} FOR UPDATE`, + `SELECT avatar FROM user_account WHERE ${whereQuery} LIMIT 1 FOR UPDATE`, whereQueryValues, ) .usingConnection(db); @@ -111,7 +111,9 @@ const updateOne = async (criteria, values) => { return { user: null }; } - [{ avatar: prevAvatar }] = queryResult.rows; + prev = { + avatar: queryResult.rows[0].avatar, + }; } const user = await User.updateOne(criteria) @@ -119,12 +121,12 @@ const updateOne = async (criteria, values) => { .usingConnection(db); let uploadedFile; - if (hasAvatarChanged(user.avatar, prevAvatar)) { - if (prevAvatar) { + if (!_.isUndefined(values.avatar) && hasAvatarChanged(user.avatar, prev.avatar)) { + if (prev.avatar) { const queryResult = await sails .sendNativeQuery( 'UPDATE uploaded_file SET references_total = CASE WHEN references_total > 1 THEN references_total - 1 END, updated_at = $1 WHERE id = $2 RETURNING *', - [new Date().toISOString(), prevAvatar.uploadedFileId], + [new Date().toISOString(), prev.avatar.uploadedFileId], ) .usingConnection(db);