From 7257b558b34edb0a2cec29438cfe9ede9643fd5b Mon Sep 17 00:00:00 2001 From: Denno31 Date: Fri, 5 Sep 2025 14:03:33 +0300 Subject: [PATCH 1/4] fix - correct date math for 7-day token expiration --- tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts b/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts index e7bd3e2..ccf9e40 100644 --- a/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts +++ b/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts @@ -29,7 +29,7 @@ import { update_job_status } from "./generic_scheduler"; export const cleanup_unsubmitted_forms = async (job: JobScheduleQueue) => { try { //Find forms that were created 7 days ago and have not been submitted - const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60); + const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); const sevenDaysAgoPlusOneDay = new Date( sevenDaysAgo.getTime() + 24 * 60 * 60 * 1000 ); From 0df10c6de84da2bb170d2e23d461bb75b960f683 Mon Sep 17 00:00:00 2001 From: Denno31 Date: Fri, 5 Sep 2025 14:05:51 +0300 Subject: [PATCH 2/4] fix - select tokens older than 7 days instead of exact day window --- .../unsubmitted_forms/cleanup_unsubmitted_forms.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts b/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts index ccf9e40..84e200d 100644 --- a/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts +++ b/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts @@ -30,16 +30,15 @@ export const cleanup_unsubmitted_forms = async (job: JobScheduleQueue) => { try { //Find forms that were created 7 days ago and have not been submitted const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000); - const sevenDaysAgoPlusOneDay = new Date( - sevenDaysAgo.getTime() + 24 * 60 * 60 * 1000 - ); const expiredTokens = await prisma.publicFormsTokens.findMany({ where: { - createdAt: { - gte: sevenDaysAgo, // greater than or equal to 7 days ago - lt: sevenDaysAgoPlusOneDay, // but less than 7 days ago + 1 day - }, + createdAt: { lt: sevenDaysAgo }, + }, + select: { + token: true, + entityId: true, + productId: true, }, }); From 9152fceab23fec2c9283c19d5724674c68d9e52f Mon Sep 17 00:00:00 2001 From: Denno31 Date: Fri, 5 Sep 2025 14:10:11 +0300 Subject: [PATCH 3/4] cleanup - safely delete entity and relationships - Removed unsafe fallback (|| "") - Replaced findFirst with findMany for relationships - Used deleteMany for bulk cleanup of relationships - Added entity existence check before delete --- .../cleanup_unsubmitted_forms.ts | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts b/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts index 84e200d..e5d6ea2 100644 --- a/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts +++ b/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts @@ -43,35 +43,38 @@ export const cleanup_unsubmitted_forms = async (job: JobScheduleQueue) => { }); for (const token of expiredTokens) { - const relationship = await prisma.relationship.findFirst({ - where: { - product_id: token.productId, - status: "new", - }, - }); + await prisma.$transaction(async (tx) => { + + const relationships = await tx.relationship.findMany({ + where: { + product_id: token.productId, + status: "new", + }, + }); + + if (relationships.length > 0) { + + await tx.relationship.deleteMany({ + where: { id: { in: relationships.map((r) => r.id) } }, + }); + } + + + await tx.publicFormsTokens.delete({ + where: { token: token.token }, + }); - if (relationship) { - await prisma.$transaction([ - // Delete relationship - prisma.relationship.delete({ - where: { id: relationship.id }, - }), - // // Delete the token - prisma.publicFormsTokens.delete({ - where: { token: token.token }, - }), - // Delete all corpus items associated with the entity - prisma.new_corpus.deleteMany({ - where: { - entity_id: token.entityId || "", - }, - }), - // Delete the entity (company) - prisma.entity.delete({ - where: { id: token.entityId || "" }, - }), - ]); - } + if (token.entityId) { + + await tx.new_corpus.deleteMany({ + where: { entity_id: token.entityId }, + }); + + await tx.entity.delete({ + where: { id: token.entityId }, + }); + } + }); } await update_job_status(job.id, "completed"); From 6373c95fccb9cb195fc962b09e2470fe2e43506e Mon Sep 17 00:00:00 2001 From: Denno31 Date: Fri, 5 Sep 2025 14:17:30 +0300 Subject: [PATCH 4/4] cleanup - add per-token transaction handling and error resilience - Wrapped cleanup per token in a transaction - Logged individual cleanup failures without breaking the loop - Ensures cleanup continues even if one token fails --- .../cleanup_unsubmitted_forms.ts | 59 +++++++++++-------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts b/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts index e5d6ea2..5d74c1f 100644 --- a/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts +++ b/tests/unsubmitted_forms/cleanup_unsubmitted_forms.ts @@ -43,38 +43,47 @@ export const cleanup_unsubmitted_forms = async (job: JobScheduleQueue) => { }); for (const token of expiredTokens) { - await prisma.$transaction(async (tx) => { - - const relationships = await tx.relationship.findMany({ - where: { - product_id: token.productId, - status: "new", - }, - }); - if (relationships.length > 0) { + try { + await prisma.$transaction(async (tx) => { - await tx.relationship.deleteMany({ - where: { id: { in: relationships.map((r) => r.id) } }, + const relationships = await tx.relationship.findMany({ + where: { + product_id: token.productId, + status: "new", + }, }); - } - - await tx.publicFormsTokens.delete({ - where: { token: token.token }, - }); + if (relationships.length > 0) { + + await tx.relationship.deleteMany({ + where: { id: { in: relationships.map((r) => r.id) } }, + }); + } - if (token.entityId) { - - await tx.new_corpus.deleteMany({ - where: { entity_id: token.entityId }, + + await tx.publicFormsTokens.delete({ + where: { token: token.token }, }); - await tx.entity.delete({ - where: { id: token.entityId }, - }); - } - }); + if (token.entityId) { + + await tx.new_corpus.deleteMany({ + where: { entity_id: token.entityId }, + }); + + await tx.entity.delete({ + where: { id: token.entityId }, + }); + } + }); + } catch (innerError) { + console.error( + `Failed cleanup for token ${token.token} (entity ${token.entityId}):`, + innerError + ); + + } } await update_job_status(job.id, "completed");