import type { PersistedTriggerSetupState, TriggerInstanceId, TriggerSetupStateRepository } from "@codemation/core"; import { inject, injectable } from "@codemation/core"; import { PrismaDatabaseClientToken, type PrismaDatabaseClient } from "./PrismaDatabaseClient"; type TriggerSetupStateJson = Readonly<{ state: PersistedTriggerSetupState["state"]; }>; @injectable() export class PrismaTriggerSetupStateRepository implements TriggerSetupStateRepository { constructor(@inject(PrismaDatabaseClientToken) private readonly prisma: PrismaDatabaseClient) {} async load(trigger: TriggerInstanceId): Promise { const row = await this.prisma.triggerSetupState.findUnique({ where: { workflowId_nodeId: { workflowId: trigger.workflowId, nodeId: trigger.nodeId, }, }, }); if (!row) { return undefined; } return { trigger: { workflowId: row.workflowId, nodeId: row.nodeId, }, updatedAt: row.updatedAt, state: (JSON.parse(row.stateJson) as TriggerSetupStateJson).state, }; } async save(state: PersistedTriggerSetupState): Promise { await this.prisma.triggerSetupState.upsert({ where: { workflowId_nodeId: { workflowId: state.trigger.workflowId, nodeId: state.trigger.nodeId, }, }, create: { workflowId: state.trigger.workflowId, nodeId: state.trigger.nodeId, updatedAt: state.updatedAt, stateJson: JSON.stringify({ state: state.state, } satisfies TriggerSetupStateJson), }, update: { updatedAt: state.updatedAt, stateJson: JSON.stringify({ state: state.state, } satisfies TriggerSetupStateJson), }, }); } async delete(trigger: TriggerInstanceId): Promise { await this.prisma.triggerSetupState.deleteMany({ where: { workflowId: trigger.workflowId, nodeId: trigger.nodeId, }, }); } }