fix(decisions): wrap mutations in db.transaction() for audit atomicity

This commit is contained in:
admin-valentin 2026-07-31 10:48:37 +00:00
parent 880c2a7018
commit 3b1b14e380

View file

@ -26,7 +26,8 @@ export class DecisionsService {
}
async create(session: AuthenticatedSession, dto: CreateDecisionDto) {
const [row] = await db
return db.transaction(async (tx) => {
const [row] = await tx
.insert(decisions)
.values({
tenantId: session.tenantId,
@ -38,18 +39,20 @@ export class DecisionsService {
reviewDueAt: dto.reviewDueAt ? new Date(dto.reviewDueAt) : undefined,
})
.returning();
await this.audit.record(null, {
await this.audit.record(tx, {
tenantId: session.tenantId,
actorId: session.userId,
action: 'decision.created',
resource: `decision:${row.id}`,
});
return row;
});
}
async update(session: AuthenticatedSession, id: string, dto: UpdateDecisionDto) {
await this.getById(session, id);
const [row] = await db
return db.transaction(async (tx) => {
const [row] = await tx
.update(decisions)
.set({
...(dto.context !== undefined ? { context: dto.context } : {}),
@ -63,12 +66,13 @@ export class DecisionsService {
})
.where(and(eq(decisions.id, id), eq(decisions.tenantId, session.tenantId)))
.returning();
await this.audit.record(null, {
await this.audit.record(tx, {
tenantId: session.tenantId,
actorId: session.userId,
action: dto.selectedOption !== undefined ? 'decision.option_selected' : 'decision.updated',
resource: `decision:${id}`,
});
return row;
});
}
}