From 4f5420f1484e0273df288f85ee98fce4a8de839d Mon Sep 17 00:00:00 2001 From: Thibault Reidy Date: Mon, 5 Feb 2024 15:23:08 +0000 Subject: [PATCH 1/3] feat: send the ws ItemOpFeedbackEvent move after the transaction --- src/services/item/controller.ts | 45 ++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/services/item/controller.ts b/src/services/item/controller.ts index 23e85ef7fa..14006c696f 100644 --- a/src/services/item/controller.ts +++ b/src/services/item/controller.ts @@ -275,26 +275,31 @@ const plugin: FastifyPluginAsync = async (fastify) => { const repositories = buildRepositories(manager); const items = await itemService.moveMany(member, repositories, ids, parentId); await actionItemService.postManyMoveAction(request, reply, repositories, items); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('move', ids, { - data: Object.fromEntries(items.map((i) => [i.id, i])), - errors: [], - }), - ); - } - }).catch((e) => { - log.error(e); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('move', ids, { error: e }), - ); - } - }); + return items; + }) + // TODO: do the same for the copy and the others ? + .then((items) => { + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('move', ids, { + data: Object.fromEntries(items.map((i) => [i.id, i])), + errors: [], + }), + ); + } + }) + .catch((e) => { + log.error(e); + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('move', ids, { error: e }), + ); + } + }); reply.status(StatusCodes.ACCEPTED); return ids; }, From 61aaa339b3a2380ea34e1515c7c90de9bc3a93f6 Mon Sep 17 00:00:00 2001 From: Thibault Reidy Date: Tue, 6 Feb 2024 09:36:51 +0000 Subject: [PATCH 2/3] feat: send ItemOpFeedbackEvent after transaction for patch, copy and delete --- src/services/item/controller.ts | 127 +++++++++++++++++--------------- 1 file changed, 69 insertions(+), 58 deletions(-) diff --git a/src/services/item/controller.ts b/src/services/item/controller.ts index 14006c696f..4056cb74ca 100644 --- a/src/services/item/controller.ts +++ b/src/services/item/controller.ts @@ -198,23 +198,27 @@ const plugin: FastifyPluginAsync = async (fastify) => { repositories, resultOfToList(items), ); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('update', ids, items), - ); - } - }).catch((e: Error) => { - log.error(e); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('update', ids, { error: e }), - ); - } - }); + return items; + }) + .then((items) => { + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('update', ids, items), + ); + } + }) + .catch((e: Error) => { + log.error(e); + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('update', ids, { error: e }), + ); + } + }); reply.status(StatusCodes.ACCEPTED); return ids; }, @@ -236,26 +240,30 @@ const plugin: FastifyPluginAsync = async (fastify) => { const repositories = buildRepositories(manager); const items = await itemService.deleteMany(member, repositories, ids); await actionItemService.postManyDeleteAction(request, reply, repositories, items); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('delete', ids, { - data: Object.fromEntries(items.map((i) => [i.id, i])), - errors: [], - }), - ); - } - }).catch((e) => { - log.error(e); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('delete', ids, { error: e }), - ); - } - }); + return items; + }) + .then((items) => { + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('delete', ids, { + data: Object.fromEntries(items.map((i) => [i.id, i])), + errors: [], + }), + ); + } + }) + .catch((e) => { + log.error(e); + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('delete', ids, { error: e }), + ); + } + }); reply.status(StatusCodes.ACCEPTED); return ids; }, @@ -277,7 +285,6 @@ const plugin: FastifyPluginAsync = async (fastify) => { await actionItemService.postManyMoveAction(request, reply, repositories, items); return items; }) - // TODO: do the same for the copy and the others ? .then((items) => { if (member) { websockets.publish( @@ -324,26 +331,30 @@ const plugin: FastifyPluginAsync = async (fastify) => { parentId, }); await actionItemService.postManyCopyAction(request, reply, repositories, items); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('copy', ids, { - data: Object.fromEntries(items.map((i) => [i.id, i])), - errors: [], - }), - ); - } - }).catch((e) => { - log.error(e); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('copy', ids, { error: e }), - ); - } - }); + return items; + }) + .then((items) => { + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('copy', ids, { + data: Object.fromEntries(items.map((i) => [i.id, i])), + errors: [], + }), + ); + } + }) + .catch((e) => { + log.error(e); + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('copy', ids, { error: e }), + ); + } + }); reply.status(StatusCodes.ACCEPTED); return ids; }, From 23848d85f1f913285b8a592fb4f080169bd5bf3b Mon Sep 17 00:00:00 2001 From: Thibault Reidy Date: Tue, 20 Feb 2024 13:07:53 +0000 Subject: [PATCH 3/3] feat: send ItemOpFeedback after the end of the transaction --- src/services/item/plugins/action/index.ts | 39 ++++----- src/services/item/plugins/recycled/index.ts | 79 ++++++++++--------- src/services/item/plugins/validation/index.ts | 42 +++++----- 3 files changed, 85 insertions(+), 75 deletions(-) diff --git a/src/services/item/plugins/action/index.ts b/src/services/item/plugins/action/index.ts index 7c11ce3c68..f4e1283c3f 100644 --- a/src/services/item/plugins/action/index.ts +++ b/src/services/item/plugins/action/index.ts @@ -161,24 +161,27 @@ const plugin: FastifyPluginAsync = async (fastify) => { } = request; db.transaction(async (manager) => { const repositories = buildRepositories(manager); - const item = await requestExportService.request(member, repositories, itemId); - if (member && item) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('export', [itemId], { data: { [item.id]: item }, errors: [] }), - ); - } - }).catch((e: Error) => { - log.error(e); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('export', [itemId], { error: e }), - ); - } - }); + return await requestExportService.request(member, repositories, itemId); + }) + .then((item) => { + if (member && item) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('export', [itemId], { data: { [item.id]: item }, errors: [] }), + ); + } + }) + .catch((e: Error) => { + log.error(e); + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('export', [itemId], { error: e }), + ); + } + }); // reply no content and let the server create the archive and send the mail reply.status(StatusCodes.NO_CONTENT); diff --git a/src/services/item/plugins/recycled/index.ts b/src/services/item/plugins/recycled/index.ts index 7a1aca6a33..f3ea9a8095 100644 --- a/src/services/item/plugins/recycled/index.ts +++ b/src/services/item/plugins/recycled/index.ts @@ -73,25 +73,27 @@ const plugin: FastifyPluginAsync = async (fastify, opti log, } = request; db.transaction(async (manager) => { - const items = await recycleBinService.recycleMany(member, buildRepositories(manager), ids); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('recycle', ids, items), - ); - } - return items; - }).catch((e: Error) => { - log.error(e); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('recycle', ids, { error: e }), - ); - } - }); + return await recycleBinService.recycleMany(member, buildRepositories(manager), ids); + }) + .then((items) => { + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('recycle', ids, items), + ); + } + }) + .catch((e: Error) => { + log.error(e); + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('recycle', ids, { error: e }), + ); + } + }); reply.status(StatusCodes.ACCEPTED); return ids; @@ -124,24 +126,27 @@ const plugin: FastifyPluginAsync = async (fastify, opti log.info(`Restoring items ${ids}`); db.transaction(async (manager) => { - const items = await recycleBinService.restoreMany(member, buildRepositories(manager), ids); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('restore', ids, items), - ); - } - }).catch((e: Error) => { - log.error(e); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('restore', ids, { error: e }), - ); - } - }); + return await recycleBinService.restoreMany(member, buildRepositories(manager), ids); + }) + .then((items) => { + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('restore', ids, items), + ); + } + }) + .catch((e: Error) => { + log.error(e); + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('restore', ids, { error: e }), + ); + } + }); reply.status(StatusCodes.ACCEPTED); return ids; }, diff --git a/src/services/item/plugins/validation/index.ts b/src/services/item/plugins/validation/index.ts index d117a72bf2..ab1bb91ee4 100644 --- a/src/services/item/plugins/validation/index.ts +++ b/src/services/item/plugins/validation/index.ts @@ -82,26 +82,28 @@ const plugin: FastifyPluginAsync = async (fastify throw new UnauthorizedMember(); } const repositories = buildRepositories(manager); - const item = await validationService.post(member, repositories, itemId); - - // the process could take long time, so let the process run in the background and return the itemId instead - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('validate', [itemId], { data: { [item.id]: item }, errors: [] }), - ); - } - }).catch((e: Error) => { - log.error(e); - if (member) { - websockets.publish( - memberItemsTopic, - member.id, - ItemOpFeedbackEvent('validate', [itemId], { error: e }), - ); - } - }); + return await validationService.post(member, repositories, itemId); + }) + .then((item) => { + // the process could take long time, so let the process run in the background and return the itemId instead + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('validate', [itemId], { data: { [item.id]: item }, errors: [] }), + ); + } + }) + .catch((e: Error) => { + log.error(e); + if (member) { + websockets.publish( + memberItemsTopic, + member.id, + ItemOpFeedbackEvent('validate', [itemId], { error: e }), + ); + } + }); reply.status(StatusCodes.ACCEPTED); return itemId; },