Files
PaperClipAI/server/src/services/decision-work-notifications.ts
T
DottaandPaperclip 6fe6d6d29c fix(server): bound retention reconstruction and preserve producer transactions
Batch review and confirmation eligibility per company, scope decision and budget hints, and keep child blocker relation intents inside their owning transaction. Cover ordinary child, budget and execution producers plus full candidate-page query bounds; update startup/import fixtures for source-driven retention.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-30 17:10:15 -05:00

25 lines
1.2 KiB
TypeScript

import { notifyAttentionRetentionWork } from "./retention-work-notifications.js";
import type { Db } from "@paperclipai/db";
import { DELIVERY_QUEUES, notifyDeliveryWork } from "./delivery-work-notifications.js";
type DecisionWorkScope = { companyId: string; sourceId?: string };
export async function notifyDecisionCreated(transaction: object, scope: DecisionWorkScope) {
await notifyAttentionRetentionWork(transaction, { ...scope, sourceKind: "decision" });
return notifyDeliveryWork(transaction, DELIVERY_QUEUES.decisionExpiry);
}
export async function notifyDecisionChange(transaction: object, scope: DecisionWorkScope) {
await notifyAttentionRetentionWork(transaction, { ...scope, sourceKind: "decision" });
await notifyDeliveryWork(transaction, DELIVERY_QUEUES.decisionContinuation);
await notifyDeliveryWork(transaction, DELIVERY_QUEUES.decisionExpiry);
}
export function writeDecisionChange<T>(db: Db, write: (transaction: Db) => Promise<T>, scope: DecisionWorkScope): Promise<T> {
return db.transaction(async transaction => {
await notifyDecisionChange(transaction, scope);
await notifyDeliveryWork(transaction, DELIVERY_QUEUES.decisionEffectRecovery);
return write(transaction as unknown as Db);
});
}