/** * 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<void, ProjectionRepositoryError>; /** * Read a projected project row by id. */ readonly getById: ( input: GetProjectionProjectInput, ) => Effect.Effect<Option.Option<ProjectionProject>, ProjectionRepositoryError>; /** * List all projected project rows. * * Returned in deterministic creation order. */ readonly listAll: () => Effect.Effect< ReadonlyArray<ProjectionProject>, ProjectionRepositoryError >; /** * Soft-delete a projected project row by id. */ readonly deleteById: ( input: DeleteProjectionProjectInput, ) => Effect.Effect<void, ProjectionRepositoryError>;} /** * ProjectionProjectRepository - Service tag for project projection persistence. */export class ProjectionProjectRepository extends Context.Service< ProjectionProjectRepository, ProjectionProjectRepositoryShape>()("t3/persistence/Services/ProjectionProjects/ProjectionProjectRepository") {}
/**
* 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<void, ProjectionRepositoryError>;
/**
* Read a projected project row by id.
*/
readonly getById: (
input: GetProjectionProjectInput,
) => Effect.Effect<Option.Option<ProjectionProject>, ProjectionRepositoryError>;
/**
* List all projected project rows.
*
* Returned in deterministic creation order.
*/
readonly listAll: () => Effect.Effect<
ReadonlyArray<ProjectionProject>,
ProjectionRepositoryError
>;
/**
* Soft-delete a projected project row by id.
*/
readonly deleteById: (
input: DeleteProjectionProjectInput,
) => Effect.Effect<void, ProjectionRepositoryError>;
}
/**
* ProjectionProjectRepository - Service tag for project projection persistence.
*/
export class ProjectionProjectRepository extends Context.Service<
ProjectionProjectRepository,
ProjectionProjectRepositoryShape
>()("t3/persistence/Services/ProjectionProjects/ProjectionProjectRepository") {}