Files
MikrotikManager/backend/src/services/alerts-outbox-retry.ts
T

14 lines
1.3 KiB
TypeScript

import {alertsOutboxRetrySchema,alertsOutboxRetryReceiptSchema} from "@mmapp/contracts/alerts"
export class OutboxRetryConflict extends Error{constructor(){super("Запись очереди изменилась или не имеет неизвестного результата. Обновите снимок.")}}
export async function executeOutboxRetry<C>(id:string,raw:unknown,deps:{transaction:(work:(context:C)=>Promise<ReturnType<typeof alertsOutboxRetryReceiptSchema.parse>>)=>Promise<ReturnType<typeof alertsOutboxRetryReceiptSchema.parse>>;update:(context:C,id:string,expectedVersion:number)=>Promise<unknown>}){
const input=alertsOutboxRetrySchema.parse(raw)
if(!id.trim()||id.length>200)throw Error("Некорректный идентификатор сообщения")
return deps.transaction(async context=>{
const row=await deps.update(context,id,input.expectedVersion)
if(row===undefined)throw new OutboxRetryConflict()
const parsed=alertsOutboxRetryReceiptSchema.safeParse({ok:true,...(typeof row==="object"&&row!==null?row:{})})
if(!parsed.success||parsed.data.id!==id||parsed.data.resolutionVersion!==input.expectedVersion+1)throw Error("Постановка сообщения в очередь не подтверждена")
return parsed.data
})
}