From 193bce0cc9b23fce208a1e074d11f072368a2200 Mon Sep 17 00:00:00 2001 From: Daniel Kirby Date: Sat, 27 Jun 2026 10:11:32 +0100 Subject: [PATCH] fix: batch contract database writes --- .../clients/[id]/contracts/+page.server.ts | 111 ++++++++++-------- 1 file changed, 62 insertions(+), 49 deletions(-) diff --git a/src/routes/dashboard/clients/[id]/contracts/+page.server.ts b/src/routes/dashboard/clients/[id]/contracts/+page.server.ts index cadb15c..1f69f64 100644 --- a/src/routes/dashboard/clients/[id]/contracts/+page.server.ts +++ b/src/routes/dashboard/clients/[id]/contracts/+page.server.ts @@ -213,32 +213,37 @@ export const actions: Actions = { try { const contractId = crypto.randomUUID(); - await db.transaction(async (tx) => { - await tx.insert(contracts).values({ - id: contractId, - organizationId: activeOrganizationId, - clientId: form.data.clientId, - serviceId: form.data.serviceId || null, - licenseFeeGbp: form.data.licenseFeeGbp, - depositGbp: form.data.depositGbp, - startDate: form.data.startDate, - endDate: form.data.endDate, - status: 'draft', - updatedAt: new Date(), - createdAt: new Date() - }); + const now = new Date(); + const createContract = db.insert(contracts).values({ + id: contractId, + organizationId: activeOrganizationId, + clientId: form.data.clientId, + serviceId: form.data.serviceId || null, + licenseFeeGbp: form.data.licenseFeeGbp, + depositGbp: form.data.depositGbp, + startDate: form.data.startDate, + endDate: form.data.endDate, + status: 'draft', + updatedAt: now, + createdAt: now + }); - const uniqueRoomIds = [...new Set(form.data.roomIds)]; - if (uniqueRoomIds.length > 0) { - await tx.insert(contractRooms).values( + const uniqueRoomIds = [...new Set(form.data.roomIds)]; + if (uniqueRoomIds.length > 0) { + await db.batch([ + createContract, + db.insert(contractRooms).values( uniqueRoomIds.map((roomId) => ({ contractId, roomId })) - ); - } - }); - } catch { + ) + ]); + } else { + await createContract; + } + } catch (cause) { + console.error('Unable to create contract', cause); return message(form, 'Unable to create contract.', { status: 400 }); } @@ -295,39 +300,47 @@ export const actions: Actions = { } try { - await db.transaction(async (tx) => { - await tx - .update(contracts) - .set({ - clientId: form.data.clientId, - serviceId: form.data.serviceId || null, - licenseFeeGbp: form.data.licenseFeeGbp, - depositGbp: form.data.depositGbp, - startDate: form.data.startDate, - endDate: form.data.endDate, - updatedAt: new Date() - }) - .where( - and( - eq(contracts.id, form.data.id), - eq(contracts.clientId, params.id), - eq(contracts.organizationId, activeOrganizationId), - isNull(contracts.archivedAt) - ) - ); + const now = new Date(); + const updateContract = db + .update(contracts) + .set({ + clientId: form.data.clientId, + serviceId: form.data.serviceId || null, + licenseFeeGbp: form.data.licenseFeeGbp, + depositGbp: form.data.depositGbp, + startDate: form.data.startDate, + endDate: form.data.endDate, + updatedAt: now + }) + .where( + and( + eq(contracts.id, form.data.id), + eq(contracts.clientId, params.id), + eq(contracts.organizationId, activeOrganizationId), + isNull(contracts.archivedAt) + ) + ); + const deleteRoomLinks = db + .delete(contractRooms) + .where(eq(contractRooms.contractId, form.data.id)); + const uniqueRoomIds = [...new Set(form.data.roomIds)]; - await tx.delete(contractRooms).where(eq(contractRooms.contractId, form.data.id)); - const uniqueRoomIds = [...new Set(form.data.roomIds)]; - if (uniqueRoomIds.length > 0) { - await tx.insert(contractRooms).values( + if (uniqueRoomIds.length > 0) { + await db.batch([ + updateContract, + deleteRoomLinks, + db.insert(contractRooms).values( uniqueRoomIds.map((roomId) => ({ contractId: form.data.id, roomId })) - ); - } - }); - } catch { + ) + ]); + } else { + await db.batch([updateContract, deleteRoomLinks]); + } + } catch (cause) { + console.error('Unable to update contract', cause); return message(form, 'Unable to update contract.', { status: 400 }); }