UNPKG

alepha

Version:

Easy-to-use modern TypeScript framework for building many kind of applications.

245 lines (244 loc) 8.02 kB
import { $module, z } from "alepha"; import { $entity, db } from "alepha/orm"; //#region ../../src/api/parameters/entities/parameters.ts /** * Configuration parameter entity for versioned configuration management. * * Stores all versions of configuration parameters with: * - Status derived from activationDate at query time * - Schema versioning for migrations * - Activation scheduling * - Audit trail (creator info) */ const parameters = $entity({ name: "parameters", schema: z.object({ id: db.primaryKey(z.uuid()), createdAt: db.createdAt(), updatedAt: db.updatedAt(), /** * Tenant scope. NULLABLE on purpose (backward compatible): single-tenant * apps keep writing org-less (NULL) rows with the historic global * semantics. In a MULTI-TENANT process (e.g. one pooled worker serving * many orgs), the active tenant is stamped by the Repository * (`stampOrganization`) and reads/writes auto-filter by it — so one org's * `app.settings`/`portal.site`/… can never be read or overwritten by * another. The provider's in-memory value caches are keyed by org too. */ organizationId: db.organization(), /** * Configuration name using dot notation for tree hierarchy. * Examples: "app.features", "app.pricing.tiers", "system.limits" */ name: z.text(), /** * The configuration content as JSON. */ content: z.json(), /** * Schema version hash for detecting schema changes. * Used for auto-migration when schema evolves. */ schemaHash: z.text(), /** * When this version should become active. * Default is immediate (now). */ activationDate: z.datetime(), /** * Version number for this configuration. * Auto-incremented per config name. */ version: z.integer(), /** * Optional description of changes in this version. */ changeDescription: z.text().optional(), /** * Optional tags for filtering/categorization. */ tags: z.array(z.text()).optional(), /** * Creator user ID (if available). */ creatorId: z.uuid().optional(), /** * Creator display name for audit trail. */ creatorName: z.text().optional(), /** * Previous content before this change (for rollback reference). */ previousContent: z.json().optional(), /** * Migration log if schema changed. */ migrationLog: z.text().optional() }), indexes: [ { columns: [ "organizationId", "name", "activationDate" ] }, { columns: [ "organizationId", "name", "version" ], unique: true }, { columns: ["activationDate"] } ] }); //#endregion //#region ../../src/api/parameters/schemas/activateParameterBodySchema.ts /** * Activate parameter body schema. * * Creator fields are omitted; the controller captures the authenticated user * server-side. */ const activateParameterBodySchema = parameters.schema.pick({ version: true }); //#endregion //#region ../../src/api/parameters/schemas/createParameterVersionBodySchema.ts /** * Create parameter version body schema. * Uses z.pick to derive from entity, with required fields made non-optional. * * Creator fields are intentionally omitted: the controller captures the * authenticated user server-side, so they cannot be spoofed by the client. */ const createParameterVersionBodySchema = parameters.schema.pick({ content: true, schemaHash: true, changeDescription: true, tags: true }).extend({ activationDate: z.datetime().describe("When to activate (default: now)").optional() }); //#endregion //#region ../../src/api/parameters/schemas/parameterCreatorSummarySchema.ts /** * Slim view of a parameter version's creator, embedded by the admin history * endpoint via a best-effort left join (`parameters.creatorId` → `users.id`) * so the UI can render a human-readable identifier (and link) instead of a * bare UUID. * * Optional end-to-end: the join only runs when the `users` entity is * registered in the running app (see `ParameterProvider.resolveCreatorJoin`), * and a version whose creator was deleted — or who lives in a non-default * realm — comes back with `creator` undefined. Callers fall back to the raw * `creatorId`. */ const parameterCreatorSummarySchema = z.object({ id: z.uuid(), email: z.string().meta({ format: "email" }).optional(), username: z.shortText({ minLength: 3, maxLength: 30 }).optional(), firstName: z.string().optional(), lastName: z.string().optional() }); //#endregion //#region ../../src/api/parameters/schemas/parameterStatusSchema.ts /** * Parameter status enum schema. */ const parameterStatusSchema = z.enum([ "expired", "current", "next", "future" ]); //#endregion //#region ../../src/api/parameters/schemas/parameterResponseSchema.ts /** * Parameter response schema for API responses. * Extends the entity schema with a calculated status field. * Status is derived from activationDate at query time, not stored. * * `creator` is embedded on read via a best-effort left join on `creatorId` * (see `parameterCreatorSummarySchema`); it is not a stored column. */ const parameterResponseSchema = parameters.schema.extend({ status: parameterStatusSchema, creator: parameterCreatorSummarySchema.optional() }); //#endregion //#region ../../src/api/parameters/schemas/parameterCurrentResponseSchema.ts /** * Current parameter response schema. * Includes current version, next scheduled version, and defaults. */ const parameterCurrentResponseSchema = z.object({ current: parameterResponseSchema.optional(), next: parameterResponseSchema.optional(), defaultValue: z.json().optional(), currentValue: z.json().optional(), schema: z.json().optional() }); //#endregion //#region ../../src/api/parameters/schemas/parameterHistoryResponseSchema.ts /** * Parameter history response schema. */ const parameterHistoryResponseSchema = z.object({ versions: z.array(parameterResponseSchema) }); //#endregion //#region ../../src/api/parameters/schemas/parameterNameParamSchema.ts /** * Parameter name param schema. * Uses z.pick from entity for consistency. */ const parameterNameParamSchema = parameters.schema.pick({ name: true }); //#endregion //#region ../../src/api/parameters/schemas/parameterNamesResponseSchema.ts /** * Parameter names list response schema. */ const parameterNamesResponseSchema = z.object({ names: z.array(z.text()) }); //#endregion //#region ../../src/api/parameters/schemas/parameterTreeNodeSchema.ts /** * Tree node schema for parameter tree navigation. */ const parameterTreeNodeSchema = z.object({ name: z.text(), path: z.text(), isLeaf: z.boolean(), children: z.array(z.any()) }); //#endregion //#region ../../src/api/parameters/schemas/parameterVersionParamSchema.ts /** * Parameter name and version param schema. * Uses z.pick from entity for consistency. */ const parameterVersionParamSchema = parameters.schema.pick({ name: true, version: true }); //#endregion //#region ../../src/api/parameters/schemas/parameterVersionResponseSchema.ts /** * Parameter version response schema. */ const parameterVersionResponseSchema = z.object({ parameter: parameterResponseSchema.optional() }); //#endregion //#region ../../src/api/parameters/schemas/rollbackParameterBodySchema.ts /** * Rollback parameter body schema. * * Creator fields are omitted; the controller captures the authenticated user * server-side. */ const rollbackParameterBodySchema = parameters.schema.pick({ changeDescription: true }).extend({ targetVersion: z.integer().describe("Version number to rollback to") }); //#endregion //#region ../../src/api/parameters/index.browser.ts const AlephaApiParameters = $module({ name: "alepha.api.parameters", services: [] }); //#endregion export { AlephaApiParameters, activateParameterBodySchema, createParameterVersionBodySchema, parameterCurrentResponseSchema, parameterHistoryResponseSchema, parameterNameParamSchema, parameterNamesResponseSchema, parameterResponseSchema, parameterStatusSchema, parameterTreeNodeSchema, parameterVersionParamSchema, parameterVersionResponseSchema, parameters, rollbackParameterBodySchema }; //# sourceMappingURL=index.browser.js.map