/** * ProjectionProjectRepository - Projection repository interface for projects. * * Owns persistence operations for project rows in the orchestration projection * read model. * * @module ProjectionProjectRepository */ import { IsoDateTime, ModelSelection, ProjectIconOverride, ProjectId, ProjectScript, ThreadEnvMode, } 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 ProjectionProject = Schema.Struct({ projectId: ProjectId, title: Schema.String, workspaceRoot: Schema.String, defaultModelSelection: Schema.NullOr(ModelSelection), defaultThreadEnvMode: Schema.NullOr(ThreadEnvMode), autoPull: Schema.Boolean, faviconPath: Schema.optional(Schema.NullOr(Schema.String)), projectIcon: Schema.optional(Schema.NullOr(ProjectIconOverride)), scripts: Schema.Array(ProjectScript), createdAt: IsoDateTime, updatedAt: IsoDateTime, deletedAt: Schema.NullOr(IsoDateTime), }); export type ProjectionProject = typeof ProjectionProject.Type; export const GetProjectionProjectInput = Schema.Struct({ projectId: ProjectId, }); export type GetProjectionProjectInput = typeof GetProjectionProjectInput.Type; export const DeleteProjectionProjectInput = Schema.Struct({ projectId: ProjectId, }); export type DeleteProjectionProjectInput = typeof DeleteProjectionProjectInput.Type; /** * ProjectionProjectRepositoryShape - Service API for projected project records. */ export interface ProjectionProjectRepositoryShape { /** * Insert or replace a projected project row. * * Upserts by `projectId` and persists scripts through JSON encoding. */ readonly upsert: (row: ProjectionProject) => Effect.Effect; /** * Read a projected project row by id. */ readonly getById: ( input: GetProjectionProjectInput, ) => Effect.Effect, ProjectionRepositoryError>; /** * List all projected project rows. * * Returned in deterministic creation order. */ readonly listAll: () => Effect.Effect< ReadonlyArray, ProjectionRepositoryError >; /** * Soft-delete a projected project row by id. */ readonly deleteById: ( input: DeleteProjectionProjectInput, ) => Effect.Effect; } /** * ProjectionProjectRepository - Service tag for project projection persistence. */ export class ProjectionProjectRepository extends Context.Service< ProjectionProjectRepository, ProjectionProjectRepositoryShape >()("t3/persistence/Services/ProjectionProjects/ProjectionProjectRepository") {}