alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
245 lines (244 loc) • 8.02 kB
JavaScript
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