From f6fa652bcf9cf7e33bf053d9d83a6b383a9d2ed9 Mon Sep 17 00:00:00 2001 From: Amr Mohammed El-Sheraey <141947355+AmrMsCLL@users.noreply.github.com> Date: Wed, 7 Oct 2026 23:26:58 +0300 Subject: [PATCH] fix: lock while creating the Weekly reviews page --- app/server/src/review/weekly-review.service.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/app/server/src/review/weekly-review.service.ts b/app/server/src/review/weekly-review.service.ts index 8af601c..ba8a7e9 100644 --- a/app/server/src/review/weekly-review.service.ts +++ b/app/server/src/review/weekly-review.service.ts @@ -118,18 +118,15 @@ export class WeeklyReviewService implements OnModuleInit { return { noteId: note.id }; } - private async parent(userId: string, spaceId: string) { - const oldest = () => - this.prisma.item.findFirst({ + private parent(userId: string, spaceId: string) { + return this.prisma.$transaction(async (transaction) => { + await transaction.$executeRaw`SELECT pg_advisory_xact_lock(hashtext(${`${parentTitle}:${spaceId}`}::text))`; + const existing = await this.prisma.item.findFirst({ where: { spaceId, kind: ItemKind.NOTE, title: parentTitle, trashedAt: null, note: { parentId: null } }, - orderBy: [{ createdAt: 'asc' }, { id: 'asc' }], + orderBy: { createdAt: 'asc' }, select: { id: true }, }); - const existing = await oldest(); - if (existing) return existing.id; - const created = await this.notes.create(userId, spaceId, { title: parentTitle }); - const kept = (await oldest())!; - if (kept.id !== created.id) await this.prisma.item.delete({ where: { id: created.id } }); - return kept.id; + return existing?.id ?? (await this.notes.create(userId, spaceId, { title: parentTitle })).id; + }); } }