chore(template): clean-slate template snapshot from bb4a0c7

Curated, product-agnostic snapshot of the post-story-04 tree: demo
content deleted, auth-only reference feature, web-next shell, all gates
green. Product-specific docs, ADRs 027-029, PRDs/epics/archive, editor
library traces, and product naming are curated out; generic template
repairs (coverage provider devDeps, root test:coverage script, live
lint fixes, root-only release-please) are kept. See TEMPLATE.md for
provenance, curation list, and usage.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016j8z4VHjedXDTjEDNg7qHK
This commit is contained in:
2026-07-12 20:40:54 +02:00
commit f77e6ea881
1062 changed files with 105156 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
import type { IDataDelete } from "../data-delete.interface";
import type { DeletionMode, DeletionCertificate } from "../dsr-types";
import type { HandlerResponse } from "./handler-types";
export type DeleteHandlerInput = {
subjectId: string;
mode: DeletionMode;
};
export function createDeleteHandler(dataDelete: IDataDelete) {
return async (
input: DeleteHandlerInput,
): Promise<HandlerResponse<DeletionCertificate>> => {
const cert = await dataDelete.deleteSubjectData(
input.subjectId,
input.mode,
);
return { status: 200, body: cert };
};
}

View File

@@ -0,0 +1,24 @@
import type { IDataExport } from "../data-export.interface";
import type { DsrFormat, UserDataBundle } from "../dsr-types";
import type { HandlerResponse } from "./handler-types";
export type ExportHandlerInput = {
subjectId: string;
format: DsrFormat;
};
export function createExportHandler(dataExport: IDataExport) {
return async (
input: ExportHandlerInput,
): Promise<HandlerResponse<UserDataBundle>> => {
const bundle = await dataExport.exportSubjectData(
input.subjectId,
input.format,
);
const headers: Record<string, string> =
input.format === "json-ld"
? { "Content-Type": "application/ld+json" }
: { "Content-Type": "application/json" };
return { status: 200, body: bundle, headers };
};
}

View File

@@ -0,0 +1,5 @@
export type HandlerResponse<T = unknown> = {
status: number;
body: T;
headers?: Record<string, string>;
};

View File

@@ -0,0 +1,23 @@
import type { IDataRectify } from "../data-rectify.interface";
import type { HandlerResponse } from "./handler-types";
export type RectifyHandlerInput = {
subjectId: string;
collection: string;
field: string;
value: unknown;
};
export function createRectifyHandler(dataRectify: IDataRectify) {
return async (
input: RectifyHandlerInput,
): Promise<HandlerResponse<{ ok: true }>> => {
await dataRectify.updateSubjectField(
input.subjectId,
input.collection,
input.field,
input.value,
);
return { status: 200, body: { ok: true as const } };
};
}

View File

@@ -0,0 +1,18 @@
import type { IProcessingRestriction } from "../processing-restriction.interface";
import type { HandlerResponse } from "./handler-types";
export type RestrictHandlerInput = {
subjectId: string;
granted: boolean;
};
export function createRestrictHandler(
processingRestriction: IProcessingRestriction,
) {
return async (
input: RestrictHandlerInput,
): Promise<HandlerResponse<{ ok: true }>> => {
await processingRestriction.setRestriction(input.subjectId, input.granted);
return { status: 200, body: { ok: true as const } };
};
}