UNPKG

alepha

Version:

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

1,076 lines 56.4 kB
import { Alepha, KIND, Primitive, Static, TNull, TObject, TOptional, TSchema, TUnion } from "alepha"; import { Page } from "alepha/orm"; import { ServerRequest } from "alepha/server"; import { BuildExtraConfigColumns, SQL } from "drizzle-orm"; import { PgColumnBuilderBase, PgSequenceOptions, PgTableExtraConfigValue, UpdateDeleteAction } from "drizzle-orm/pg-core"; import "drizzle-orm/pg-core/foreign-keys"; import "alepha/datetime"; import "drizzle-orm/pg-core/session"; import "alepha/crypto"; import "drizzle-kit/api"; import "drizzle-orm/d1"; import "drizzle-orm/sqlite-core"; //#region ../../src/api/audits/entities/audits.d.ts /** * Audit severity levels for categorizing events. */ declare const auditSeveritySchema: import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>; type AuditSeverity = Static<typeof auditSeveritySchema>; /** * Audit log entity for tracking important system events. * * Stores comprehensive audit information including: * - Who performed the action (userId, userRealm) * - What happened (type, action, resource) * - When it happened (createdAt) * - Context and details (metadata, ipAddress, userAgent) */ declare const audits: import("alepha/orm").EntityPrimitive<import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>>; declare const auditEntitySchema: import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; declare const auditEntityInsertSchema: import("alepha/orm").TObjectInsert<import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>>; type AuditEntity = Static<typeof audits.schema>; //#endregion //#region ../../src/api/audits/schemas/auditQuerySchema.d.ts /** * Query schema for searching and filtering audit logs. */ declare const auditQuerySchema: import("zod").ZodObject<{ page: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>; size: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>; sort: import("zod").ZodOptional<import("zod").ZodString>; type: import("zod").ZodOptional<import("zod").ZodString>; action: import("zod").ZodOptional<import("zod").ZodString>; severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; success: import("zod").ZodOptional<import("zod").ZodBoolean>; from: import("zod").ZodOptional<import("zod").ZodString>; to: import("zod").ZodOptional<import("zod").ZodString>; search: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; type AuditQuery = Static<typeof auditQuerySchema>; //#endregion //#region ../../src/api/audits/schemas/createAuditSchema.d.ts /** * Schema for creating a new audit log entry. */ declare const createAuditSchema: import("zod").ZodObject<{ type: import("zod").ZodString; action: import("zod").ZodString; severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("zod").ZodOptional<import("zod").ZodBoolean>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; type CreateAudit = Static<typeof createAuditSchema>; //#endregion //#region ../../src/api/audits/services/AuditService.d.ts /** * Registered audit type definition. */ interface AuditTypeDefinition { type: string; description?: string; actions: string[]; /** * Dedicated retention (in days) for this audit type. * * Overrides the global default applied by the cleanup job. `0` keeps entries * forever. When `undefined`, the global default retention applies. */ retentionDays?: number; } /** * Service for managing audit logs. * * Provides methods for: * - Creating audit entries * - Querying audit history * - Aggregating audit statistics * - Managing registered audit types */ declare class AuditService { protected readonly alepha: Alepha; protected readonly log: import("alepha/logger").Logger; protected readonly repo: import("alepha/orm").Repository<import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>>; /** * Registry of audit types and their allowed actions. */ protected readonly auditTypes: Map<string, AuditTypeDefinition>; /** * Register an audit type with its allowed actions. */ registerType(definition: AuditTypeDefinition): void; /** * Get all registered audit types. */ getRegisteredTypes(): AuditTypeDefinition[]; /** * Distinct action names across all registered audit types, sorted. * * Sourced from the `$audit` type registry. Audit types register lazily — * when their holder (e.g. `SessionAudits`, `ParameterAudits`) is first * injected — so the admin filter only lists actions for audit domains that * are actually in use, which is the intended behaviour. */ getDistinctActions(): string[]; /** * Get current request context if available. */ protected getRequestContext(): ServerRequest | undefined; /** * Create a new audit log entry. * Automatically populates ipAddress, userAgent, and requestId from the current request context. */ create(data: CreateAudit): Promise<AuditEntity>; /** * Record an audit event (convenience method). */ record(type: string, action: string, options?: Omit<CreateAudit, "type" | "action">): Promise<AuditEntity>; /** * Find audit entries with filtering and pagination. */ find(query?: AuditQuery): Promise<Page<AuditEntity>>; /** * Get audit entry by ID. */ getById(id: string): Promise<AuditEntity>; /** * Get audit entries for a specific user. */ findByUser(userId: string, query?: Omit<AuditQuery, "userId">): Promise<Page<AuditEntity>>; /** * Get audit entries for a specific resource. */ findByResource(resourceType: string, resourceId: string, query?: Omit<AuditQuery, "resourceType" | "resourceId">): Promise<Page<AuditEntity>>; /** * Get audit statistics for a time period. */ getStats(options?: { from?: Date; to?: Date; userRealm?: string; }): Promise<AuditStats>; /** * Delete audit entries created before the given date (retention policy). * * @returns number of deleted entries. */ deleteOlderThan(date: Date): Promise<number>; /** * Delete audit entries that have outlived their retention window. * * Each registered audit type that declares a dedicated `retentionDays` is * pruned using its own window; every other type — including unregistered or * legacy types — falls back to `defaultRetentionDays`. A retention of `0` * (per-type or default) keeps that scope forever. * * `now` is injected rather than read from the clock so the policy is * deterministic and testable. * * @param now - reference "now" used to compute cutoff dates. * @param defaultRetentionDays - global default for types without an override. * @returns total number of deleted entries. */ deleteExpired(now: Date, defaultRetentionDays: number): Promise<number>; } /** * Audit statistics summary. */ interface AuditStats { total: number; byType: Record<string, number>; bySeverity: Record<AuditSeverity, number>; successRate: number; recentFailures: AuditEntity[]; } //#endregion //#region ../../src/api/audits/controllers/AdminAuditController.d.ts /** * REST API controller for audit log management. * * Provides endpoints for: * - Querying audit logs with filtering * - Creating audit entries * - Getting audit statistics * - Viewing registered audit types */ declare class AdminAuditController { protected readonly url = "/audits"; protected readonly group = "admin:audits"; protected readonly auditService: AuditService; protected readonly repo: import("alepha/orm").Repository<import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>>; /** * Find audit entries with filtering and pagination. */ readonly findAudits: import("alepha/server").ActionPrimitiveFn<{ query: import("zod").ZodObject<{ page: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>; size: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>; sort: import("zod").ZodOptional<import("zod").ZodString>; type: import("zod").ZodOptional<import("zod").ZodString>; action: import("zod").ZodOptional<import("zod").ZodString>; severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; success: import("zod").ZodOptional<import("zod").ZodBoolean>; from: import("zod").ZodOptional<import("zod").ZodString>; to: import("zod").ZodOptional<import("zod").ZodString>; search: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; response: import("zod").ZodObject<{ content: import("zod").ZodArray<import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>>; page: import("zod").ZodObject<{ number: import("zod").ZodInt; size: import("zod").ZodInt; offset: import("zod").ZodInt; numberOfElements: import("zod").ZodInt; totalElements: import("zod").ZodOptional<import("zod").ZodInt>; totalPages: import("zod").ZodOptional<import("zod").ZodInt>; isEmpty: import("zod").ZodBoolean; isFirst: import("zod").ZodBoolean; isLast: import("zod").ZodBoolean; }, import("zod/v4/core").$strip>; }, import("zod/v4/core").$strip>; }>; /** * Get a single audit entry by ID. */ readonly getAudit: import("alepha/server").ActionPrimitiveFn<{ params: import("zod").ZodObject<{ id: import("zod").ZodString; }, import("zod/v4/core").$strip>; response: import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; }>; /** * Delete many audit entries by id in one repository call. Use with care — * audit logs are usually retained for compliance reasons. */ readonly deleteAudits: import("alepha/server").ActionPrimitiveFn<{ body: import("zod").ZodObject<{ ids: import("zod").ZodArray<import("zod").ZodString>; }, import("zod/v4/core").$strip>; response: import("zod").ZodObject<{ deleted: import("zod").ZodArray<import("zod").ZodString>; }, import("zod/v4/core").$strip>; }>; /** * Create a new audit entry. * System-only — this permission should never be assigned to human roles. */ readonly createAudit: import("alepha/server").ActionPrimitiveFn<{ body: import("zod").ZodObject<{ type: import("zod").ZodString; action: import("zod").ZodString; severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("zod").ZodOptional<import("zod").ZodBoolean>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; response: import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; }>; /** * Get audit entries for a specific user. */ readonly findByUser: import("alepha/server").ActionPrimitiveFn<{ params: import("zod").ZodObject<{ userId: import("zod").ZodString; }, import("zod/v4/core").$strip>; query: import("zod").ZodObject<{ page: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>; size: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>; sort: import("zod").ZodOptional<import("zod").ZodString>; type: import("zod").ZodOptional<import("zod").ZodString>; action: import("zod").ZodOptional<import("zod").ZodString>; severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; success: import("zod").ZodOptional<import("zod").ZodBoolean>; from: import("zod").ZodOptional<import("zod").ZodString>; to: import("zod").ZodOptional<import("zod").ZodString>; search: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; response: import("zod").ZodObject<{ content: import("zod").ZodArray<import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>>; page: import("zod").ZodObject<{ number: import("zod").ZodInt; size: import("zod").ZodInt; offset: import("zod").ZodInt; numberOfElements: import("zod").ZodInt; totalElements: import("zod").ZodOptional<import("zod").ZodInt>; totalPages: import("zod").ZodOptional<import("zod").ZodInt>; isEmpty: import("zod").ZodBoolean; isFirst: import("zod").ZodBoolean; isLast: import("zod").ZodBoolean; }, import("zod/v4/core").$strip>; }, import("zod/v4/core").$strip>; }>; /** * Get audit entries for a specific resource. */ readonly findByResource: import("alepha/server").ActionPrimitiveFn<{ params: import("zod").ZodObject<{ resourceType: import("zod").ZodString; resourceId: import("zod").ZodString; }, import("zod/v4/core").$strip>; query: import("zod").ZodObject<{ page: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>; size: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodInt>>; sort: import("zod").ZodOptional<import("zod").ZodString>; type: import("zod").ZodOptional<import("zod").ZodString>; action: import("zod").ZodOptional<import("zod").ZodString>; severity: import("zod").ZodOptional<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; success: import("zod").ZodOptional<import("zod").ZodBoolean>; from: import("zod").ZodOptional<import("zod").ZodString>; to: import("zod").ZodOptional<import("zod").ZodString>; search: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; response: import("zod").ZodObject<{ content: import("zod").ZodArray<import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>>; page: import("zod").ZodObject<{ number: import("zod").ZodInt; size: import("zod").ZodInt; offset: import("zod").ZodInt; numberOfElements: import("zod").ZodInt; totalElements: import("zod").ZodOptional<import("zod").ZodInt>; totalPages: import("zod").ZodOptional<import("zod").ZodInt>; isEmpty: import("zod").ZodBoolean; isFirst: import("zod").ZodBoolean; isLast: import("zod").ZodBoolean; }, import("zod/v4/core").$strip>; }, import("zod/v4/core").$strip>; }>; /** * Get audit statistics. */ readonly getAuditStats: import("alepha/server").ActionPrimitiveFn<{ query: import("zod").ZodObject<{ from: import("zod").ZodOptional<import("zod").ZodString>; to: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>; response: import("zod").ZodObject<{ total: import("zod").ZodInt; byType: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodInt>; bySeverity: import("zod").ZodObject<{ info: import("zod").ZodInt; warning: import("zod").ZodInt; critical: import("zod").ZodInt; }, import("zod/v4/core").$strip>; successRate: import("zod").ZodNumber; recentFailures: import("zod").ZodArray<import("zod").ZodObject<{ id: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_PRIMARY_KEY>, typeof import("alepha/orm").PG_DEFAULT>; createdAt: import("alepha/orm").PgAttr<import("alepha/orm").PgAttr<import("zod").ZodString, typeof import("alepha/orm").PG_CREATED_AT>, typeof import("alepha/orm").PG_DEFAULT>; organizationId: import("alepha/orm").PgAttr<import("zod").ZodOptional<import("zod").ZodString> | import("zod").ZodString, typeof import("alepha/orm").PG_ORGANIZATION>; type: import("zod").ZodString; action: import("zod").ZodString; severity: import("alepha/orm").PgAttr<import("zod").ZodDefault<import("zod").ZodEnum<{ critical: "critical"; info: "info"; warning: "warning"; }>>, typeof import("alepha/orm").PG_DEFAULT>; userId: import("zod").ZodOptional<import("zod").ZodString>; userRealm: import("zod").ZodOptional<import("zod").ZodString>; userEmail: import("zod").ZodOptional<import("zod").ZodString>; resourceType: import("zod").ZodOptional<import("zod").ZodString>; resourceId: import("zod").ZodOptional<import("zod").ZodString>; description: import("zod").ZodOptional<import("zod").ZodString>; metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>>; ipAddress: import("zod").ZodOptional<import("zod").ZodString>; userAgent: import("zod").ZodOptional<import("zod").ZodString>; sessionId: import("zod").ZodOptional<import("zod").ZodString>; requestId: import("zod").ZodOptional<import("zod").ZodString>; success: import("alepha/orm").PgAttr<import("zod").ZodBoolean, typeof import("alepha/orm").PG_DEFAULT>; errorMessage: import("zod").ZodOptional<import("zod").ZodString>; }, import("zod/v4/core").$strip>>; }, import("zod/v4/core").$strip>; }>; /** * List distinct action names present in the audit log (for filters). */ readonly getAuditActions: import("alepha/server").ActionPrimitiveFn<{ response: import("zod").ZodArray<import("zod").ZodString>; }>; /** * Get registered audit types. */ readonly getTypes: import("alepha/server").ActionPrimitiveFn<{ response: import("zod").ZodArray<import("zod").ZodObject<{ type: import("zod").ZodString; description: import("zod").ZodOptional<import("zod").ZodString>; actions: import("zod").ZodArray<import("zod").ZodString>; }, import("zod/v4/core").$strip>>; }>; /** * Get distinct values for filters. */ readonly getFilterOptions: import("alepha/server").ActionPrimitiveFn<{ response: import("zod").ZodObject<{ types: import("zod").ZodArray<import("zod").ZodString>; actions: import("zod").ZodArray<import("zod").ZodString>; resourceTypes: import("zod").ZodArray<import("zod").ZodString>; userRealms: import("zod").ZodArray<import("zod").ZodString>; }, import("zod/v4/core").$strip>; }>; } //#endregion //#region ../../src/api/audits/parameters/AuditParameters.d.ts /** * Audit module configuration atom. */ declare const auditOptions: import("alepha").Atom<import("zod").ZodObject<{ retentionDays: import("zod").ZodDefault<import("zod").ZodInt>; }, import("zod/v4/core").$strip>, "alepha.api.audits.options">; type AuditOptions = Static<typeof auditOptions.schema>; declare module "alepha" { interface State { [auditOptions.key]: AuditOptions; } } /** * Typed accessor for audit module configuration ({@link auditOptions}). */ declare class AuditParameters { protected readonly options: Readonly<{ retentionDays: number; }>; get<K extends keyof AuditOptions>(key: K): AuditOptions[K]; } //#endregion //#region ../../src/api/audits/jobs/AuditJobs.d.ts /** * Scheduled enforcement of the audit retention policy. */ declare class AuditJobs { protected readonly auditService: AuditService; protected readonly auditParameters: AuditParameters; /** * Delete audit entries that have outlived their retention window. * * Runs daily and applies each audit type's dedicated `retentionDays` plus the * global default (`auditOptions.retentionDays`). A default of `0` disables * cleanup for types without a dedicated retention. */ readonly cleanExpired: import("alepha/scheduler").SchedulerPrimitive; } //#endregion //#region ../../src/api/audits/primitives/$audit.d.ts /** * Options for creating an audit type primitive. */ interface AuditPrimitiveOptions { /** * Unique audit type identifier (e.g., "auth", "payment", "order"). */ type: string; /** * Human-readable description of this audit type. */ description?: string; /** * List of allowed actions for this audit type. */ actions: string[]; /** * Number of days entries of this audit type are retained before the periodic * cleanup job deletes them. * * Overrides the global default retention (see `auditOptions.retentionDays` in * `AuditParameters`). Set to `0` to keep this type's entries forever, * regardless of the global default. When omitted, the global default applies. * * @example * ```ts * // Keep security audits for two years, ignoring the global default. * $audit({ type: "security", actions: ["login"], retentionDays: 730 }); * ``` */ retentionDays?: number; } /** * Audit type primitive for registering domain-specific audit events. * * Provides a type-safe way to define and log audit events within a specific domain. * * @example * ```ts * class PaymentAudits { * audit = $audit({ * type: "payment", * description: "Payment-related audit events", * actions: ["create", "refund", "cancel", "dispute"], * }); * * async logPaymentCreated(paymentId: string, userId: string, amount: number) { * await this.audit.log("create", { * userId, * resourceType: "payment", * resourceId: paymentId, * description: `Payment of ${amount} created`, * metadata: { amount }, * }); * } * } * ``` */ declare class AuditPrimitive extends Primitive<AuditPrimitiveOptions> { protected readonly auditService: AuditService; /** * The audit type identifier. */ get type(): string; /** * The audit type description. */ get description(): string | undefined; /** * The allowed actions for this audit type. */ get actions(): string[]; /** * The dedicated retention (in days) for this audit type, if set. */ get retentionDays(): number | undefined; /** * Log an audit event for this type. */ log(action: string, options?: AuditLogOptions): Promise<void>; /** * Log a successful audit event. */ logSuccess(action: string, options?: Omit<AuditLogOptions, "success">): Promise<void>; /** * Log a failed audit event. */ logFailure(action: string, errorMessage: string, options?: Omit<AuditLogOptions, "success" | "errorMessage">): Promise<void>; /** * Called during initialization to register this audit type. */ protected onInit(): void; } /** * Options for logging an audit event. */ interface AuditLogOptions { severity?: "info" | "warning" | "critical"; userId?: string; userRealm?: string; userEmail?: string; resourceType?: string; resourceId?: string; description?: string; metadata?: Record<string, unknown>; ipAddress?: string; userAgent?: string; sessionId?: string; requestId?: string; success?: boolean; errorMessage?: string; } /** * Create an audit type primitive. * * @example * ```ts * class OrderAudits { * audit = $audit({ * type: "order", * description: "Order management events", * actions: ["create", "update", "cancel", "fulfill", "ship"], * }); * } * ``` */ declare const $audit: { (options: AuditPrimitiveOptions): AuditPrimitive; [KIND]: typeof AuditPrimitive; }; //#endregion //#region ../../src/orm/core/schemas/insertSchema.d.ts /** * Transforms a TObject schema for insert operations. * All default properties at the root level are made optional. * Generated columns are excluded entirely. * * @example * Before: { name: string; age: number(default=0); fullName: generated } * After: { name: string; age?: number; } */ type TObjectInsert<T extends TObject> = TObject<{ [K in keyof T["shape"] as T["shape"][K] extends { [PG_GENERATED]: any; } ? never : K]: T["shape"][K] extends { [PG_DEFAULT]: any; } | { [PG_ORGANIZATION]: any; } ? TOptional<Extract<T["shape"][K], TSchema>> : T["shape"][K]; }>; //#endregion //#region ../../src/orm/core/schemas/updateSchema.d.ts /** * Transforms a TObject schema for update operations. * All optional properties at the root level are made nullable (i.e., `T | null`). * Generated columns are excluded entirely. * * @example * Before: { name?: string; age: number; fullName: generated } * After: { name?: string | null; age: number; } */ type TObjectUpdate<T extends TObject> = TObject<{ [K in keyof T["shape"] as T["shape"][K] extends { [PG_GENERATED]: any; } ? never : K]: T["shape"][K] extends TOptional<infer U extends TSchema> ? TOptional<TUnion<[U, TNull]>> : T["shape"][K]; }>; //#endregion //#region ../../src/orm/core/primitives/$entity.d.ts interface EntityPrimitiveOptions<T extends TObject, Keys = keyof Static<T>> { /** * The database table name that will be created for this entity. * If not provided, name will be inferred from the $repository variable name. */ name: string; /** * TypeBox schema defining the table structure and column types. */ schema: T; /** * Database indexes to create for query optimization. */ indexes?: (Keys | { /** * Single column to index. */ column: Keys; /** * Whether this should be a unique index (enforces uniqueness constraint). */ unique?: boolean; /** * Custom name for the index. If not provided, generates name automatically. */ name?: string; /** * Partial index condition. Only rows matching this SQL expression are indexed. */ where?: SQL; } | { /** * Multiple columns for composite index (order matters for query optimization). */ columns: Keys[]; /** * Whether this should be a unique index (enforces uniqueness constraint). */ unique?: boolean; /** * Custom name for the index. If not provided, generates name automatically. */ name?: string; /** * Partial index condition. Only rows matching this SQL expression are indexed. */ where?: SQL; } | { /** * SQL expressions for expression-based indexes. * * Can include column references and SQL functions like `LOWER()`, `UPPER()`, etc. * Columns and expressions can be mixed together. * * @example * ```ts * // Case-insensitive unique username per realm * indexes: [{ * expressions: (self) => [self.realm, sql`LOWER(${self.username})`], * unique: true, * name: "users_realm_username_lower_idx", * }] * ``` */ expressions: (self: Record<Keys & string, any>) => (SQL | any)[]; /** * Whether this should be a unique index (enforces uniqueness constraint). */ unique?: boolean; /** * Custom name for the index. If not provided, generates name automatically. */ name: string; /** * Partial index condition. Only rows matching this SQL expression are indexed. */ where?: SQL; })[]; /** * Foreign key constraints to maintain referential integrity. */ foreignKeys?: Array<{ /** * Optional name for the foreign key constraint. */ name?: string; /** * Local columns that reference the foreign table. */ columns: Array<keyof Static<T>>; /** * Referenced columns in the foreign table. * Must be EntityColumn references from other entities. */ foreignColumns: Array<() => EntityColumn<any>>; }>; /** * Additional table constraints for data validation. * * Constraints enforce business rules at the database level, providing * an additional layer of data integrity beyond application validation. * * **Constraint Types**: * - **Unique constraints**: Prevent duplicate values across columns * - **Check constraints**: Enforce custom validation rules with SQL expressions * * @example * ```ts * constraints: [ * { * name: "unique_user_email", * columns: ["email"], * unique: true * }, * { * name: "valid_age_range", * columns: ["age"], * check: sql`age >= 0 AND age <= 150` * }, * { * name: "unique_user_username_per_tenant", * columns: ["tenantId", "username"], * unique: true * } * ] * ``` */ constraints?: Array<{ /** * Columns involved in this constraint. */ columns: Array<keyof Static<T>>; /** * Optional name for the constraint. */ name?: string; /** * Whether this is a unique constraint. */ unique?: boolean | {}; /** * SQL expression for check constraint validation. */ check?: SQL; }>; /** * Advanced Drizzle ORM configuration for complex table setups. */ config?: (self: BuildExtraConfigColumns<string, FromSchema<T>, "pg">) => PgTableExtraConfigValue[]; } declare class EntityPrimitive<T extends TObject = TObject> { readonly options: EntityPrimitiveOptions<T>; constructor(options: EntityPrimitiveOptions<T>); alias(alias: string): this; get cols(): EntityColumns<T>; get name(): string; get schema(): T; protected _insertSchema?: TObjectInsert<T>; get insertSchema(): TObjectInsert<T>; protected _updateSchema?: TObjectUpdate<