14 lines
1.3 KiB
TypeScript
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
|
|
})
|
|
}
|