import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/core"; import { cancel } from "../domain/inboundShipment"; import type { Transaction } from "../generated/kysely-tailordb"; import { InvalidStatusError } from "../lib/errors.generated"; import { createInboundShipmentRepository, type InboundShipmentRepository, } from "../repository/inboundShipmentRepository"; export interface CancelInboundShipmentInput { id: string; } export async function run( db: Transaction, input: CancelInboundShipmentInput, _ctx: CommandContext, repositoryFactory: ( db: Transaction, ) => InboundShipmentRepository = createInboundShipmentRepository, ) { const repository = repositoryFactory(db); const shipment = await repository.findById(input.id, { forUpdate: true }); if (!shipment) { return err(new InvalidStatusError(input.id)); } const cancelled = cancel(shipment); if (!cancelled.ok) { return cancelled; } await repository.save(cancelled.value); return ok({ inboundShipmentId: cancelled.value.id }); }