From 6a9717008b23720f450ee7d51193f43146425109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Sun, 4 Jan 2026 13:04:10 +0400 Subject: [PATCH] =?UTF-8?q?Bloquer=20votes=20sur=20versions=20obsol=C3=A8t?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/index.js | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/extensions/directus-extension-disallow-votes/src/index.js b/extensions/directus-extension-disallow-votes/src/index.js index 02c4349..c121d8c 100644 --- a/extensions/directus-extension-disallow-votes/src/index.js +++ b/extensions/directus-extension-disallow-votes/src/index.js @@ -1,5 +1,5 @@ -export default ({filter}) => { - const checkVersionAge = async (versionId, database) => { +export default ({filter}, {services}) => { + const checkVersionValidity = async (versionId, database, schema) => { if (!versionId) { throw new Error('L’identifiant de la version est manquant.') } @@ -13,6 +13,7 @@ export default ({filter}) => { throw new Error('Version non trouvée.') } + // Check if version is older than 3 days const createdAt = new Date(version.date_created) const threeDaysAgo = new Date(Date.now() - 3 * 24 * 60 * 60 * 1000) @@ -21,23 +22,43 @@ export default ({filter}) => { 'Le vote n’est plus possible après 3 jours de la création de la version.' ) } + + // Check if version is outdated (has been superseded by a promoted version) + try { + const {VersionsService} = services + const versionsService = new VersionsService({schema, knex: database}) + const comparison = await versionsService.compare(versionId) + + if (comparison && comparison.outdated === true) { + throw new Error( + 'Le vote n’est plus possible sur une version obsolète.' + ) + } + } catch (error) { + // If it's our custom error, rethrow it + if (error.message === 'Le vote n’est plus possible sur une version obsolète.') { + throw error + } + // Otherwise, log and continue (don't block vote if comparison fails) + console.warn('Could not check version outdated status:', error.message) + } } - filter('items.create', async (input, {collection}, {database}) => { + filter('items.create', async (input, {collection}, {database, schema}) => { if (collection === 'votes') { - await checkVersionAge(input.content_version_id, database) + await checkVersionValidity(input.content_version_id, database, schema) } return input }) - filter('items.update', async (input, {collection}, {database}) => { + filter('items.update', async (input, {collection}, {database, schema}) => { if (collection === 'votes') { - await checkVersionAge(input.content_version_id, database) + await checkVersionValidity(input.content_version_id, database, schema) } return input }) - filter('items.delete', async (input, {collection}, {database}) => { + filter('items.delete', async (input, {collection}, {database, schema}) => { if (collection === 'votes') { const voteId = input[0] @@ -54,7 +75,7 @@ export default ({filter}) => { throw new Error('Vote non trouvé.') } - await checkVersionAge(vote.content_version_id, database) + await checkVersionValidity(vote.content_version_id, database, schema) } return input })