/** * ProjectionStateRepository - Projection repository interface for projector cursors. * * Owns persistence operations for projection cursor state used to resume * incremental event projection. * * @module ProjectionStateRepository */ import { IsoDateTime, NonNegativeInt } from "@t3tools/contracts"; import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; import * as Context from "effect/Context"; import type * as Effect from "effect/Effect"; import type { ProjectionRepositoryError } from "../Errors.ts"; export const ProjectionState = Schema.Struct({ projector: Schema.String, lastAppliedSequence: NonNegativeInt, updatedAt: IsoDateTime, }); export type ProjectionState = typeof ProjectionState.Type; export const GetProjectionStateInput = Schema.Struct({ projector: Schema.String, }); export type GetProjectionStateInput = typeof GetProjectionStateInput.Type; /** * ProjectionStateRepositoryShape - Service API for projector state records. */ export interface ProjectionStateRepositoryShape { /** * Insert or replace a projection cursor row. * * Upserts by projector name. */ readonly upsert: (row: ProjectionState) => Effect.Effect; /** * Read projection cursor state for a projector key. */ readonly getByProjector: ( input: GetProjectionStateInput, ) => Effect.Effect, ProjectionRepositoryError>; /** * List all projector cursor rows. */ readonly listAll: () => Effect.Effect, ProjectionRepositoryError>; /** * Read the minimum applied sequence across all projectors. * * Returns `null` when no projector state rows exist. */ readonly minLastAppliedSequence: () => Effect.Effect; } /** * ProjectionStateRepository - Service tag for projection cursor persistence. */ export class ProjectionStateRepository extends Context.Service< ProjectionStateRepository, ProjectionStateRepositoryShape >()("t3/persistence/Services/ProjectionState/ProjectionStateRepository") {}