@open-mercato/shared 0.4.9-develop-fefbbe0979 → 0.4.9-develop-db9ecc46fc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/lib/auth/server.js +1 -1
  2. package/dist/lib/auth/server.js.map +1 -1
  3. package/dist/lib/crud/custom-route-interceptor.js +27 -0
  4. package/dist/lib/crud/custom-route-interceptor.js.map +7 -0
  5. package/dist/lib/crud/errors.js +8 -1
  6. package/dist/lib/crud/errors.js.map +2 -2
  7. package/dist/lib/crud/factory.js +2 -2
  8. package/dist/lib/crud/factory.js.map +2 -2
  9. package/dist/lib/middleware/page-executor.js +42 -0
  10. package/dist/lib/middleware/page-executor.js.map +7 -0
  11. package/dist/lib/version.js +1 -1
  12. package/dist/lib/version.js.map +1 -1
  13. package/dist/modules/generators/index.js +1 -0
  14. package/dist/modules/generators/index.js.map +7 -0
  15. package/dist/modules/generators/types.js +1 -0
  16. package/dist/modules/generators/types.js.map +7 -0
  17. package/dist/modules/middleware/page.js +15 -0
  18. package/dist/modules/middleware/page.js.map +7 -0
  19. package/dist/modules/widgets/component-registry.js +12 -1
  20. package/dist/modules/widgets/component-registry.js.map +2 -2
  21. package/package.json +5 -1
  22. package/src/lib/auth/server.ts +1 -1
  23. package/src/lib/crud/__tests__/custom-route-interceptor.test.ts +180 -0
  24. package/src/lib/crud/custom-route-interceptor.ts +47 -0
  25. package/src/lib/crud/errors.ts +14 -0
  26. package/src/lib/crud/factory.ts +2 -2
  27. package/src/lib/middleware/__tests__/page-executor.test.ts +161 -0
  28. package/src/lib/middleware/page-executor.ts +63 -0
  29. package/src/modules/generators/index.ts +1 -0
  30. package/src/modules/generators/types.ts +29 -0
  31. package/src/modules/middleware/page.ts +52 -0
  32. package/src/modules/widgets/component-registry.ts +15 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/crud/factory.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\nimport type { AwilixContainer } from 'awilix'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { buildScopedWhere } from '@open-mercato/shared/lib/api/crud'\nimport { getAuthFromCookies, getAuthFromRequest, type AuthContext } from '@open-mercato/shared/lib/auth/server'\nimport type { QueryEngine, Where, Sort, Page, QueryCustomFieldSource, QueryJoinEdge } from '@open-mercato/shared/lib/query/types'\nimport { SortDir } from '@open-mercato/shared/lib/query/types'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { resolveOrganizationScopeForRequest, type OrganizationScope } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { serializeOperationMetadata } from '@open-mercato/shared/lib/commands/operationMetadata'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport {\n runMutationGuards,\n bridgeLegacyGuard,\n type MutationGuard,\n type MutationGuardAfterInput,\n} from './mutation-guard-registry'\nimport { getAllMutationGuardInstances } from './mutation-guard-store'\nimport { getAllSyncSubscribers } from './sync-subscriber-store'\nimport { collectSyncSubscribers, runSyncBeforeEvent, runSyncAfterEvent } from './sync-event-runner'\nimport type { SyncCrudEventPayload } from './sync-event-types'\nimport type { RateLimitConfig } from '@open-mercato/shared/lib/ratelimit/types'\nimport type {\n CrudEventAction,\n CrudEventsConfig,\n CrudIndexerConfig,\n CrudIdentifierResolver,\n} from './types'\nimport {\n extractCustomFieldValuesFromPayload,\n extractAllCustomFieldEntries,\n decorateRecordWithCustomFields,\n loadCustomFieldDefinitionIndex,\n} from './custom-fields'\nimport { serializeExport, normalizeExportFormat, defaultExportFilename, ensureColumns, type CrudExportFormat, type PreparedExport } from './exporters'\nimport { CrudHttpError } from './errors'\nimport type { CommandBus, CommandLogMetadata } from '@open-mercato/shared/lib/commands'\nimport type { EntityId } from '@open-mercato/shared/modules/entities'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport {\n buildCollectionTags,\n buildRecordTag,\n canonicalizeResourceTag,\n debugCrudCache,\n deriveResourceFromCommandId,\n expandResourceAliases,\n invalidateCrudCache,\n isCrudCacheDebugEnabled,\n isCrudCacheEnabled,\n normalizeIdentifierValue,\n normalizeTagSegment,\n resolveCrudCache,\n} from './cache'\nimport { deriveCrudSegmentTag } from './cache-stats'\nimport { createProfiler, shouldEnableProfiler, type Profiler } from '@open-mercato/shared/lib/profiler'\nimport { getTranslationOverlayPlugin } from '@open-mercato/shared/lib/localization/overlay-plugin'\nimport { applyResponseEnrichers, applyResponseEnricherToRecord } from './enricher-runner'\nimport type { EnricherContext } from './response-enricher'\nimport type { ApiInterceptorMethod, InterceptorRequest, InterceptorResponse } from './api-interceptor'\nimport { runApiInterceptorsAfter, runApiInterceptorsBefore } from './interceptor-runner'\nimport { mergeIdFilter, parseIdsParam } from './ids'\nimport { parseExtensionHeaders } from '../umes/extension-headers'\n\ntype RbacServiceLike = {\n getGrantedFeatures: (userId: string, opts: { tenantId: string | null; organizationId: string | null }) => Promise<string[]>\n}\n\nexport type CrudHooks<TCreate, TUpdate, TList> = {\n beforeList?: (q: TList, ctx: CrudCtx) => Promise<void> | void\n afterList?: (res: any, ctx: CrudCtx & { query: TList }) => Promise<void> | void\n beforeCreate?: (input: TCreate, ctx: CrudCtx) => Promise<TCreate | void> | TCreate | void\n afterCreate?: (entity: any, ctx: CrudCtx & { input: TCreate }) => Promise<void> | void\n beforeUpdate?: (input: TUpdate, ctx: CrudCtx) => Promise<TUpdate | void> | TUpdate | void\n afterUpdate?: (entity: any, ctx: CrudCtx & { input: TUpdate }) => Promise<void> | void\n beforeDelete?: (id: string, ctx: CrudCtx) => Promise<void> | void\n afterDelete?: (id: string, ctx: CrudCtx) => Promise<void> | void\n}\n\nexport type CrudMethodMetadata = {\n requireAuth?: boolean\n requireRoles?: string[]\n requireFeatures?: string[]\n rateLimit?: RateLimitConfig\n}\n\nexport type CrudMetadata = {\n GET?: CrudMethodMetadata\n POST?: CrudMethodMetadata\n PUT?: CrudMethodMetadata\n DELETE?: CrudMethodMetadata\n}\n\nexport type OrmEntityConfig = {\n entity: any // MikroORM entity class\n idField?: string // default: 'id'\n orgField?: string | null // default: 'organizationId'; pass null to disable automatic org scoping\n tenantField?: string | null // default: 'tenantId'; pass null to disable automatic tenant scoping\n softDeleteField?: string | null // default: 'deletedAt'; pass null to disable implicit soft delete filter\n}\n\nexport type CustomFieldsConfig =\n | false\n | {\n enabled: true\n entityId: any // datamodel entity id, e.g. E.example.todo\n // If true, picks body keys starting with `cf_` and maps `cf_<name>` -> `<name>`\n pickPrefixed?: boolean\n // Optional custom mapper; if provided, used instead of pickPrefixed\n map?: (data: Record<string, any>) => Record<string, any>\n }\n\nexport type CrudListCustomFieldDecorator = {\n entityIds: EntityId | EntityId[]\n resolveContext?: (item: any, ctx: CrudCtx) => { organizationId?: string | null; tenantId?: string | null }\n}\n\nexport type ListConfig<TList> = {\n schema: z.ZodType<TList>\n // Optional: use the QueryEngine when entityId + fields are provided\n entityId?: any\n fields?: any[]\n sortFieldMap?: Record<string, any>\n buildFilters?: (query: TList, ctx: CrudCtx) => Where<any> | Promise<Where<any>>\n transformItem?: (item: any) => any\n allowCsv?: boolean\n csv?: {\n headers: string[]\n row: (item: any) => (string | number | boolean | null | undefined)[]\n filename?: string\n }\n export?: CrudExportOptions\n customFieldSources?: QueryCustomFieldSource[]\n joins?: QueryJoinEdge[]\n decorateCustomFields?: CrudListCustomFieldDecorator\n}\n\nexport type CrudExportColumnConfig = {\n field: string\n header?: string\n resolve?: (item: any) => unknown\n}\n\nexport type CrudExportOptions = {\n enabled?: boolean\n formats?: CrudExportFormat[]\n filename?: string | ((format: CrudExportFormat) => string)\n columns?: CrudExportColumnConfig[]\n batchSize?: number\n}\n\nconst DEFAULT_EXPORT_FORMATS: CrudExportFormat[] = ['csv', 'json', 'xml', 'markdown']\nconst DEFAULT_EXPORT_BATCH_SIZE = 1000\nconst MIN_EXPORT_BATCH_SIZE = 100\nconst MAX_EXPORT_BATCH_SIZE = 10000\n\ntype ColumnResolver = {\n field: string\n header: string\n resolve: (item: any) => unknown\n}\n\nfunction resolveAvailableExportFormats(list?: ListConfig<any>): CrudExportFormat[] {\n if (!list) return []\n if (list.export?.enabled === false) return []\n const formats = list.export?.formats && list.export.formats.length > 0\n ? [...list.export.formats]\n : [...DEFAULT_EXPORT_FORMATS]\n if (!list.export?.formats && list.allowCsv && !formats.includes('csv')) formats.push('csv')\n return Array.from(new Set(formats))\n}\n\nfunction resolveExportBatchSize(list: ListConfig<any> | undefined, requestedPageSize: number): number {\n const fallback = Math.max(requestedPageSize, DEFAULT_EXPORT_BATCH_SIZE)\n const raw = list?.export?.batchSize ?? fallback\n return Math.min(Math.max(raw, MIN_EXPORT_BATCH_SIZE), MAX_EXPORT_BATCH_SIZE)\n}\n\nfunction sanitizeFieldName(base: string, used: Set<string>, fallbackIndex: number): string {\n const trimmed = base.trim()\n const sanitized = trimmed.replace(/[^a-zA-Z0-9_\\-]/g, '_') || `field_${fallbackIndex}`\n const normalized = /^[A-Za-z_]/.test(sanitized) ? sanitized : `f_${sanitized}`\n let candidate = normalized\n let counter = 1\n while (used.has(candidate)) {\n candidate = `${normalized}_${counter++}`\n }\n used.add(candidate)\n return candidate\n}\n\nfunction buildExportFromColumns(items: any[], columnsConfig: CrudExportColumnConfig[]): PreparedExport {\n const used = new Set<string>()\n const columns: ColumnResolver[] = columnsConfig.map((col, idx) => {\n const fieldName = sanitizeFieldName(col.field || `field_${idx}`, used, idx)\n const header = col.header?.trim().length ? col.header!.trim() : col.field || `Field ${idx + 1}`\n const resolver = col.resolve\n ? col.resolve\n : ((item: any) => (item != null ? (item as any)[col.field] : undefined))\n return { field: fieldName, header, resolve: resolver }\n })\n const rows = items.map((item) => {\n const row: Record<string, unknown> = {}\n columns.forEach((column) => {\n try {\n row[column.field] = column.resolve(item)\n } catch {\n row[column.field] = undefined\n }\n })\n return row\n })\n return {\n columns: columns.map(({ field, header }) => ({ field, header })),\n rows,\n }\n}\n\nfunction buildExportFromCsv(items: any[], csv: NonNullable<ListConfig<any>['csv']>): PreparedExport {\n const used = new Set<string>()\n const columns = csv.headers.map((header, idx) => ({\n field: sanitizeFieldName(header || `column_${idx + 1}`, used, idx),\n header: header || `Column ${idx + 1}`,\n }))\n const rows = items.map((item) => {\n const values = csv.row(item) || []\n const row: Record<string, unknown> = {}\n columns.forEach((column, idx) => {\n row[column.field] = values[idx]\n })\n return row\n })\n return { columns, rows }\n}\n\nfunction buildDefaultExport(items: any[]): PreparedExport {\n const rows = items.map((item) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return { ...(item as Record<string, unknown>) }\n }\n return { value: item }\n })\n return {\n columns: ensureColumns(rows),\n rows,\n }\n}\n\nfunction prepareExportData(items: any[], list: ListConfig<any>): PreparedExport {\n if (list.export?.columns && list.export.columns.length > 0) {\n return buildExportFromColumns(items, list.export.columns)\n }\n if (list.csv) {\n return buildExportFromCsv(items, list.csv)\n }\n const prepared = buildDefaultExport(items)\n return {\n columns: ensureColumns(prepared.rows, prepared.columns),\n rows: prepared.rows,\n }\n}\n\nfunction finalizeExportFilename(list: ListConfig<any>, format: CrudExportFormat, fallbackBase: string): string {\n const extension = format === 'markdown' ? 'md' : format\n const fromExport = list.export?.filename\n const apply = (value: string | null | undefined): string | null => {\n if (!value) return null\n const trimmed = value.trim()\n if (!trimmed) return null\n const sanitized = trimmed.replace(/[^a-z0-9_\\-\\.]/gi, '_')\n const lower = sanitized.toLowerCase()\n if (lower.endsWith(`.${extension}`)) return sanitized\n const withoutExtension = sanitized.includes('.') ? sanitized.replace(/\\.[^.]+$/, '') : sanitized\n const base = withoutExtension.trim().length > 0 ? withoutExtension : sanitized\n return `${base}.${extension}`\n }\n if (typeof fromExport === 'function') {\n const computed = apply(fromExport(format))\n if (computed) return computed\n } else {\n const computed = apply(fromExport)\n if (computed) return computed\n }\n if (format === 'csv' && list.csv?.filename) {\n const csvName = apply(list.csv.filename)\n if (csvName) return csvName\n }\n return defaultExportFilename(fallbackBase, format)\n}\n\nfunction normalizeFullRecordForExport(input: any): any {\n if (!input || typeof input !== 'object') return input\n if (Array.isArray(input)) return input.map((item) => normalizeFullRecordForExport(item))\n const record: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(input)) {\n if (key.startsWith('cf_') || key.startsWith('cf:')) continue\n // Strip enricher namespaced fields and metadata from exports\n if (key === '_meta') continue\n if (key.startsWith('_') && key.length > 1) continue\n record[key] = value\n }\n const custom = extractAllCustomFieldEntries(input)\n for (const [rawKey, value] of Object.entries(custom)) {\n const sanitizedKey = rawKey.replace(/^cf_/, '')\n record[sanitizedKey] = value\n }\n return record\n}\nexport type CreateConfig<TCreate> = {\n schema: z.ZodType<TCreate>\n mapToEntity: (input: TCreate, ctx: CrudCtx) => Record<string, any>\n customFields?: CustomFieldsConfig\n response?: (entity: any) => any\n}\n\nexport type UpdateConfig<TUpdate> = {\n schema: z.ZodType<TUpdate>\n // Must contain a string uuid `id` field\n getId?: (input: TUpdate) => string\n applyToEntity: (entity: any, input: TUpdate, ctx: CrudCtx) => void | Promise<void>\n customFields?: CustomFieldsConfig\n response?: (entity: any) => any\n}\n\nexport type DeleteConfig = {\n // Where to take id from; default: query param `id`\n idFrom?: 'query' | 'body'\n softDelete?: boolean // default true\n response?: (id: string) => any\n}\n\nexport type CrudCommandActionConfig = {\n commandId: string\n schema?: z.ZodTypeAny\n mapInput?: (args: { parsed: any; raw: any; ctx: CrudCtx }) => Promise<any> | any\n metadata?: (args: { input: any; parsed: any; raw: any; ctx: CrudCtx }) => Promise<CommandLogMetadata | null> | CommandLogMetadata | null\n response?: (args: { result: any; logEntry: any | null; ctx: CrudCtx }) => any\n status?: number\n}\n\nexport type CrudCtx = {\n container: AwilixContainer\n auth: AuthContext | null\n organizationScope: OrganizationScope | null\n selectedOrganizationId: string | null\n organizationIds: string[] | null\n request?: Request\n}\n\nexport type CrudFactoryOptions<TCreate, TUpdate, TList> = {\n metadata?: CrudMetadata\n orm: OrmEntityConfig\n list?: ListConfig<TList>\n create?: CreateConfig<TCreate>\n update?: UpdateConfig<TUpdate>\n del?: DeleteConfig\n events?: CrudEventsConfig\n indexer?: CrudIndexerConfig\n resolveIdentifiers?: CrudIdentifierResolver\n hooks?: CrudHooks<TCreate, TUpdate, TList>\n actions?: {\n create?: CrudCommandActionConfig\n update?: CrudCommandActionConfig\n delete?: CrudCommandActionConfig\n }\n /** Response enricher configuration. When set, enrichers targeting this entity run after afterList hook. */\n enrichers?: {\n /** Entity ID for enricher matching (e.g., 'customers.person') */\n entityId: string\n }\n}\n\nfunction deriveResourceFromActions(actions: CrudFactoryOptions<any, any, any>['actions']): string | null {\n if (!actions) return null\n const ids: Array<string | null | undefined> = [actions.create?.commandId, actions.update?.commandId, actions.delete?.commandId]\n for (const id of ids) {\n const resolved = deriveResourceFromCommandId(id)\n if (resolved) return resolved\n }\n return null\n}\n\nfunction resolveResourceAliasesList(\n opts: CrudFactoryOptions<any, any, any>,\n ormEntityName: string | undefined\n): { primary: string; aliases: string[] } {\n const eventsResource =\n opts.events?.module && opts.events?.entity ? `${opts.events.module}.${opts.events.entity}` : null\n const commandResource = deriveResourceFromActions(opts.actions)\n const rawCandidate = eventsResource ?? commandResource ?? ormEntityName ?? 'resource'\n const primary = canonicalizeResourceTag(rawCandidate) ?? 'resource'\n return { primary, aliases: [] }\n}\n\nfunction mergeCommandMetadata(base: CommandLogMetadata, override: CommandLogMetadata | null | undefined): CommandLogMetadata {\n if (!override) return base\n const mergedContext = {\n ...(base.context ?? {}),\n ...(override.context ?? {}),\n }\n const merged: CommandLogMetadata = {\n ...base,\n ...override,\n }\n if (Object.keys(mergedContext).length > 0) merged.context = mergedContext\n else if ('context' in merged) delete merged.context\n return merged\n}\n\nfunction json(data: any, init?: ResponseInit) {\n return new Response(JSON.stringify(data), {\n ...(init || {}),\n headers: { 'content-type': 'application/json', ...(init?.headers || {}) },\n })\n}\n\nfunction attachOperationHeader(res: Response, logEntry: any) {\n if (!res || !(res instanceof Response)) return res\n if (!logEntry || typeof logEntry !== 'object') return res\n const undoToken = typeof logEntry.undoToken === 'string' ? logEntry.undoToken : null\n const id = typeof logEntry.id === 'string' ? logEntry.id : null\n const commandId = typeof logEntry.commandId === 'string' ? logEntry.commandId : null\n if (!undoToken || !id || !commandId) return res\n const actionLabel = typeof logEntry.actionLabel === 'string' ? logEntry.actionLabel : null\n const resourceKind = typeof logEntry.resourceKind === 'string' ? logEntry.resourceKind : null\n const resourceId = typeof logEntry.resourceId === 'string' ? logEntry.resourceId : null\n const createdAt = logEntry.createdAt instanceof Date\n ? logEntry.createdAt.toISOString()\n : (typeof logEntry.createdAt === 'string' ? logEntry.createdAt : new Date().toISOString())\n const headerValue = serializeOperationMetadata({\n id,\n undoToken,\n commandId,\n actionLabel,\n resourceKind,\n resourceId,\n executedAt: createdAt,\n })\n try {\n res.headers.set('x-om-operation', headerValue)\n } catch {\n // no-op if headers already sent\n }\n return res\n}\n\nfunction handleError(err: unknown): Response {\n if (err instanceof Response) return err\n if (err instanceof CrudHttpError) return json(err.body, { status: err.status })\n if (err instanceof z.ZodError) return json({ error: 'Invalid input', details: err.issues }, { status: 400 })\n\n const message = err instanceof Error ? err.message : undefined\n const stack = err instanceof Error ? err.stack : undefined\n // eslint-disable-next-line no-console\n console.error('[crud] unexpected error', { message, stack, err })\n const body: Record<string, unknown> = {\n error: 'Internal server error',\n message: 'Something went wrong. Please try again later.',\n }\n return json(body, { status: 500 })\n}\n\nconst LIFECYCLE_ACTION_MAP: Record<string, { before: string; after: string }> = {\n created: { before: 'creating', after: 'created' },\n updated: { before: 'updating', after: 'updated' },\n deleted: { before: 'deleting', after: 'deleted' },\n}\n\nfunction deriveLifecycleEventIds(events: CrudEventsConfig | undefined, action: 'created' | 'updated' | 'deleted'): { beforeEventId: string | null; afterEventId: string | null; entity: string | null } {\n if (!events?.module || !events?.entity) return { beforeEventId: null, afterEventId: null, entity: null }\n const mapping = LIFECYCLE_ACTION_MAP[action]\n if (!mapping) return { beforeEventId: null, afterEventId: null, entity: null }\n const entity = `${events.module}.${events.entity}`\n return {\n beforeEventId: `${entity}.${mapping.before}`,\n afterEventId: `${entity}.${mapping.after}`,\n entity,\n }\n}\n\nfunction buildSyncPayload(\n base: {\n eventId: string\n entity: string\n operation: 'create' | 'update' | 'delete'\n timing: 'before' | 'after'\n resourceId: string | null\n userId: string\n organizationId: string | null\n tenantId: string\n em: EntityManager\n request: Request\n },\n extra?: {\n payload?: Record<string, unknown>\n previousData?: Record<string, unknown>\n entityData?: Record<string, unknown>\n },\n): SyncCrudEventPayload {\n return {\n ...base,\n payload: extra?.payload,\n previousData: extra?.previousData,\n entityData: extra?.entityData,\n }\n}\n\nfunction collectAndRunGuards(\n container: AwilixContainer,\n): { allGuards: MutationGuard[] } {\n const allGuards = [...getAllMutationGuardInstances()]\n const legacyGuard = bridgeLegacyGuard(container)\n if (legacyGuard) allGuards.push(legacyGuard)\n return { allGuards }\n}\n\nasync function runGuardAfterSuccessCallbacks(\n callbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }>,\n base: Omit<MutationGuardAfterInput, 'metadata'>,\n): Promise<void> {\n for (const { guard, metadata: guardMeta } of callbacks) {\n try {\n await guard.afterSuccess!({ ...base, metadata: guardMeta })\n } catch (error) {\n console.error(`[mutation-guard] afterSuccess failed for guard ${guard.id}`, error)\n }\n }\n}\n\nfunction snapshotEntity(entity: unknown): Record<string, unknown> | undefined {\n if (!entity || typeof entity !== 'object') return undefined\n return safeClone(entity) as Record<string, unknown>\n}\n\nfunction normalizeInterceptorRoutePath(request: Request): string {\n try {\n const pathname = new URL(request.url).pathname\n if (pathname.startsWith('/api/')) return pathname.slice(5)\n if (pathname === '/api') return ''\n return pathname.replace(/^\\/+/, '')\n } catch {\n return ''\n }\n}\n\nfunction toInterceptorHeaders(headers: Headers): Record<string, string> {\n const output: Record<string, string> = {}\n headers.forEach((value, key) => {\n output[key] = value\n })\n return output\n}\n\nfunction cleanInterceptorObject(\n value: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object') return undefined\n return Object.fromEntries(Object.entries(value).filter(([, current]) => current !== undefined))\n}\n\nfunction isUuid(v: any): v is string {\n return typeof v === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(v)\n}\n\ntype AccessLogServiceLike = { log: (input: any) => Promise<unknown> | unknown }\n\nfunction resolveAccessLogService(container: AwilixContainer): AccessLogServiceLike | null {\n try {\n const service = container.resolve?.('accessLogService') as AccessLogServiceLike | undefined\n if (service && typeof service.log === 'function') return service\n } catch (err) {\n try {\n console.warn('[crud] accessLogService not available in container', err)\n } catch {}\n }\n return null\n}\n\nfunction logForbidden(details: Record<string, unknown>) {\n try {\n // eslint-disable-next-line no-console\n console.warn('[crud] Forbidden request', details)\n } catch {}\n}\n\nfunction collectFieldNames(items: any[]): string[] {\n const set = new Set<string>()\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n for (const key of Object.keys(item)) {\n if (typeof key === 'string' && key.length > 0) set.add(key)\n }\n }\n return Array.from(set)\n}\n\nfunction determineAccessType(query: unknown, total: number, idField: string): string {\n if (query && typeof query === 'object' && query !== null && idField in (query as Record<string, unknown>)) {\n const value = (query as Record<string, unknown>)[idField]\n if (value !== undefined && value !== null && String(value).length > 0) return 'read:item'\n }\n return total > 1 ? 'read:list' : 'read'\n}\n\nfunction createCrudProfiler(resource: string, operation: string): Profiler {\n const enabled = shouldEnableProfiler(resource)\n return createProfiler({\n scope: `crud:${operation}`,\n target: resource,\n label: `${resource}:${operation}`,\n loggerLabel: '[crud:profile]',\n enabled,\n })\n}\n\nexport type LogCrudAccessOptions = {\n container: AwilixContainer\n auth: AuthContext | null\n request?: Request\n items: any[]\n idField?: string\n resourceKind: string\n organizationId?: string | null\n tenantId?: string | null\n query?: unknown\n accessType?: string\n fields?: string[]\n}\n\nexport async function logCrudAccess(options: LogCrudAccessOptions) {\n const { container, auth, request, items, resourceKind } = options\n if (!auth) return\n if (!Array.isArray(items) || items.length === 0) return\n const service = resolveAccessLogService(container)\n if (!service) return\n\n const idField = options.idField || 'id'\n const tenantId = options.tenantId ?? auth.tenantId ?? null\n const organizationId = options.organizationId ?? auth.orgId ?? null\n const actorUserId = (auth.keyId ?? auth.sub) ?? null\n const fields = options.fields && options.fields.length ? options.fields : collectFieldNames(items)\n const accessType = options.accessType ?? determineAccessType(options.query, items.length, idField)\n\n const context: Record<string, unknown> = {\n resultCount: items.length,\n accessType,\n }\n if (options.query && typeof options.query === 'object' && options.query !== null) {\n context.queryKeys = Object.keys(options.query as Record<string, unknown>)\n }\n try {\n if (request) {\n const url = new URL(request.url)\n context.path = url.pathname\n }\n } catch {\n // ignore url parsing issues\n }\n\n const uniqueIds = new Set<string>()\n const tasks: Promise<unknown>[] = []\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n const rawId = (item as any)[idField]\n const resourceId = normalizeIdentifierValue(rawId)\n if (!resourceId || uniqueIds.has(resourceId)) continue\n uniqueIds.add(resourceId)\n const payload: Record<string, unknown> = {\n tenantId,\n organizationId,\n actorUserId,\n resourceKind,\n resourceId,\n accessType,\n }\n if (fields.length > 0) payload.fields = fields\n if (Object.keys(context).length > 0) payload.context = context\n tasks.push(\n Promise.resolve(service.log(payload)).catch((err) => {\n try {\n console.error('[crud] failed to record access log', { err, payload })\n } catch {}\n return undefined\n })\n )\n }\n if (tasks.length > 0) await Promise.all(tasks)\n}\n\ntype CrudCacheStoredValue = {\n payload: any\n generatedAt: number\n}\n\nfunction safeClone<T>(value: T): T {\n try {\n const structuredCloneFn = (globalThis as any).structuredClone\n if (typeof structuredCloneFn === 'function') {\n return structuredCloneFn(value)\n }\n } catch {}\n try {\n return JSON.parse(JSON.stringify(value)) as T\n } catch {\n return value\n }\n}\n\nfunction collectScopeOrganizationIds(ctx: CrudCtx): Array<string | null> {\n if (Array.isArray(ctx.organizationIds) && ctx.organizationIds.length > 0) {\n return Array.from(new Set(ctx.organizationIds))\n }\n const fallback = ctx.selectedOrganizationId ?? ctx.auth?.orgId ?? null\n return [fallback]\n}\n\nfunction serializeSearchParams(params: URLSearchParams): string {\n if (!params || params.keys().next().done) return ''\n const grouped = new Map<string, string[]>()\n params.forEach((value, key) => {\n const existing = grouped.get(key) ?? []\n existing.push(value)\n grouped.set(key, existing)\n })\n const normalized: Array<[string, string[]]> = Array.from(grouped.entries()).map(([key, values]) => [key, values.sort((a, b) => a.localeCompare(b))])\n normalized.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n return JSON.stringify(normalized)\n}\n\nfunction buildCrudCacheKey(resource: string, request: Request, ctx: CrudCtx): string {\n const url = new URL(request.url)\n const scopeIds = collectScopeOrganizationIds(ctx)\n const scopeSegment = scopeIds.length\n ? scopeIds.map((id) => normalizeTagSegment(id)).sort((a, b) => a.localeCompare(b)).join(',')\n : 'none'\n return [\n 'crud',\n normalizeTagSegment(resource),\n 'GET',\n url.pathname,\n `tenant:${normalizeTagSegment(ctx.auth?.tenantId ?? null)}`,\n `selectedOrg:${normalizeTagSegment(ctx.selectedOrganizationId ?? null)}`,\n `scope:${scopeSegment}`,\n `query:${serializeSearchParams(url.searchParams)}`,\n ].join('|')\n}\n\nfunction extractRecordIds(items: any[], idField: string): string[] {\n if (!Array.isArray(items) || !items.length) return []\n const ids = new Set<string>()\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n const rawId = (item as any)[idField]\n const id = normalizeIdentifierValue(rawId)\n if (id) ids.add(id)\n }\n return Array.from(ids)\n}\n\nexport function makeCrudRoute<TCreate = any, TUpdate = any, TList = any>(opts: CrudFactoryOptions<TCreate, TUpdate, TList>) {\n const metadata = opts.metadata || {}\n const ormCfg = {\n entity: opts.orm.entity,\n idField: opts.orm.idField ?? 'id',\n orgField: opts.orm.orgField === null ? null : opts.orm.orgField ?? 'organizationId',\n tenantField: opts.orm.tenantField === null ? null : opts.orm.tenantField ?? 'tenantId',\n softDeleteField: opts.orm.softDeleteField === null ? null : opts.orm.softDeleteField ?? 'deletedAt',\n }\n const entityName = typeof ormCfg.entity?.name === 'string' && ormCfg.entity.name.length > 0 ? ormCfg.entity.name : undefined\n const resourceInfo = resolveResourceAliasesList(opts, entityName)\n const resourceKind = resourceInfo.primary\n const resourceAliases = resourceInfo.aliases\n const resourceTargets = expandResourceAliases(resourceKind, resourceAliases)\n const defaultIdentifierResolver: CrudIdentifierResolver = (entity, _action) => {\n const id = normalizeIdentifierValue((entity as any)[ormCfg.idField!])\n const orgId = ormCfg.orgField ? normalizeIdentifierValue((entity as any)[ormCfg.orgField]) : null\n const tenantId = ormCfg.tenantField ? normalizeIdentifierValue((entity as any)[ormCfg.tenantField]) : null\n return {\n id: id ?? '',\n organizationId: orgId ?? null,\n tenantId: tenantId ?? null,\n }\n }\n const identifierResolver: CrudIdentifierResolver = opts.resolveIdentifiers\n ? (entity, action) => {\n const raw = opts.resolveIdentifiers!(entity, action)\n const id = normalizeIdentifierValue(raw?.id)\n const organizationId = normalizeIdentifierValue(raw?.organizationId)\n const tenantId = normalizeIdentifierValue(raw?.tenantId)\n return {\n id: id ?? '',\n organizationId: organizationId ?? null,\n tenantId: tenantId ?? null,\n }\n }\n : defaultIdentifierResolver\n\n const listCustomFieldDecorator = opts.list?.decorateCustomFields\n const indexerConfig = opts.indexer as CrudIndexerConfig | undefined\n const eventsConfig = opts.events as CrudEventsConfig | undefined\n\n const inferFieldValue = (item: Record<string, unknown>, keys: string[]): string | null => {\n for (const key of keys) {\n const value = item[key]\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (trimmed.length) return trimmed\n }\n }\n return null\n }\n\n const decorateItemsWithCustomFields = async (items: any[], ctx: CrudCtx): Promise<any[]> => {\n if (!listCustomFieldDecorator || !Array.isArray(items) || items.length === 0) return items\n const entityIds = Array.isArray(listCustomFieldDecorator.entityIds)\n ? listCustomFieldDecorator.entityIds\n : [listCustomFieldDecorator.entityIds]\n if (!entityIds.length) return items\n const cfProfiler = createCrudProfiler(resourceKind, 'custom_fields')\n cfProfiler.mark('prepare')\n let profileClosed = false\n const endProfile = (extra?: Record<string, unknown>) => {\n if (!cfProfiler.enabled || profileClosed) return\n profileClosed = true\n cfProfiler.end(extra)\n }\n try {\n const em = (ctx.container.resolve('em') as EntityManager)\n const organizationIds =\n Array.isArray(ctx.organizationIds) && ctx.organizationIds.length\n ? ctx.organizationIds\n : [ctx.selectedOrganizationId ?? null]\n const definitionIndex = await loadCustomFieldDefinitionIndex({\n em,\n entityIds,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds,\n })\n cfProfiler.mark('definitions_loaded', { definitionCount: definitionIndex.size })\n const decoratedItems = items.map((raw) => {\n if (!raw || typeof raw !== 'object') return raw\n const item = raw as Record<string, unknown>\n const context = listCustomFieldDecorator.resolveContext\n ? listCustomFieldDecorator.resolveContext(raw, ctx) ?? {}\n : {}\n const organizationId =\n context.organizationId ??\n inferFieldValue(item, ['organization_id', 'organizationId'])\n const tenantId =\n context.tenantId ??\n inferFieldValue(item, ['tenant_id', 'tenantId']) ??\n ctx.auth?.tenantId ??\n null\n const decorated = decorateRecordWithCustomFields(item, definitionIndex, {\n organizationId: organizationId ?? null,\n tenantId: tenantId ?? null,\n })\n const output = {\n ...item,\n customValues: decorated.customValues,\n customFields: decorated.customFields,\n }\n return output\n })\n cfProfiler.mark('decorate_complete', { itemCount: decoratedItems.length })\n endProfile({\n entityIds: entityIds.length,\n itemCount: decoratedItems.length,\n })\n return decoratedItems\n } catch (err) {\n console.warn('[crud] failed to decorate custom fields', err)\n endProfile({\n result: 'error',\n entityIds: entityIds.length,\n itemCount: items.length,\n })\n return items\n }\n }\n\n /**\n * Build enricher context from CRUD context and resolve user features for ACL gating.\n * Returns null if enrichers are not configured or auth is missing.\n */\n async function buildEnricherContext(ctx: CrudCtx): Promise<EnricherContext | null> {\n if (!opts.enrichers?.entityId) return null\n if (!ctx.auth) return null\n\n let userFeatures: string[] | undefined\n try {\n const rbac = ctx.container.resolve('rbacService') as RbacServiceLike | undefined\n if (rbac?.getGrantedFeatures) {\n userFeatures = await rbac.getGrantedFeatures(ctx.auth.sub, {\n tenantId: ctx.auth.tenantId,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId,\n })\n }\n } catch {\n // rbacService not available \u2014 enrichers without feature requirements still run\n }\n\n return {\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? '',\n tenantId: ctx.auth.tenantId ?? '',\n userId: ctx.auth.sub,\n em: ctx.container.resolve('em'),\n container: ctx.container,\n userFeatures,\n }\n }\n\n async function resolveUserFeatures(ctx: CrudCtx): Promise<string[] | undefined> {\n if (!ctx.auth) return undefined\n try {\n const rbac = ctx.container.resolve('rbacService') as RbacServiceLike | undefined\n if (rbac?.getGrantedFeatures) {\n return await rbac.getGrantedFeatures(ctx.auth.sub, {\n tenantId: ctx.auth.tenantId,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId,\n })\n }\n } catch {\n // rbacService is optional in some contexts\n }\n return undefined\n }\n\n const interceptorContextCache = new WeakMap<object, ReturnType<typeof buildInterceptorContextInner>>()\n\n async function buildInterceptorContextInner(ctx: CrudCtx) {\n if (!ctx.auth) return null\n return {\n userId: ctx.auth.sub,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? '',\n tenantId: ctx.auth.tenantId ?? '',\n em: ctx.container.resolve('em'),\n container: ctx.container,\n userFeatures: await resolveUserFeatures(ctx),\n }\n }\n\n function buildInterceptorContext(ctx: CrudCtx) {\n const cached = interceptorContextCache.get(ctx)\n if (cached) return cached\n const promise = buildInterceptorContextInner(ctx)\n interceptorContextCache.set(ctx, promise)\n return promise\n }\n\n async function applyInterceptorsBefore(args: {\n ctx: CrudCtx\n request: Request\n method: ApiInterceptorMethod\n body?: Record<string, unknown>\n query?: Record<string, unknown>\n }): Promise<{ errorResponse: Response | null; requestPayload: InterceptorRequest; metadataByInterceptor: Record<string, Record<string, unknown> | undefined> }> {\n const interceptorContext = await buildInterceptorContext(args.ctx)\n const requestPayload: InterceptorRequest = {\n method: args.method,\n url: args.request.url,\n body: cleanInterceptorObject(args.body),\n query: cleanInterceptorObject(args.query),\n headers: toInterceptorHeaders(args.request.headers),\n }\n if (!interceptorContext) {\n return { errorResponse: null, requestPayload, metadataByInterceptor: {} }\n }\n const contextWithHeaders = {\n ...interceptorContext,\n extensionHeaders: parseExtensionHeaders(requestPayload.headers),\n }\n const result = await runApiInterceptorsBefore({\n routePath: normalizeInterceptorRoutePath(args.request),\n method: args.method,\n request: requestPayload,\n context: contextWithHeaders,\n })\n if (!result.ok) {\n return { errorResponse: json(result.body, { status: result.statusCode }), requestPayload, metadataByInterceptor: {} }\n }\n return { errorResponse: null, requestPayload: result.request, metadataByInterceptor: result.metadataByInterceptor }\n }\n\n async function applyInterceptorsAfter(args: {\n ctx: CrudCtx\n request: Request\n method: ApiInterceptorMethod\n requestPayload: InterceptorRequest\n metadataByInterceptor: Record<string, Record<string, unknown> | undefined>\n statusCode: number\n body: Record<string, unknown>\n headers?: Record<string, string>\n }): Promise<{ ok: boolean; statusCode: number; body: Record<string, unknown>; headers: Record<string, string> } | null> {\n const interceptorContext = await buildInterceptorContext(args.ctx)\n if (!interceptorContext) return { ok: true, statusCode: args.statusCode, body: args.body, headers: args.headers ?? {} }\n const result = await runApiInterceptorsAfter({\n routePath: normalizeInterceptorRoutePath(args.request),\n method: args.method,\n request: args.requestPayload,\n response: {\n statusCode: args.statusCode,\n body: args.body,\n headers: args.headers ?? {},\n } satisfies InterceptorResponse,\n context: interceptorContext,\n metadataByInterceptor: args.metadataByInterceptor,\n })\n return result\n }\n\n /**\n * Apply response enrichers to list payload items.\n * Mutates payload.items and adds payload._meta.\n * No-op if enrichers are not configured.\n */\n async function enrichListPayload(payload: any, ctx: CrudCtx, profiler?: Profiler): Promise<void> {\n if (!opts.enrichers?.entityId) return\n const enricherCtx = await buildEnricherContext(ctx)\n if (!enricherCtx) return\n profiler?.mark('enrichers_start')\n const result = await applyResponseEnrichers(payload.items, opts.enrichers.entityId, enricherCtx)\n payload.items = result.items\n if (result._meta.enrichedBy.length > 0 || result._meta.enricherErrors?.length) {\n payload._meta = { ...(payload._meta || {}), ...result._meta }\n }\n profiler?.mark('enrichers_complete', { enricherCount: result._meta.enrichedBy.length })\n }\n\n /**\n * Apply response enrichers to a single record.\n * Returns the enriched record with _meta merged.\n */\n async function enrichSingleRecord(record: any, ctx: CrudCtx): Promise<any> {\n if (!opts.enrichers?.entityId) return record\n const enricherCtx = await buildEnricherContext(ctx)\n if (!enricherCtx) return record\n const result = await applyResponseEnricherToRecord(record, opts.enrichers.entityId, enricherCtx)\n if (result._meta.enrichedBy.length > 0 || result._meta.enricherErrors?.length) {\n return { ...result.record, _meta: result._meta }\n }\n return result.record\n }\n\n async function ensureAuth(request?: Request | null) {\n const auth = request ? await getAuthFromRequest(request) : await getAuthFromCookies()\n if (!auth) return null\n if (auth.tenantId && !isUuid(auth.tenantId)) return null\n return auth\n }\n\n async function withCtx(request: Request): Promise<CrudCtx> {\n const container = await createRequestContainer()\n const rawAuth = await ensureAuth(request)\n let scope: OrganizationScope | null = null\n let selectedOrganizationId: string | null = null\n let organizationIds: string[] | null = null\n if (rawAuth) {\n try {\n scope = await resolveOrganizationScopeForRequest({ container, auth: rawAuth, request })\n } catch {\n scope = null\n }\n }\n const scopedTenantId = scope?.tenantId ?? rawAuth?.tenantId ?? null\n const scopedOrgId = scope ? (scope.selectedId ?? null) : (rawAuth?.orgId ?? null)\n selectedOrganizationId = scopedOrgId\n const scopedAuth = rawAuth\n ? {\n ...rawAuth,\n tenantId: scopedTenantId ?? null,\n orgId: scopedOrgId ?? null,\n }\n : null\n const fallbackOrgId = scopedOrgId ?? rawAuth?.orgId ?? null\n const rawScopeIds = scope?.filterIds\n const scopedIds = Array.isArray(rawScopeIds) ? rawScopeIds.filter((id): id is string => typeof id === 'string' && id.length > 0) : null\n if (!scope) {\n organizationIds = fallbackOrgId ? [fallbackOrgId] : null\n } else if (scopedIds === null) {\n organizationIds = scope.allowedIds === null ? null : (fallbackOrgId ? [fallbackOrgId] : null)\n } else if (scopedIds.length > 0) {\n organizationIds = Array.from(new Set(scopedIds))\n } else if (fallbackOrgId) {\n const allowedIds = Array.isArray(scope?.allowedIds) ? scope.allowedIds : null\n let canUseFallback = false\n if (allowedIds === null) {\n canUseFallback = true\n } else if (allowedIds.includes(fallbackOrgId) || allowedIds.length === 0) {\n canUseFallback = true\n }\n if (canUseFallback) {\n organizationIds = [fallbackOrgId]\n } else {\n organizationIds = []\n }\n } else {\n organizationIds = []\n }\n return { container, auth: scopedAuth, organizationScope: scope, selectedOrganizationId, organizationIds, request }\n }\n\n async function GET(request: Request) {\n const profiler = createCrudProfiler(resourceKind, 'list')\n const requestMeta: Record<string, unknown> = { method: request.method }\n try {\n const urlObj = new URL(request.url)\n requestMeta.path = urlObj.pathname\n requestMeta.url = request.url\n if (urlObj.search) requestMeta.query = urlObj.search\n } catch {\n requestMeta.url = request.url\n }\n profiler.mark('request_received', requestMeta)\n let profileClosed = false\n const finishProfile = (extra?: Record<string, unknown>) => {\n if (!profiler.enabled || profileClosed) return\n profileClosed = true\n const meta = extra ? { ...requestMeta, ...extra } : { ...requestMeta }\n profiler.end(meta)\n }\n try {\n profiler.mark('resolve_context')\n const ctx = await withCtx(request)\n profiler.mark('context_ready')\n if (!ctx.auth) {\n finishProfile({ reason: 'unauthorized' })\n return json({ error: 'Unauthorized' }, { status: 401 })\n }\n if (!opts.list) {\n finishProfile({ reason: 'list_not_configured' })\n return json({ error: 'Not implemented' }, { status: 501 })\n }\n const url = new URL(request.url)\n const rawQueryParams = Object.fromEntries(url.searchParams.entries())\n profiler.mark('query_parsed')\n let validated = opts.list.schema.parse(rawQueryParams)\n profiler.mark('query_validated')\n\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'GET',\n query: (validated as Record<string, unknown>),\n })\n if (beforeInterceptors.errorResponse) {\n finishProfile({ result: 'interceptor_before_blocked' })\n return beforeInterceptors.errorResponse\n }\n const interceptorRequest = beforeInterceptors.requestPayload\n const interceptorMetadata = beforeInterceptors.metadataByInterceptor\n if (interceptorRequest.query) {\n validated = opts.list.schema.parse(interceptorRequest.query)\n }\n const queryParams = {\n ...rawQueryParams,\n ...(interceptorRequest.query ?? {}),\n } as Record<string, unknown>\n const parsedIds = parseIdsParam(queryParams.ids)\n\n await opts.hooks?.beforeList?.(validated as any, ctx)\n profiler.mark('before_list_hook')\n\n const availableFormats = resolveAvailableExportFormats(opts.list)\n const requestedExport = normalizeExportFormat((queryParams as any).format)\n const exportRequested = requestedExport != null && availableFormats.includes(requestedExport)\n const requestedPage = Number((queryParams as any).page ?? 1) || 1\n const requestedPageSize = Math.min(Math.max(Number((queryParams as any).pageSize ?? 50) || 50, 1), 100)\n const exportPageSize = exportRequested ? resolveExportBatchSize(opts.list, requestedPageSize) : requestedPageSize\n const exportScopeParam = (queryParams as any).exportScope ?? (queryParams as any).export_scope\n const exportScope = typeof exportScopeParam === 'string' ? exportScopeParam.toLowerCase() : null\n const exportFullRequested = exportRequested && (exportScope === 'full' || parseBooleanToken((queryParams as any).full) === true)\n profiler.mark('export_configured', { exportRequested, exportFullRequested })\n\n const cacheEnabled = isCrudCacheEnabled() && !exportRequested\n const cacheTimerStart = cacheEnabled && isCrudCacheDebugEnabled()\n ? process.hrtime.bigint()\n : null\n const cache = cacheEnabled ? resolveCrudCache(ctx.container) : null\n const cacheKey = cacheEnabled ? buildCrudCacheKey(resourceKind, request, ctx) : null\n let cacheStatus: 'hit' | 'miss' = 'miss'\n let cachedValue: CrudCacheStoredValue | null = null\n\n if (cacheEnabled && cache && cacheKey) {\n const rawCached = await cache.get(cacheKey)\n if (rawCached !== null && rawCached !== undefined) {\n if (typeof rawCached === 'object' && 'payload' in (rawCached as any)) {\n cachedValue = rawCached as CrudCacheStoredValue\n } else {\n cachedValue = { payload: rawCached, generatedAt: Date.now() }\n }\n }\n }\n profiler.mark('cache_checked', { cached: cachedValue !== null })\n\n const tenantForScope = ctx.auth?.tenantId ?? null\n const maybeStoreCrudCache = async (payload: any) => {\n if (!cacheEnabled || !cache || !cacheKey) return\n if (!payload || typeof payload !== 'object') return\n if (Array.isArray(payload)) return\n const items = Array.isArray((payload as any).items) ? (payload as any).items : []\n const tags = new Set<string>()\n const scopeOrgIds = collectScopeOrganizationIds(ctx)\n const crudSegment = deriveCrudSegmentTag(resourceKind, request)\n for (const target of resourceTargets) {\n for (const tag of buildCollectionTags(target, tenantForScope, scopeOrgIds)) {\n tags.add(tag)\n }\n }\n const recordIds = extractRecordIds(items, ormCfg.idField!)\n for (const recordId of recordIds) {\n for (const target of resourceTargets) {\n tags.add(buildRecordTag(target, tenantForScope, recordId))\n }\n }\n if (crudSegment) {\n tags.add(`crud:segment:${crudSegment}`)\n }\n if (!tags.size) return\n try {\n await cache.set(cacheKey, { payload: safeClone(payload), generatedAt: Date.now() }, { tags: Array.from(tags) })\n debugCrudCache('store', {\n resource: resourceKind,\n key: cacheKey,\n tags: Array.from(tags),\n itemCount: items.length,\n })\n } catch (err) {\n debugCrudCache('store', {\n resource: resourceKind,\n key: cacheKey,\n error: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n const logCacheOutcome = (event: 'hit' | 'miss', itemCount: number) => {\n if (!cacheTimerStart) return\n const elapsedMs = Number(process.hrtime.bigint() - cacheTimerStart) / 1_000_000\n debugCrudCache(event, {\n resource: resourceKind,\n key: cacheKey,\n durationMs: Math.round(elapsedMs * 1000) / 1000,\n itemCount,\n })\n }\n\n const respondWithPayload = (payload: any, extraHeaders?: Record<string, string>) => {\n const headers: Record<string, string> = extraHeaders ? { ...extraHeaders } : {}\n const warning = payload && typeof payload === 'object' && payload.meta?.partialIndexWarning\n if (warning) {\n headers['x-om-partial-index'] = JSON.stringify({\n type: 'partial_index',\n entity: warning.entity,\n entityLabel: warning.entityLabel ?? warning.entity,\n baseCount: warning.baseCount ?? null,\n indexedCount: warning.indexedCount ?? null,\n scope: warning.scope ?? 'scoped',\n })\n }\n if (cacheEnabled) {\n headers['x-om-cache'] = cacheStatus\n }\n return json(payload, Object.keys(headers).length ? { headers } : undefined)\n }\n\n if (cachedValue) {\n cacheStatus = 'hit'\n profiler.mark('cache_hit', { generatedAt: cachedValue.generatedAt ?? null })\n const payload = safeClone(cachedValue.payload)\n if (!payload || typeof payload !== 'object' || Array.isArray(payload) || !Array.isArray((payload as any).items)) {\n cacheStatus = 'miss'\n profiler.mark('cache_payload_invalid', {\n payloadType: Array.isArray(payload) ? 'array' : typeof payload,\n })\n try {\n if (cache && cacheKey && typeof cache.delete === 'function') {\n await cache.delete(cacheKey)\n }\n } catch {\n // ignore cache eviction failure\n }\n cachedValue = null\n }\n }\n\n if (cachedValue) {\n const payload = safeClone(cachedValue.payload)\n const items = Array.isArray((payload as any)?.items) ? (payload as any).items : []\n profiler.mark('cache_payload_ready', { itemCount: items.length })\n await logCrudAccess({\n container: ctx.container,\n auth: ctx.auth,\n request,\n items,\n idField: ormCfg.idField!,\n resourceKind,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n tenantId: ctx.auth.tenantId ?? null,\n query: validated,\n })\n await opts.hooks?.afterList?.(payload, { ...ctx, query: validated as any })\n const cacheAfterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (!cacheAfterInterceptors) {\n finishProfile({ result: 'interceptor_after_empty', cacheStatus })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!cacheAfterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus })\n return json(cacheAfterInterceptors.body, { status: cacheAfterInterceptors.statusCode, headers: cacheAfterInterceptors.headers })\n }\n Object.assign(payload, cacheAfterInterceptors.body)\n await enrichListPayload(payload, ctx, profiler)\n logCacheOutcome('hit', items.length)\n const response = respondWithPayload(payload)\n finishProfile({ result: 'cache_hit', cacheStatus })\n return response\n }\n\n // Prefer query engine when configured\n if (opts.list.entityId && opts.list.fields) {\n profiler.mark('query_engine_prepare')\n const qe = (ctx.container.resolve('queryEngine') as QueryEngine)\n profiler.mark('query_engine_resolved')\n const sortFieldRaw = (queryParams as any).sortField || 'id'\n const sortDirRaw = ((queryParams as any).sortDir || 'asc').toLowerCase() === 'desc' ? SortDir.Desc : SortDir.Asc\n const sortField = (opts.list.sortFieldMap && opts.list.sortFieldMap[sortFieldRaw]) || sortFieldRaw\n const sort: Sort[] = [{ field: sortField as any, dir: sortDirRaw } as any]\n const page: Page = exportRequested\n ? { page: 1, pageSize: exportPageSize }\n : { page: requestedPage, pageSize: requestedPageSize }\n const filters = exportFullRequested\n ? ({} as Where<any>)\n : (opts.list.buildFilters ? await opts.list.buildFilters(validated as any, ctx) : ({} as Where<any>))\n const mergedFilters = exportFullRequested ? filters : mergeIdFilter(filters, parsedIds)\n const withDeleted = parseBooleanToken((queryParams as any).withDeleted) === true\n profiler.mark('filters_ready', { withDeleted })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n profiler.mark('scope_blocked')\n logForbidden({\n resourceKind,\n action: 'list',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n const emptyPayload = { items: [], total: 0, page: page.page, pageSize: page.pageSize, totalPages: 0 }\n await opts.hooks?.afterList?.(emptyPayload, { ...ctx, query: validated as any })\n const emptyAfterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: emptyPayload as Record<string, unknown>,\n })\n if (!emptyAfterInterceptors) {\n finishProfile({ result: 'interceptor_after_empty', cacheStatus, itemCount: 0, total: 0 })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!emptyAfterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus, itemCount: 0, total: 0 })\n return json(emptyAfterInterceptors.body, { status: emptyAfterInterceptors.statusCode, headers: emptyAfterInterceptors.headers })\n }\n Object.assign(emptyPayload, emptyAfterInterceptors.body)\n await maybeStoreCrudCache(emptyPayload)\n logCacheOutcome(cacheStatus, emptyPayload.items.length)\n const response = respondWithPayload(emptyPayload)\n finishProfile({ result: 'empty_scope', cacheStatus, itemCount: 0, total: 0 })\n return response\n }\n const queryOpts: any = {\n fields: opts.list.fields!,\n includeCustomFields: true,\n sort,\n page,\n filters: mergedFilters,\n withDeleted,\n }\n if (opts.list.customFieldSources) {\n queryOpts.customFieldSources = opts.list.customFieldSources\n }\n if (opts.list.joins) {\n queryOpts.joins = opts.list.joins\n }\n if (ormCfg.tenantField) queryOpts.tenantId = ctx.auth.tenantId!\n if (ormCfg.orgField) {\n queryOpts.organizationId = ctx.selectedOrganizationId ?? undefined\n queryOpts.organizationIds = ctx.organizationIds ?? undefined\n }\n const queryEntity = String(opts.list.entityId)\n profiler.mark('query_options_ready')\n const queryProfiler = profiler.child('query_engine', { entity: queryEntity })\n const res = await qe.query(opts.list.entityId as any, { ...queryOpts, profiler: queryProfiler })\n const rawItems = res.items || []\n let transformedItems = rawItems.map(i => (opts.list!.transformItem ? opts.list!.transformItem(i) : i))\n profiler.mark('transform_complete', { itemCount: transformedItems.length })\n transformedItems = await decorateItemsWithCustomFields(transformedItems, ctx)\n profiler.mark('custom_fields_complete', { itemCount: transformedItems.length })\n\n if (opts.list?.entityId && request) {\n try {\n const { overlay, resolveLocale } = getTranslationOverlayPlugin()\n if (overlay && resolveLocale) {\n const locale = resolveLocale(request)\n if (locale) {\n transformedItems = await overlay(transformedItems, {\n entityType: String(opts.list.entityId),\n locale,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? null,\n container: ctx.container,\n })\n }\n }\n } catch (err) {\n console.warn('[CRUD] Translation overlay failed:', err)\n }\n profiler.mark('translation_overlays_complete', { itemCount: transformedItems.length })\n }\n\n await logCrudAccess({\n container: ctx.container,\n auth: ctx.auth,\n request,\n items: transformedItems,\n idField: ormCfg.idField!,\n resourceKind,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n tenantId: ctx.auth.tenantId ?? null,\n query: validated,\n })\n profiler.mark('access_logged')\n\n if (exportRequested && requestedExport) {\n const total = typeof res.total === 'number' ? res.total : rawItems.length\n const initialExportItems = exportFullRequested\n ? rawItems.map(normalizeFullRecordForExport)\n : transformedItems\n let exportItems = [...initialExportItems]\n if (total > exportItems.length) {\n const exportPageSizeNumber = typeof page.pageSize === 'number' ? page.pageSize : exportPageSize\n const queryBase: any = { ...queryOpts }\n delete queryBase.page\n let nextPage = 2\n while (exportItems.length < total) {\n profiler.mark('export_next_page_request', { page: nextPage })\n const nextRes = await qe.query(opts.list.entityId as any, {\n ...queryBase,\n page: { page: nextPage, pageSize: exportPageSizeNumber },\n profiler: profiler.child('query_engine', { entity: queryEntity, page: nextPage, mode: 'export' }),\n })\n const nextItemsRaw = nextRes.items || []\n if (!nextItemsRaw.length) break\n let nextTransformed = nextItemsRaw.map(i => (opts.list!.transformItem ? opts.list!.transformItem(i) : i))\n nextTransformed = await decorateItemsWithCustomFields(nextTransformed, ctx)\n const nextExportItems = exportFullRequested\n ? nextItemsRaw.map(normalizeFullRecordForExport)\n : nextTransformed\n exportItems.push(...nextExportItems)\n if (nextExportItems.length < exportPageSizeNumber) break\n nextPage += 1\n }\n }\n const prepared = exportFullRequested\n ? { columns: ensureColumns(exportItems), rows: exportItems }\n : prepareExportData(exportItems, opts.list)\n const fallbackBase = `${opts.events?.entity || resourceKind || 'list'}${exportFullRequested ? '_full' : ''}`\n const filename = finalizeExportFilename(opts.list, requestedExport, fallbackBase)\n const serialized = serializeExport(prepared, requestedExport)\n const exportPayload = { items: exportItems, total, page: 1, pageSize: exportItems.length, totalPages: 1, ...(res.meta ? { meta: res.meta } : {}) }\n await opts.hooks?.afterList?.(exportPayload, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const response = new Response(serialized.body, {\n headers: {\n 'content-type': serialized.contentType,\n 'content-disposition': `attachment; filename=\"${filename}\"`,\n },\n })\n if (res.meta?.partialIndexWarning) {\n response.headers.set(\n 'x-om-partial-index',\n JSON.stringify({\n type: 'partial_index',\n entity: res.meta.partialIndexWarning.entity,\n entityLabel: res.meta.partialIndexWarning.entityLabel ?? res.meta.partialIndexWarning.entity,\n baseCount: res.meta.partialIndexWarning.baseCount ?? null,\n indexedCount: res.meta.partialIndexWarning.indexedCount ?? null,\n scope: res.meta.partialIndexWarning.scope ?? 'scoped',\n }),\n )\n }\n finishProfile({\n result: 'export',\n cacheStatus,\n itemCount: exportItems.length,\n total,\n })\n return response\n }\n\n const payload = {\n items: transformedItems,\n total: res.total,\n page: page.page || requestedPage,\n pageSize: page.pageSize || requestedPageSize,\n totalPages: Math.ceil(res.total / (Number(page.pageSize) || 1)),\n ...(res.meta ? { meta: res.meta } : {}),\n }\n await opts.hooks?.afterList?.(payload, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (!afterInterceptors) {\n finishProfile({ result: 'interceptor_after_empty', cacheStatus })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!afterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus })\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n Object.assign(payload, afterInterceptors.body)\n await enrichListPayload(payload, ctx, profiler)\n await maybeStoreCrudCache(payload)\n profiler.mark('cache_store_attempt', { cacheEnabled })\n logCacheOutcome(cacheStatus, payload.items.length)\n const response = respondWithPayload(payload)\n finishProfile({\n result: 'ok',\n cacheStatus,\n itemCount: payload.items.length,\n total: payload.total ?? payload.items.length,\n })\n return response\n }\n\n // Fallback: plain ORM list\n profiler.mark('orm_fallback_prepare')\n const em = (ctx.container.resolve('em') as any)\n const repo = em.getRepository(ormCfg.entity)\n profiler.mark('orm_repo_ready')\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n profiler.mark('fallback_scope_blocked')\n logForbidden({\n resourceKind,\n action: 'list',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n const emptyPayload = { items: [], total: 0 }\n await opts.hooks?.afterList?.(emptyPayload, { ...ctx, query: validated as any })\n const fallbackEmptyAfterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: emptyPayload as Record<string, unknown>,\n })\n if (!fallbackEmptyAfterInterceptors) {\n finishProfile({\n result: 'interceptor_after_empty',\n cacheStatus,\n itemCount: 0,\n total: 0,\n branch: 'fallback',\n })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!fallbackEmptyAfterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus, itemCount: 0, total: 0, branch: 'fallback' })\n return json(fallbackEmptyAfterInterceptors.body, { status: fallbackEmptyAfterInterceptors.statusCode, headers: fallbackEmptyAfterInterceptors.headers })\n }\n Object.assign(emptyPayload, fallbackEmptyAfterInterceptors.body)\n await maybeStoreCrudCache(emptyPayload)\n logCacheOutcome(cacheStatus, emptyPayload.items.length)\n const response = respondWithPayload(emptyPayload)\n finishProfile({\n result: 'empty_scope',\n cacheStatus,\n itemCount: 0,\n total: 0,\n branch: 'fallback',\n })\n return response\n }\n const fallbackFilters = exportFullRequested\n ? ({} as Where<any>)\n : (opts.list.buildFilters ? await opts.list.buildFilters(validated as any, ctx) : ({} as Where<any>))\n const mergedFallbackFilters = exportFullRequested\n ? fallbackFilters\n : mergeIdFilter(fallbackFilters, parsedIds)\n const where: any = buildScopedWhere(\n mergedFallbackFilters as Record<string, any>,\n {\n organizationId: ormCfg.orgField ? (ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null) : undefined,\n organizationIds: ormCfg.orgField ? ctx.organizationIds ?? undefined : undefined,\n tenantId: ormCfg.tenantField ? ctx.auth.tenantId : undefined,\n orgField: ormCfg.orgField,\n tenantField: ormCfg.tenantField,\n softDeleteField: ormCfg.softDeleteField,\n }\n )\n let list = await repo.find(where)\n profiler.mark('orm_query_complete', { itemCount: Array.isArray(list) ? list.length : 0 })\n list = await decorateItemsWithCustomFields(list, ctx)\n profiler.mark('fallback_custom_fields_complete', { itemCount: Array.isArray(list) ? list.length : 0 })\n\n if (opts.list?.entityId && request) {\n try {\n const { overlay, resolveLocale } = getTranslationOverlayPlugin()\n if (overlay && resolveLocale) {\n const locale = resolveLocale(request)\n if (locale) {\n list = await overlay(list, {\n entityType: String(opts.list.entityId),\n locale,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? null,\n container: ctx.container,\n })\n }\n }\n } catch (err) {\n console.warn('[CRUD] Translation overlay (fallback) failed:', err)\n }\n profiler.mark('fallback_translation_overlays_complete', { itemCount: Array.isArray(list) ? list.length : 0 })\n }\n\n await logCrudAccess({\n container: ctx.container,\n auth: ctx.auth,\n request,\n items: list,\n idField: ormCfg.idField!,\n resourceKind,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n tenantId: ctx.auth.tenantId ?? null,\n query: validated,\n })\n profiler.mark('access_logged')\n if (exportRequested && requestedExport) {\n const exportItems = exportFullRequested ? list.map(normalizeFullRecordForExport) : list\n const prepared = exportFullRequested\n ? { columns: ensureColumns(exportItems), rows: exportItems }\n : prepareExportData(exportItems, opts.list)\n const fallbackBase = `${opts.events?.entity || resourceKind || 'list'}${exportFullRequested ? '_full' : ''}`\n const filename = finalizeExportFilename(opts.list, requestedExport, fallbackBase)\n const serialized = serializeExport(prepared, requestedExport)\n await opts.hooks?.afterList?.({ items: exportItems, total: exportItems.length, page: 1, pageSize: exportItems.length, totalPages: 1 }, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const response = new Response(serialized.body, {\n headers: {\n 'content-type': serialized.contentType,\n 'content-disposition': `attachment; filename=\"${filename}\"`,\n },\n })\n finishProfile({\n result: 'export',\n cacheStatus,\n itemCount: exportItems.length,\n total: exportItems.length,\n branch: 'fallback',\n })\n return response\n }\n const payload = { items: list, total: list.length }\n await opts.hooks?.afterList?.(payload, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const fallbackAfterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (!fallbackAfterInterceptors) {\n finishProfile({\n result: 'interceptor_after_empty',\n cacheStatus,\n branch: 'fallback',\n })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!fallbackAfterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus, branch: 'fallback' })\n return json(fallbackAfterInterceptors.body, { status: fallbackAfterInterceptors.statusCode, headers: fallbackAfterInterceptors.headers })\n }\n Object.assign(payload, fallbackAfterInterceptors.body)\n await enrichListPayload(payload, ctx, profiler)\n await maybeStoreCrudCache(payload)\n profiler.mark('cache_store_attempt', { cacheEnabled })\n logCacheOutcome(cacheStatus, payload.items.length)\n const response = respondWithPayload(payload)\n finishProfile({\n result: 'ok',\n cacheStatus,\n itemCount: payload.items.length,\n total: payload.total,\n branch: 'fallback',\n })\n return response\n } catch (e) {\n finishProfile({ result: 'error' })\n return handleError(e)\n }\n }\n\n async function POST(request: Request) {\n try {\n const useCommand = !!opts.actions?.create\n if (!opts.create && !useCommand) return json({ error: 'Not implemented' }, { status: 501 })\n const ctx = await withCtx(request)\n if (!ctx.auth) return json({ error: 'Unauthorized' }, { status: 401 })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n logForbidden({\n resourceKind,\n action: 'create',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n return json({ error: 'Forbidden' }, { status: 403 })\n }\n const body = await request.json().catch(() => ({}))\n let interceptorRequestPayload: InterceptorRequest | null = null\n let interceptorMetadata: Record<string, Record<string, unknown> | undefined> = {}\n\n if (useCommand) {\n const commandBus = (ctx.container.resolve('commandBus') as CommandBus)\n const action = opts.actions!.create!\n const parsed = action.schema ? action.schema.parse(body) : body\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'POST',\n body: parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n const interceptedBody = interceptorRequestPayload.body ?? {}\n const reparsed = action.schema ? action.schema.parse(interceptedBody) : interceptedBody\n let input = action.mapInput ? await action.mapInput({ parsed: reparsed, raw: interceptedBody, ctx }) : reparsed\n const userMetadata = action.metadata ? await action.metadata({ input, parsed: reparsed, raw: interceptedBody, ctx }) : null\n\n // Sync before-event (*.creating) \u2014 command path\n const createLifecycleCmd = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'created')\n if (createLifecycleCmd.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), createLifecycleCmd.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: createLifecycleCmd.beforeEventId, entity: createLifecycleCmd.entity!, operation: 'create', timing: 'before', resourceId: null, userId: ctx.auth.sub, organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n if (syncResult.modifiedPayload && typeof input === 'object' && input) {\n input = { ...input as Record<string, unknown>, ...syncResult.modifiedPayload }\n }\n }\n }\n\n const baseMetadata: CommandLogMetadata = {\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n resourceKind,\n context: { cacheAliases: resourceTargets },\n }\n const metadataToSend = mergeCommandMetadata(baseMetadata, userMetadata)\n const { result, logEntry } = await commandBus.execute(action.commandId, { input, ctx, metadata: metadataToSend })\n\n // Sync after-event (*.created) \u2014 command path\n if (createLifecycleCmd.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), createLifecycleCmd.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: createLifecycleCmd.afterEventId, entity: createLifecycleCmd.entity!, operation: 'create', timing: 'after', resourceId: (result as Record<string, unknown>)?.id as string ?? null, userId: ctx.auth.sub, organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n const payload = action.response ? action.response({ result, logEntry, ctx }) : result\n let resolvedPayload = await Promise.resolve(payload)\n if (interceptorRequestPayload && resolvedPayload && typeof resolvedPayload === 'object' && !Array.isArray(resolvedPayload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'POST',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: action.status ?? 201,\n body: resolvedPayload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) resolvedPayload = afterInterceptors.body\n }\n const status = action.status ?? 201\n const response = json(resolvedPayload, { status })\n attachOperationHeader(response, logEntry)\n // Note: side effects (events + indexing) are already flushed by CommandBus.execute()\n // via flushCrudSideEffects(). Calling markCommandResultForIndexing here would cause\n // duplicate event emissions.\n return response\n }\n\n const createConfig = opts.create\n if (!createConfig) throw new Error('Create configuration missing')\n\n let input = createConfig.schema.parse(body)\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'POST',\n body: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n if (interceptorRequestPayload.body) {\n input = createConfig.schema.parse(interceptorRequestPayload.body)\n }\n\n // Sync before-event (*.creating)\n const createLifecycle = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'created')\n const scopeOrganizationId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (createLifecycle.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), createLifecycle.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: createLifecycle.beforeEventId, entity: createLifecycle.entity!, operation: 'create', timing: 'before', resourceId: null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n if (syncResult.modifiedPayload && typeof input === 'object' && input) {\n input = createConfig.schema.parse({ ...input as Record<string, unknown>, ...syncResult.modifiedPayload })\n }\n }\n }\n\n const modified = await opts.hooks?.beforeCreate?.(input as any, ctx)\n if (modified) input = modified\n\n // Mutation guard registry (guards now run on create)\n const userFeatures = await resolveUserFeatures(ctx)\n const { allGuards } = collectAndRunGuards(ctx.container)\n let createGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (allGuards.length && ctx.auth.tenantId) {\n const guardResult = await runMutationGuards(allGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: null,\n operation: 'create',\n requestMethod: request.method,\n requestHeaders: request.headers,\n mutationPayload: input && typeof input === 'object' ? (input as Record<string, unknown>) : null,\n }, { userFeatures: userFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n if (guardResult.modifiedPayload && typeof input === 'object' && input) {\n input = createConfig.schema.parse({ ...input as Record<string, unknown>, ...guardResult.modifiedPayload })\n }\n createGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n const entityData = createConfig.mapToEntity(input as any, ctx)\n // Inject org/tenant\n const targetOrgId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (ormCfg.orgField) {\n if (!targetOrgId) return json({ error: 'Organization context is required' }, { status: 400 })\n entityData[ormCfg.orgField] = targetOrgId\n }\n if (ormCfg.tenantField) {\n if (!ctx.auth.tenantId) return json({ error: 'Tenant context is required' }, { status: 400 })\n entityData[ormCfg.tenantField] = ctx.auth.tenantId\n }\n const entity = await de.createOrmEntity({ entity: ormCfg.entity, data: entityData })\n\n // Custom fields\n if (createConfig.customFields && (createConfig.customFields as any).enabled) {\n const cfc = createConfig.customFields as Exclude<CustomFieldsConfig, false>\n const values = cfc.map\n ? cfc.map(body)\n : (cfc.pickPrefixed ? extractCustomFieldValuesFromPayload(body as Record<string, unknown>) : {})\n if (values && Object.keys(values).length > 0) {\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await de.setCustomFields({\n entityId: cfc.entityId as any,\n recordId: String((entity as any)[ormCfg.idField!]),\n organizationId: targetOrgId,\n tenantId: ctx.auth.tenantId!,\n values,\n })\n }\n }\n\n await opts.hooks?.afterCreate?.(entity, { ...ctx, input: input as any })\n\n // Guard afterSuccess callbacks\n const createdEntityId = String((entity as any)[ormCfg.idField!])\n if (createGuardAfterCallbacks?.length && ctx.auth.tenantId) {\n await runGuardAfterSuccessCallbacks(createGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId, organizationId: scopeOrganizationId, userId: ctx.auth.sub,\n resourceKind, resourceId: createdEntityId, operation: 'create',\n requestMethod: request.method, requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.created)\n if (createLifecycle.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), createLifecycle.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: createLifecycle.afterEventId, entity: createLifecycle.entity!, operation: 'create', timing: 'after', resourceId: createdEntityId, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, entityData: snapshotEntity(entity) },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n const identifiers = identifierResolver(entity, 'created')\n de.markOrmEntityChange({\n action: 'created',\n entity,\n identifiers,\n events: opts.events as CrudEventsConfig | undefined,\n indexer: opts.indexer as CrudIndexerConfig | undefined,\n })\n await de.flushOrmEntityChanges()\n await invalidateCrudCache(ctx.container, resourceKind, identifiers, ctx.auth.tenantId ?? null, 'created', resourceTargets)\n\n let payload = createConfig.response ? createConfig.response(entity) : { id: createdEntityId }\n if (interceptorRequestPayload && payload && typeof payload === 'object' && !Array.isArray(payload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'POST',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 201,\n body: payload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) payload = afterInterceptors.body\n }\n payload = await enrichSingleRecord(payload, ctx)\n return json(payload, { status: 201 })\n } catch (e) {\n return handleError(e)\n }\n }\n\n async function PUT(request: Request) {\n try {\n const useCommand = !!opts.actions?.update\n if (!opts.update && !useCommand) return json({ error: 'Not implemented' }, { status: 501 })\n const ctx = await withCtx(request)\n if (!ctx.auth) return json({ error: 'Unauthorized' }, { status: 401 })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n logForbidden({\n resourceKind,\n action: 'update',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n return json({ error: 'Forbidden' }, { status: 403 })\n }\n const body = await request.json().catch(() => ({}))\n const scopeOrganizationId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n let interceptorRequestPayload: InterceptorRequest | null = null\n let interceptorMetadata: Record<string, Record<string, unknown> | undefined> = {}\n\n if (useCommand) {\n const commandBus = (ctx.container.resolve('commandBus') as CommandBus)\n const action = opts.actions!.update!\n const parsed = action.schema ? action.schema.parse(body) : body\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'PUT',\n body: parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n const interceptedBody = interceptorRequestPayload.body ?? {}\n const reparsed = action.schema ? action.schema.parse(interceptedBody) : interceptedBody\n let input = action.mapInput ? await action.mapInput({ parsed: reparsed, raw: interceptedBody, ctx }) : reparsed\n const userMetadata = action.metadata ? await action.metadata({ input, parsed: reparsed, raw: interceptedBody, ctx }) : null\n const candidateId = normalizeIdentifierValue((input as Record<string, unknown> | null | undefined)?.id)\n\n // Sync before-event (*.updating) \u2014 command path\n const updateLifecycleCmd = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'updated')\n let cmdUpdatePreviousData: Record<string, unknown> | undefined\n if (updateLifecycleCmd.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), updateLifecycleCmd.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n if (candidateId) {\n const prevEntity = await em.findOne(ormCfg.entity as any, { [ormCfg.idField!]: candidateId } as any)\n if (prevEntity) cmdUpdatePreviousData = snapshotEntity(prevEntity)\n }\n const syncPayload = buildSyncPayload(\n { eventId: updateLifecycleCmd.beforeEventId, entity: updateLifecycleCmd.entity!, operation: 'update', timing: 'before', resourceId: candidateId ?? null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, previousData: cmdUpdatePreviousData },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n if (syncResult.modifiedPayload && typeof input === 'object' && input) {\n input = { ...input as Record<string, unknown>, ...syncResult.modifiedPayload }\n }\n }\n }\n\n const updateUserFeatures = await resolveUserFeatures(ctx)\n const { allGuards: updateAllGuards } = collectAndRunGuards(ctx.container)\n let cmdUpdateGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (updateAllGuards.length && ctx.auth.tenantId && candidateId) {\n const guardResult = await runMutationGuards(updateAllGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: candidateId,\n operation: 'update',\n requestMethod: request.method,\n requestHeaders: request.headers,\n mutationPayload: input && typeof input === 'object'\n ? (input as Record<string, unknown>)\n : null,\n }, { userFeatures: updateUserFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n if (guardResult.modifiedPayload && typeof input === 'object' && input) {\n input = { ...input as Record<string, unknown>, ...guardResult.modifiedPayload }\n }\n cmdUpdateGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n const baseMetadata: CommandLogMetadata = {\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n resourceKind,\n context: { cacheAliases: resourceTargets },\n }\n if (candidateId) baseMetadata.resourceId = candidateId\n const metadataToSend = mergeCommandMetadata(baseMetadata, userMetadata)\n const { result, logEntry } = await commandBus.execute(action.commandId, { input, ctx, metadata: metadataToSend })\n const payload = action.response ? action.response({ result, logEntry, ctx }) : result\n let resolvedPayload = await Promise.resolve(payload)\n if (interceptorRequestPayload && resolvedPayload && typeof resolvedPayload === 'object' && !Array.isArray(resolvedPayload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'PUT',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: action.status ?? 200,\n body: resolvedPayload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) resolvedPayload = afterInterceptors.body\n }\n const status = action.status ?? 200\n const response = json(resolvedPayload, { status })\n attachOperationHeader(response, logEntry)\n if (cmdUpdateGuardAfterCallbacks.length && ctx.auth.tenantId && candidateId) {\n await runGuardAfterSuccessCallbacks(cmdUpdateGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: candidateId,\n operation: 'update',\n requestMethod: request.method,\n requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.updated) \u2014 command path\n if (updateLifecycleCmd.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), updateLifecycleCmd.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: updateLifecycleCmd.afterEventId, entity: updateLifecycleCmd.entity!, operation: 'update', timing: 'after', resourceId: candidateId ?? null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, previousData: cmdUpdatePreviousData },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n // Note: side effects (events + indexing) are already flushed by CommandBus.execute()\n // via flushCrudSideEffects(). Calling markCommandResultForIndexing here would cause\n // duplicate event emissions.\n return response\n }\n\n const updateConfig = opts.update\n if (!updateConfig) throw new Error('Update configuration missing')\n\n let input = updateConfig.schema.parse(body)\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'PUT',\n body: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n if (interceptorRequestPayload.body) {\n input = updateConfig.schema.parse(interceptorRequestPayload.body)\n }\n\n // Sync before-event (*.updating)\n const updateLifecycle = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'updated')\n let updatePreviousData: Record<string, unknown> | undefined\n if (updateLifecycle.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), updateLifecycle.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const updateCandidateId = (input as Record<string, unknown>)?.id as string ?? null\n if (updateCandidateId) {\n const prevEntity = await em.findOne(ormCfg.entity as any, { [ormCfg.idField!]: updateCandidateId } as any)\n if (prevEntity) updatePreviousData = snapshotEntity(prevEntity)\n }\n const syncPayload = buildSyncPayload(\n { eventId: updateLifecycle.beforeEventId, entity: updateLifecycle.entity!, operation: 'update', timing: 'before', resourceId: updateCandidateId, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, previousData: updatePreviousData },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n if (syncResult.modifiedPayload && typeof input === 'object' && input) {\n input = updateConfig.schema.parse({ ...input as Record<string, unknown>, ...syncResult.modifiedPayload })\n }\n }\n }\n\n const modified = await opts.hooks?.beforeUpdate?.(input as any, ctx)\n if (modified) input = modified\n\n const id = updateConfig.getId ? updateConfig.getId(input as any) : (input as any).id\n if (!isUuid(id)) return json({ error: 'Invalid id' }, { status: 400 })\n\n // Mutation guard registry (multi-guard)\n const updateUserFeatures = await resolveUserFeatures(ctx)\n const { allGuards: updateAllGuards } = collectAndRunGuards(ctx.container)\n let updateGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (updateAllGuards.length && ctx.auth.tenantId) {\n const guardResult = await runMutationGuards(updateAllGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: id,\n operation: 'update',\n requestMethod: request.method,\n requestHeaders: request.headers,\n mutationPayload: input && typeof input === 'object' ? (input as Record<string, unknown>) : null,\n }, { userFeatures: updateUserFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n if (guardResult.modifiedPayload && typeof input === 'object' && input) {\n input = updateConfig.schema.parse({ ...input as Record<string, unknown>, ...guardResult.modifiedPayload })\n }\n updateGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n\n const targetOrgId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (ormCfg.orgField && !targetOrgId) return json({ error: 'Organization context is required' }, { status: 400 })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n const where: any = buildScopedWhere(\n { [ormCfg.idField!]: id },\n {\n organizationId: ormCfg.orgField ? targetOrgId : undefined,\n organizationIds: ormCfg.orgField ? ctx.organizationIds ?? undefined : undefined,\n tenantId: ormCfg.tenantField ? ctx.auth.tenantId : undefined,\n orgField: ormCfg.orgField,\n tenantField: ormCfg.tenantField,\n softDeleteField: ormCfg.softDeleteField,\n }\n )\n const entity = await de.updateOrmEntity({\n entity: ormCfg.entity,\n where,\n apply: (e: any) => updateConfig.applyToEntity(e, input as any, ctx),\n })\n if (!entity) return json({ error: 'Not found' }, { status: 404 })\n\n // Custom fields\n if (updateConfig.customFields && (updateConfig.customFields as any).enabled) {\n const cfc = updateConfig.customFields as Exclude<CustomFieldsConfig, false>\n const values = cfc.map\n ? cfc.map(body)\n : (cfc.pickPrefixed ? extractCustomFieldValuesFromPayload(body as Record<string, unknown>) : {})\n if (values && Object.keys(values).length > 0) {\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await de.setCustomFields({\n entityId: cfc.entityId as any,\n recordId: String((entity as any)[ormCfg.idField!]),\n organizationId: targetOrgId,\n tenantId: ctx.auth.tenantId!,\n values,\n })\n }\n }\n\n await opts.hooks?.afterUpdate?.(entity, { ...ctx, input: input as any })\n\n // Guard afterSuccess callbacks (multi)\n if (updateGuardAfterCallbacks.length && ctx.auth.tenantId) {\n await runGuardAfterSuccessCallbacks(updateGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId, organizationId: scopeOrganizationId, userId: ctx.auth.sub,\n resourceKind, resourceId: id, operation: 'update',\n requestMethod: request.method, requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.updated)\n if (updateLifecycle.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), updateLifecycle.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: updateLifecycle.afterEventId, entity: updateLifecycle.entity!, operation: 'update', timing: 'after', resourceId: id, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, previousData: updatePreviousData, entityData: snapshotEntity(entity) },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n const identifiers = identifierResolver(entity, 'updated')\n de.markOrmEntityChange({\n action: 'updated',\n entity,\n identifiers,\n events: opts.events as CrudEventsConfig | undefined,\n indexer: opts.indexer as CrudIndexerConfig | undefined,\n })\n await de.flushOrmEntityChanges()\n await invalidateCrudCache(ctx.container, resourceKind, identifiers, ctx.auth.tenantId ?? null, 'updated', resourceTargets)\n const payload = updateConfig.response ? updateConfig.response(entity) : { success: true }\n if (interceptorRequestPayload && payload && typeof payload === 'object' && !Array.isArray(payload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'PUT',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) {\n return json(afterInterceptors.body, { status: 200, headers: afterInterceptors.headers })\n }\n }\n return json(payload)\n } catch (e) {\n return handleError(e)\n }\n }\n\n async function DELETE(request: Request) {\n try {\n const ctx = await withCtx(request)\n if (!ctx.auth) return json({ error: 'Unauthorized' }, { status: 401 })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n logForbidden({\n resourceKind,\n action: 'delete',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n return json({ error: 'Forbidden' }, { status: 403 })\n }\n const useCommand = !!opts.actions?.delete\n const url = new URL(request.url)\n const scopeOrganizationId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n let interceptorRequestPayload: InterceptorRequest | null = null\n let interceptorMetadata: Record<string, Record<string, unknown> | undefined> = {}\n\n if (useCommand) {\n const action = opts.actions!.delete!\n const body = await request.json().catch(() => ({}))\n const raw = { body, query: Object.fromEntries(url.searchParams.entries()) }\n const parsed = action.schema ? action.schema.parse(raw) : raw\n const interceptorInput =\n parsed && typeof parsed === 'object' && (parsed as Record<string, unknown>).body && typeof (parsed as Record<string, unknown>).body === 'object'\n ? ((parsed as Record<string, unknown>).body as Record<string, unknown>)\n : body\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'DELETE',\n body: interceptorInput,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n const interceptedBody = interceptorRequestPayload.body ?? {}\n const reparsedRaw = {\n body: interceptedBody,\n query: Object.fromEntries(url.searchParams.entries()),\n }\n const reparsed = action.schema ? action.schema.parse(reparsedRaw) : reparsedRaw\n const input = action.mapInput ? await action.mapInput({ parsed: reparsed, raw: reparsedRaw, ctx }) : reparsed\n const userMetadata = action.metadata ? await action.metadata({ input, parsed: reparsed, raw: reparsedRaw, ctx }) : null\n const commandBus = (ctx.container.resolve('commandBus') as CommandBus)\n const candidateId = normalizeIdentifierValue(\n (input as Record<string, unknown> | null | undefined)?.id\n ?? (raw.query as Record<string, unknown> | null | undefined)?.id\n ?? (raw.body as Record<string, unknown> | null | undefined)?.id\n )\n\n // Sync before-event (*.deleting) \u2014 command path\n const deleteLifecycleCmd = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'deleted')\n if (deleteLifecycleCmd.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), deleteLifecycleCmd.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: deleteLifecycleCmd.beforeEventId, entity: deleteLifecycleCmd.entity!, operation: 'delete', timing: 'before', resourceId: candidateId ?? null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n }\n }\n\n const deleteUserFeatures = await resolveUserFeatures(ctx)\n const { allGuards: deleteAllGuards } = collectAndRunGuards(ctx.container)\n let cmdDeleteGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (deleteAllGuards.length && ctx.auth.tenantId && candidateId) {\n const guardResult = await runMutationGuards(deleteAllGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: candidateId,\n operation: 'delete',\n requestMethod: request.method,\n requestHeaders: request.headers,\n }, { userFeatures: deleteUserFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n cmdDeleteGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n const baseMetadata: CommandLogMetadata = {\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n resourceKind,\n context: { cacheAliases: resourceTargets },\n }\n if (candidateId) baseMetadata.resourceId = candidateId\n const metadataToSend = mergeCommandMetadata(baseMetadata, userMetadata)\n const { result, logEntry } = await commandBus.execute(action.commandId, { input, ctx, metadata: metadataToSend })\n const payload = action.response ? action.response({ result, logEntry, ctx }) : result\n let resolvedPayload = await Promise.resolve(payload)\n if (interceptorRequestPayload && resolvedPayload && typeof resolvedPayload === 'object' && !Array.isArray(resolvedPayload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'DELETE',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: action.status ?? 200,\n body: resolvedPayload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) resolvedPayload = afterInterceptors.body\n }\n const status = action.status ?? 200\n const response = json(resolvedPayload, { status })\n attachOperationHeader(response, logEntry)\n if (cmdDeleteGuardAfterCallbacks.length && ctx.auth.tenantId && candidateId) {\n await runGuardAfterSuccessCallbacks(cmdDeleteGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: candidateId,\n operation: 'delete',\n requestMethod: request.method,\n requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.deleted) \u2014 command path\n if (deleteLifecycleCmd.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), deleteLifecycleCmd.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: deleteLifecycleCmd.afterEventId, entity: deleteLifecycleCmd.entity!, operation: 'delete', timing: 'after', resourceId: candidateId ?? null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n // Note: side effects (events + indexing) are already flushed by CommandBus.execute()\n // via flushCrudSideEffects(). Calling markCommandResultForIndexing here would cause\n // duplicate event emissions.\n return response\n }\n\n const idFrom = opts.del?.idFrom || 'query'\n const id = idFrom === 'query'\n ? url.searchParams.get('id')\n : (await request.json().catch(() => ({}))).id\n if (!isUuid(id)) return json({ error: 'ID is required' }, { status: 400 })\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'DELETE',\n body: idFrom === 'query' ? undefined : ({ id } as Record<string, unknown>),\n query: idFrom === 'query' ? ({ id } as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n\n // Sync before-event (*.deleting)\n const deleteLifecycle = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'deleted')\n if (deleteLifecycle.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), deleteLifecycle.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: deleteLifecycle.beforeEventId, entity: deleteLifecycle.entity!, operation: 'delete', timing: 'before', resourceId: id, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n }\n }\n\n await opts.hooks?.beforeDelete?.(id!, ctx)\n\n // Mutation guard registry (multi-guard)\n const deleteUserFeatures = await resolveUserFeatures(ctx)\n const { allGuards: deleteAllGuards } = collectAndRunGuards(ctx.container)\n let deleteGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (deleteAllGuards.length && ctx.auth.tenantId) {\n const guardResult = await runMutationGuards(deleteAllGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: id,\n operation: 'delete',\n requestMethod: request.method,\n requestHeaders: request.headers,\n }, { userFeatures: deleteUserFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n deleteGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n\n const targetOrgId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (ormCfg.orgField && !targetOrgId) return json({ error: 'Organization context is required' }, { status: 400 })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n const where: any = buildScopedWhere(\n { [ormCfg.idField!]: id },\n {\n organizationId: ormCfg.orgField ? targetOrgId : undefined,\n organizationIds: ormCfg.orgField ? ctx.organizationIds ?? undefined : undefined,\n tenantId: ormCfg.tenantField ? ctx.auth.tenantId : undefined,\n orgField: ormCfg.orgField,\n tenantField: ormCfg.tenantField,\n softDeleteField: ormCfg.softDeleteField,\n }\n )\n const entity = await de.deleteOrmEntity({\n entity: ormCfg.entity,\n where,\n soft: opts.del?.softDelete !== false,\n softDeleteField: ormCfg.softDeleteField ?? undefined,\n })\n if (!entity) return json({ error: 'Not found' }, { status: 404 })\n await opts.hooks?.afterDelete?.(id!, ctx)\n\n // Guard afterSuccess callbacks (multi)\n if (deleteGuardAfterCallbacks.length && ctx.auth.tenantId) {\n await runGuardAfterSuccessCallbacks(deleteGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId, organizationId: scopeOrganizationId, userId: ctx.auth.sub,\n resourceKind, resourceId: id, operation: 'delete',\n requestMethod: request.method, requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.deleted)\n if (deleteLifecycle.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), deleteLifecycle.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: deleteLifecycle.afterEventId, entity: deleteLifecycle.entity!, operation: 'delete', timing: 'after', resourceId: id, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { entityData: snapshotEntity(entity) },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n if (entity) {\n const identifiers = identifierResolver(entity, 'deleted')\n de.markOrmEntityChange({\n action: 'deleted',\n entity,\n identifiers,\n events: opts.events as CrudEventsConfig | undefined,\n indexer: opts.indexer as CrudIndexerConfig | undefined,\n })\n await de.flushOrmEntityChanges()\n await invalidateCrudCache(ctx.container, resourceKind, identifiers, ctx.auth.tenantId ?? null, 'deleted', resourceTargets)\n }\n const payload = opts.del?.response ? opts.del.response(id) : { success: true }\n if (interceptorRequestPayload && payload && typeof payload === 'object' && !Array.isArray(payload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'DELETE',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) {\n return json(afterInterceptors.body, { status: 200, headers: afterInterceptors.headers })\n }\n }\n return json(payload)\n } catch (e) {\n return handleError(e)\n }\n }\n\n return { metadata, GET, POST, PUT, DELETE }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod'\nimport type { AwilixContainer } from 'awilix'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { buildScopedWhere } from '@open-mercato/shared/lib/api/crud'\nimport { getAuthFromCookies, getAuthFromRequest, type AuthContext } from '@open-mercato/shared/lib/auth/server'\nimport type { QueryEngine, Where, Sort, Page, QueryCustomFieldSource, QueryJoinEdge } from '@open-mercato/shared/lib/query/types'\nimport { SortDir } from '@open-mercato/shared/lib/query/types'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport { resolveOrganizationScopeForRequest, type OrganizationScope } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { serializeOperationMetadata } from '@open-mercato/shared/lib/commands/operationMetadata'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport {\n runMutationGuards,\n bridgeLegacyGuard,\n type MutationGuard,\n type MutationGuardAfterInput,\n} from './mutation-guard-registry'\nimport { getAllMutationGuardInstances } from './mutation-guard-store'\nimport { getAllSyncSubscribers } from './sync-subscriber-store'\nimport { collectSyncSubscribers, runSyncBeforeEvent, runSyncAfterEvent } from './sync-event-runner'\nimport type { SyncCrudEventPayload } from './sync-event-types'\nimport type { RateLimitConfig } from '@open-mercato/shared/lib/ratelimit/types'\nimport type {\n CrudEventAction,\n CrudEventsConfig,\n CrudIndexerConfig,\n CrudIdentifierResolver,\n} from './types'\nimport {\n extractCustomFieldValuesFromPayload,\n extractAllCustomFieldEntries,\n decorateRecordWithCustomFields,\n loadCustomFieldDefinitionIndex,\n} from './custom-fields'\nimport { serializeExport, normalizeExportFormat, defaultExportFilename, ensureColumns, type CrudExportFormat, type PreparedExport } from './exporters'\nimport { CrudHttpError, isCrudHttpError } from './errors'\nimport type { CommandBus, CommandLogMetadata } from '@open-mercato/shared/lib/commands'\nimport type { EntityId } from '@open-mercato/shared/modules/entities'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport {\n buildCollectionTags,\n buildRecordTag,\n canonicalizeResourceTag,\n debugCrudCache,\n deriveResourceFromCommandId,\n expandResourceAliases,\n invalidateCrudCache,\n isCrudCacheDebugEnabled,\n isCrudCacheEnabled,\n normalizeIdentifierValue,\n normalizeTagSegment,\n resolveCrudCache,\n} from './cache'\nimport { deriveCrudSegmentTag } from './cache-stats'\nimport { createProfiler, shouldEnableProfiler, type Profiler } from '@open-mercato/shared/lib/profiler'\nimport { getTranslationOverlayPlugin } from '@open-mercato/shared/lib/localization/overlay-plugin'\nimport { applyResponseEnrichers, applyResponseEnricherToRecord } from './enricher-runner'\nimport type { EnricherContext } from './response-enricher'\nimport type { ApiInterceptorMethod, InterceptorRequest, InterceptorResponse } from './api-interceptor'\nimport { runApiInterceptorsAfter, runApiInterceptorsBefore } from './interceptor-runner'\nimport { mergeIdFilter, parseIdsParam } from './ids'\nimport { parseExtensionHeaders } from '../umes/extension-headers'\n\ntype RbacServiceLike = {\n getGrantedFeatures: (userId: string, opts: { tenantId: string | null; organizationId: string | null }) => Promise<string[]>\n}\n\nexport type CrudHooks<TCreate, TUpdate, TList> = {\n beforeList?: (q: TList, ctx: CrudCtx) => Promise<void> | void\n afterList?: (res: any, ctx: CrudCtx & { query: TList }) => Promise<void> | void\n beforeCreate?: (input: TCreate, ctx: CrudCtx) => Promise<TCreate | void> | TCreate | void\n afterCreate?: (entity: any, ctx: CrudCtx & { input: TCreate }) => Promise<void> | void\n beforeUpdate?: (input: TUpdate, ctx: CrudCtx) => Promise<TUpdate | void> | TUpdate | void\n afterUpdate?: (entity: any, ctx: CrudCtx & { input: TUpdate }) => Promise<void> | void\n beforeDelete?: (id: string, ctx: CrudCtx) => Promise<void> | void\n afterDelete?: (id: string, ctx: CrudCtx) => Promise<void> | void\n}\n\nexport type CrudMethodMetadata = {\n requireAuth?: boolean\n requireRoles?: string[]\n requireFeatures?: string[]\n rateLimit?: RateLimitConfig\n}\n\nexport type CrudMetadata = {\n GET?: CrudMethodMetadata\n POST?: CrudMethodMetadata\n PUT?: CrudMethodMetadata\n DELETE?: CrudMethodMetadata\n}\n\nexport type OrmEntityConfig = {\n entity: any // MikroORM entity class\n idField?: string // default: 'id'\n orgField?: string | null // default: 'organizationId'; pass null to disable automatic org scoping\n tenantField?: string | null // default: 'tenantId'; pass null to disable automatic tenant scoping\n softDeleteField?: string | null // default: 'deletedAt'; pass null to disable implicit soft delete filter\n}\n\nexport type CustomFieldsConfig =\n | false\n | {\n enabled: true\n entityId: any // datamodel entity id, e.g. E.example.todo\n // If true, picks body keys starting with `cf_` and maps `cf_<name>` -> `<name>`\n pickPrefixed?: boolean\n // Optional custom mapper; if provided, used instead of pickPrefixed\n map?: (data: Record<string, any>) => Record<string, any>\n }\n\nexport type CrudListCustomFieldDecorator = {\n entityIds: EntityId | EntityId[]\n resolveContext?: (item: any, ctx: CrudCtx) => { organizationId?: string | null; tenantId?: string | null }\n}\n\nexport type ListConfig<TList> = {\n schema: z.ZodType<TList>\n // Optional: use the QueryEngine when entityId + fields are provided\n entityId?: any\n fields?: any[]\n sortFieldMap?: Record<string, any>\n buildFilters?: (query: TList, ctx: CrudCtx) => Where<any> | Promise<Where<any>>\n transformItem?: (item: any) => any\n allowCsv?: boolean\n csv?: {\n headers: string[]\n row: (item: any) => (string | number | boolean | null | undefined)[]\n filename?: string\n }\n export?: CrudExportOptions\n customFieldSources?: QueryCustomFieldSource[]\n joins?: QueryJoinEdge[]\n decorateCustomFields?: CrudListCustomFieldDecorator\n}\n\nexport type CrudExportColumnConfig = {\n field: string\n header?: string\n resolve?: (item: any) => unknown\n}\n\nexport type CrudExportOptions = {\n enabled?: boolean\n formats?: CrudExportFormat[]\n filename?: string | ((format: CrudExportFormat) => string)\n columns?: CrudExportColumnConfig[]\n batchSize?: number\n}\n\nconst DEFAULT_EXPORT_FORMATS: CrudExportFormat[] = ['csv', 'json', 'xml', 'markdown']\nconst DEFAULT_EXPORT_BATCH_SIZE = 1000\nconst MIN_EXPORT_BATCH_SIZE = 100\nconst MAX_EXPORT_BATCH_SIZE = 10000\n\ntype ColumnResolver = {\n field: string\n header: string\n resolve: (item: any) => unknown\n}\n\nfunction resolveAvailableExportFormats(list?: ListConfig<any>): CrudExportFormat[] {\n if (!list) return []\n if (list.export?.enabled === false) return []\n const formats = list.export?.formats && list.export.formats.length > 0\n ? [...list.export.formats]\n : [...DEFAULT_EXPORT_FORMATS]\n if (!list.export?.formats && list.allowCsv && !formats.includes('csv')) formats.push('csv')\n return Array.from(new Set(formats))\n}\n\nfunction resolveExportBatchSize(list: ListConfig<any> | undefined, requestedPageSize: number): number {\n const fallback = Math.max(requestedPageSize, DEFAULT_EXPORT_BATCH_SIZE)\n const raw = list?.export?.batchSize ?? fallback\n return Math.min(Math.max(raw, MIN_EXPORT_BATCH_SIZE), MAX_EXPORT_BATCH_SIZE)\n}\n\nfunction sanitizeFieldName(base: string, used: Set<string>, fallbackIndex: number): string {\n const trimmed = base.trim()\n const sanitized = trimmed.replace(/[^a-zA-Z0-9_\\-]/g, '_') || `field_${fallbackIndex}`\n const normalized = /^[A-Za-z_]/.test(sanitized) ? sanitized : `f_${sanitized}`\n let candidate = normalized\n let counter = 1\n while (used.has(candidate)) {\n candidate = `${normalized}_${counter++}`\n }\n used.add(candidate)\n return candidate\n}\n\nfunction buildExportFromColumns(items: any[], columnsConfig: CrudExportColumnConfig[]): PreparedExport {\n const used = new Set<string>()\n const columns: ColumnResolver[] = columnsConfig.map((col, idx) => {\n const fieldName = sanitizeFieldName(col.field || `field_${idx}`, used, idx)\n const header = col.header?.trim().length ? col.header!.trim() : col.field || `Field ${idx + 1}`\n const resolver = col.resolve\n ? col.resolve\n : ((item: any) => (item != null ? (item as any)[col.field] : undefined))\n return { field: fieldName, header, resolve: resolver }\n })\n const rows = items.map((item) => {\n const row: Record<string, unknown> = {}\n columns.forEach((column) => {\n try {\n row[column.field] = column.resolve(item)\n } catch {\n row[column.field] = undefined\n }\n })\n return row\n })\n return {\n columns: columns.map(({ field, header }) => ({ field, header })),\n rows,\n }\n}\n\nfunction buildExportFromCsv(items: any[], csv: NonNullable<ListConfig<any>['csv']>): PreparedExport {\n const used = new Set<string>()\n const columns = csv.headers.map((header, idx) => ({\n field: sanitizeFieldName(header || `column_${idx + 1}`, used, idx),\n header: header || `Column ${idx + 1}`,\n }))\n const rows = items.map((item) => {\n const values = csv.row(item) || []\n const row: Record<string, unknown> = {}\n columns.forEach((column, idx) => {\n row[column.field] = values[idx]\n })\n return row\n })\n return { columns, rows }\n}\n\nfunction buildDefaultExport(items: any[]): PreparedExport {\n const rows = items.map((item) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n return { ...(item as Record<string, unknown>) }\n }\n return { value: item }\n })\n return {\n columns: ensureColumns(rows),\n rows,\n }\n}\n\nfunction prepareExportData(items: any[], list: ListConfig<any>): PreparedExport {\n if (list.export?.columns && list.export.columns.length > 0) {\n return buildExportFromColumns(items, list.export.columns)\n }\n if (list.csv) {\n return buildExportFromCsv(items, list.csv)\n }\n const prepared = buildDefaultExport(items)\n return {\n columns: ensureColumns(prepared.rows, prepared.columns),\n rows: prepared.rows,\n }\n}\n\nfunction finalizeExportFilename(list: ListConfig<any>, format: CrudExportFormat, fallbackBase: string): string {\n const extension = format === 'markdown' ? 'md' : format\n const fromExport = list.export?.filename\n const apply = (value: string | null | undefined): string | null => {\n if (!value) return null\n const trimmed = value.trim()\n if (!trimmed) return null\n const sanitized = trimmed.replace(/[^a-z0-9_\\-\\.]/gi, '_')\n const lower = sanitized.toLowerCase()\n if (lower.endsWith(`.${extension}`)) return sanitized\n const withoutExtension = sanitized.includes('.') ? sanitized.replace(/\\.[^.]+$/, '') : sanitized\n const base = withoutExtension.trim().length > 0 ? withoutExtension : sanitized\n return `${base}.${extension}`\n }\n if (typeof fromExport === 'function') {\n const computed = apply(fromExport(format))\n if (computed) return computed\n } else {\n const computed = apply(fromExport)\n if (computed) return computed\n }\n if (format === 'csv' && list.csv?.filename) {\n const csvName = apply(list.csv.filename)\n if (csvName) return csvName\n }\n return defaultExportFilename(fallbackBase, format)\n}\n\nfunction normalizeFullRecordForExport(input: any): any {\n if (!input || typeof input !== 'object') return input\n if (Array.isArray(input)) return input.map((item) => normalizeFullRecordForExport(item))\n const record: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(input)) {\n if (key.startsWith('cf_') || key.startsWith('cf:')) continue\n // Strip enricher namespaced fields and metadata from exports\n if (key === '_meta') continue\n if (key.startsWith('_') && key.length > 1) continue\n record[key] = value\n }\n const custom = extractAllCustomFieldEntries(input)\n for (const [rawKey, value] of Object.entries(custom)) {\n const sanitizedKey = rawKey.replace(/^cf_/, '')\n record[sanitizedKey] = value\n }\n return record\n}\nexport type CreateConfig<TCreate> = {\n schema: z.ZodType<TCreate>\n mapToEntity: (input: TCreate, ctx: CrudCtx) => Record<string, any>\n customFields?: CustomFieldsConfig\n response?: (entity: any) => any\n}\n\nexport type UpdateConfig<TUpdate> = {\n schema: z.ZodType<TUpdate>\n // Must contain a string uuid `id` field\n getId?: (input: TUpdate) => string\n applyToEntity: (entity: any, input: TUpdate, ctx: CrudCtx) => void | Promise<void>\n customFields?: CustomFieldsConfig\n response?: (entity: any) => any\n}\n\nexport type DeleteConfig = {\n // Where to take id from; default: query param `id`\n idFrom?: 'query' | 'body'\n softDelete?: boolean // default true\n response?: (id: string) => any\n}\n\nexport type CrudCommandActionConfig = {\n commandId: string\n schema?: z.ZodTypeAny\n mapInput?: (args: { parsed: any; raw: any; ctx: CrudCtx }) => Promise<any> | any\n metadata?: (args: { input: any; parsed: any; raw: any; ctx: CrudCtx }) => Promise<CommandLogMetadata | null> | CommandLogMetadata | null\n response?: (args: { result: any; logEntry: any | null; ctx: CrudCtx }) => any\n status?: number\n}\n\nexport type CrudCtx = {\n container: AwilixContainer\n auth: AuthContext | null\n organizationScope: OrganizationScope | null\n selectedOrganizationId: string | null\n organizationIds: string[] | null\n request?: Request\n}\n\nexport type CrudFactoryOptions<TCreate, TUpdate, TList> = {\n metadata?: CrudMetadata\n orm: OrmEntityConfig\n list?: ListConfig<TList>\n create?: CreateConfig<TCreate>\n update?: UpdateConfig<TUpdate>\n del?: DeleteConfig\n events?: CrudEventsConfig\n indexer?: CrudIndexerConfig\n resolveIdentifiers?: CrudIdentifierResolver\n hooks?: CrudHooks<TCreate, TUpdate, TList>\n actions?: {\n create?: CrudCommandActionConfig\n update?: CrudCommandActionConfig\n delete?: CrudCommandActionConfig\n }\n /** Response enricher configuration. When set, enrichers targeting this entity run after afterList hook. */\n enrichers?: {\n /** Entity ID for enricher matching (e.g., 'customers.person') */\n entityId: string\n }\n}\n\nfunction deriveResourceFromActions(actions: CrudFactoryOptions<any, any, any>['actions']): string | null {\n if (!actions) return null\n const ids: Array<string | null | undefined> = [actions.create?.commandId, actions.update?.commandId, actions.delete?.commandId]\n for (const id of ids) {\n const resolved = deriveResourceFromCommandId(id)\n if (resolved) return resolved\n }\n return null\n}\n\nfunction resolveResourceAliasesList(\n opts: CrudFactoryOptions<any, any, any>,\n ormEntityName: string | undefined\n): { primary: string; aliases: string[] } {\n const eventsResource =\n opts.events?.module && opts.events?.entity ? `${opts.events.module}.${opts.events.entity}` : null\n const commandResource = deriveResourceFromActions(opts.actions)\n const rawCandidate = eventsResource ?? commandResource ?? ormEntityName ?? 'resource'\n const primary = canonicalizeResourceTag(rawCandidate) ?? 'resource'\n return { primary, aliases: [] }\n}\n\nfunction mergeCommandMetadata(base: CommandLogMetadata, override: CommandLogMetadata | null | undefined): CommandLogMetadata {\n if (!override) return base\n const mergedContext = {\n ...(base.context ?? {}),\n ...(override.context ?? {}),\n }\n const merged: CommandLogMetadata = {\n ...base,\n ...override,\n }\n if (Object.keys(mergedContext).length > 0) merged.context = mergedContext\n else if ('context' in merged) delete merged.context\n return merged\n}\n\nfunction json(data: any, init?: ResponseInit) {\n return new Response(JSON.stringify(data), {\n ...(init || {}),\n headers: { 'content-type': 'application/json', ...(init?.headers || {}) },\n })\n}\n\nfunction attachOperationHeader(res: Response, logEntry: any) {\n if (!res || !(res instanceof Response)) return res\n if (!logEntry || typeof logEntry !== 'object') return res\n const undoToken = typeof logEntry.undoToken === 'string' ? logEntry.undoToken : null\n const id = typeof logEntry.id === 'string' ? logEntry.id : null\n const commandId = typeof logEntry.commandId === 'string' ? logEntry.commandId : null\n if (!undoToken || !id || !commandId) return res\n const actionLabel = typeof logEntry.actionLabel === 'string' ? logEntry.actionLabel : null\n const resourceKind = typeof logEntry.resourceKind === 'string' ? logEntry.resourceKind : null\n const resourceId = typeof logEntry.resourceId === 'string' ? logEntry.resourceId : null\n const createdAt = logEntry.createdAt instanceof Date\n ? logEntry.createdAt.toISOString()\n : (typeof logEntry.createdAt === 'string' ? logEntry.createdAt : new Date().toISOString())\n const headerValue = serializeOperationMetadata({\n id,\n undoToken,\n commandId,\n actionLabel,\n resourceKind,\n resourceId,\n executedAt: createdAt,\n })\n try {\n res.headers.set('x-om-operation', headerValue)\n } catch {\n // no-op if headers already sent\n }\n return res\n}\n\nfunction handleError(err: unknown): Response {\n if (err instanceof Response) return err\n if (isCrudHttpError(err)) return json(err.body, { status: err.status })\n if (err instanceof z.ZodError) return json({ error: 'Invalid input', details: err.issues }, { status: 400 })\n\n const message = err instanceof Error ? err.message : undefined\n const stack = err instanceof Error ? err.stack : undefined\n // eslint-disable-next-line no-console\n console.error('[crud] unexpected error', { message, stack, err })\n const body: Record<string, unknown> = {\n error: 'Internal server error',\n message: 'Something went wrong. Please try again later.',\n }\n return json(body, { status: 500 })\n}\n\nconst LIFECYCLE_ACTION_MAP: Record<string, { before: string; after: string }> = {\n created: { before: 'creating', after: 'created' },\n updated: { before: 'updating', after: 'updated' },\n deleted: { before: 'deleting', after: 'deleted' },\n}\n\nfunction deriveLifecycleEventIds(events: CrudEventsConfig | undefined, action: 'created' | 'updated' | 'deleted'): { beforeEventId: string | null; afterEventId: string | null; entity: string | null } {\n if (!events?.module || !events?.entity) return { beforeEventId: null, afterEventId: null, entity: null }\n const mapping = LIFECYCLE_ACTION_MAP[action]\n if (!mapping) return { beforeEventId: null, afterEventId: null, entity: null }\n const entity = `${events.module}.${events.entity}`\n return {\n beforeEventId: `${entity}.${mapping.before}`,\n afterEventId: `${entity}.${mapping.after}`,\n entity,\n }\n}\n\nfunction buildSyncPayload(\n base: {\n eventId: string\n entity: string\n operation: 'create' | 'update' | 'delete'\n timing: 'before' | 'after'\n resourceId: string | null\n userId: string\n organizationId: string | null\n tenantId: string\n em: EntityManager\n request: Request\n },\n extra?: {\n payload?: Record<string, unknown>\n previousData?: Record<string, unknown>\n entityData?: Record<string, unknown>\n },\n): SyncCrudEventPayload {\n return {\n ...base,\n payload: extra?.payload,\n previousData: extra?.previousData,\n entityData: extra?.entityData,\n }\n}\n\nfunction collectAndRunGuards(\n container: AwilixContainer,\n): { allGuards: MutationGuard[] } {\n const allGuards = [...getAllMutationGuardInstances()]\n const legacyGuard = bridgeLegacyGuard(container)\n if (legacyGuard) allGuards.push(legacyGuard)\n return { allGuards }\n}\n\nasync function runGuardAfterSuccessCallbacks(\n callbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }>,\n base: Omit<MutationGuardAfterInput, 'metadata'>,\n): Promise<void> {\n for (const { guard, metadata: guardMeta } of callbacks) {\n try {\n await guard.afterSuccess!({ ...base, metadata: guardMeta })\n } catch (error) {\n console.error(`[mutation-guard] afterSuccess failed for guard ${guard.id}`, error)\n }\n }\n}\n\nfunction snapshotEntity(entity: unknown): Record<string, unknown> | undefined {\n if (!entity || typeof entity !== 'object') return undefined\n return safeClone(entity) as Record<string, unknown>\n}\n\nfunction normalizeInterceptorRoutePath(request: Request): string {\n try {\n const pathname = new URL(request.url).pathname\n if (pathname.startsWith('/api/')) return pathname.slice(5)\n if (pathname === '/api') return ''\n return pathname.replace(/^\\/+/, '')\n } catch {\n return ''\n }\n}\n\nfunction toInterceptorHeaders(headers: Headers): Record<string, string> {\n const output: Record<string, string> = {}\n headers.forEach((value, key) => {\n output[key] = value\n })\n return output\n}\n\nfunction cleanInterceptorObject(\n value: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object') return undefined\n return Object.fromEntries(Object.entries(value).filter(([, current]) => current !== undefined))\n}\n\nfunction isUuid(v: any): v is string {\n return typeof v === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(v)\n}\n\ntype AccessLogServiceLike = { log: (input: any) => Promise<unknown> | unknown }\n\nfunction resolveAccessLogService(container: AwilixContainer): AccessLogServiceLike | null {\n try {\n const service = container.resolve?.('accessLogService') as AccessLogServiceLike | undefined\n if (service && typeof service.log === 'function') return service\n } catch (err) {\n try {\n console.warn('[crud] accessLogService not available in container', err)\n } catch {}\n }\n return null\n}\n\nfunction logForbidden(details: Record<string, unknown>) {\n try {\n // eslint-disable-next-line no-console\n console.warn('[crud] Forbidden request', details)\n } catch {}\n}\n\nfunction collectFieldNames(items: any[]): string[] {\n const set = new Set<string>()\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n for (const key of Object.keys(item)) {\n if (typeof key === 'string' && key.length > 0) set.add(key)\n }\n }\n return Array.from(set)\n}\n\nfunction determineAccessType(query: unknown, total: number, idField: string): string {\n if (query && typeof query === 'object' && query !== null && idField in (query as Record<string, unknown>)) {\n const value = (query as Record<string, unknown>)[idField]\n if (value !== undefined && value !== null && String(value).length > 0) return 'read:item'\n }\n return total > 1 ? 'read:list' : 'read'\n}\n\nfunction createCrudProfiler(resource: string, operation: string): Profiler {\n const enabled = shouldEnableProfiler(resource)\n return createProfiler({\n scope: `crud:${operation}`,\n target: resource,\n label: `${resource}:${operation}`,\n loggerLabel: '[crud:profile]',\n enabled,\n })\n}\n\nexport type LogCrudAccessOptions = {\n container: AwilixContainer\n auth: AuthContext | null\n request?: Request\n items: any[]\n idField?: string\n resourceKind: string\n organizationId?: string | null\n tenantId?: string | null\n query?: unknown\n accessType?: string\n fields?: string[]\n}\n\nexport async function logCrudAccess(options: LogCrudAccessOptions) {\n const { container, auth, request, items, resourceKind } = options\n if (!auth) return\n if (!Array.isArray(items) || items.length === 0) return\n const service = resolveAccessLogService(container)\n if (!service) return\n\n const idField = options.idField || 'id'\n const tenantId = options.tenantId ?? auth.tenantId ?? null\n const organizationId = options.organizationId ?? auth.orgId ?? null\n const actorUserId = (auth.keyId ?? auth.sub) ?? null\n const fields = options.fields && options.fields.length ? options.fields : collectFieldNames(items)\n const accessType = options.accessType ?? determineAccessType(options.query, items.length, idField)\n\n const context: Record<string, unknown> = {\n resultCount: items.length,\n accessType,\n }\n if (options.query && typeof options.query === 'object' && options.query !== null) {\n context.queryKeys = Object.keys(options.query as Record<string, unknown>)\n }\n try {\n if (request) {\n const url = new URL(request.url)\n context.path = url.pathname\n }\n } catch {\n // ignore url parsing issues\n }\n\n const uniqueIds = new Set<string>()\n const tasks: Promise<unknown>[] = []\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n const rawId = (item as any)[idField]\n const resourceId = normalizeIdentifierValue(rawId)\n if (!resourceId || uniqueIds.has(resourceId)) continue\n uniqueIds.add(resourceId)\n const payload: Record<string, unknown> = {\n tenantId,\n organizationId,\n actorUserId,\n resourceKind,\n resourceId,\n accessType,\n }\n if (fields.length > 0) payload.fields = fields\n if (Object.keys(context).length > 0) payload.context = context\n tasks.push(\n Promise.resolve(service.log(payload)).catch((err) => {\n try {\n console.error('[crud] failed to record access log', { err, payload })\n } catch {}\n return undefined\n })\n )\n }\n if (tasks.length > 0) await Promise.all(tasks)\n}\n\ntype CrudCacheStoredValue = {\n payload: any\n generatedAt: number\n}\n\nfunction safeClone<T>(value: T): T {\n try {\n const structuredCloneFn = (globalThis as any).structuredClone\n if (typeof structuredCloneFn === 'function') {\n return structuredCloneFn(value)\n }\n } catch {}\n try {\n return JSON.parse(JSON.stringify(value)) as T\n } catch {\n return value\n }\n}\n\nfunction collectScopeOrganizationIds(ctx: CrudCtx): Array<string | null> {\n if (Array.isArray(ctx.organizationIds) && ctx.organizationIds.length > 0) {\n return Array.from(new Set(ctx.organizationIds))\n }\n const fallback = ctx.selectedOrganizationId ?? ctx.auth?.orgId ?? null\n return [fallback]\n}\n\nfunction serializeSearchParams(params: URLSearchParams): string {\n if (!params || params.keys().next().done) return ''\n const grouped = new Map<string, string[]>()\n params.forEach((value, key) => {\n const existing = grouped.get(key) ?? []\n existing.push(value)\n grouped.set(key, existing)\n })\n const normalized: Array<[string, string[]]> = Array.from(grouped.entries()).map(([key, values]) => [key, values.sort((a, b) => a.localeCompare(b))])\n normalized.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n return JSON.stringify(normalized)\n}\n\nfunction buildCrudCacheKey(resource: string, request: Request, ctx: CrudCtx): string {\n const url = new URL(request.url)\n const scopeIds = collectScopeOrganizationIds(ctx)\n const scopeSegment = scopeIds.length\n ? scopeIds.map((id) => normalizeTagSegment(id)).sort((a, b) => a.localeCompare(b)).join(',')\n : 'none'\n return [\n 'crud',\n normalizeTagSegment(resource),\n 'GET',\n url.pathname,\n `tenant:${normalizeTagSegment(ctx.auth?.tenantId ?? null)}`,\n `selectedOrg:${normalizeTagSegment(ctx.selectedOrganizationId ?? null)}`,\n `scope:${scopeSegment}`,\n `query:${serializeSearchParams(url.searchParams)}`,\n ].join('|')\n}\n\nfunction extractRecordIds(items: any[], idField: string): string[] {\n if (!Array.isArray(items) || !items.length) return []\n const ids = new Set<string>()\n for (const item of items) {\n if (!item || typeof item !== 'object') continue\n const rawId = (item as any)[idField]\n const id = normalizeIdentifierValue(rawId)\n if (id) ids.add(id)\n }\n return Array.from(ids)\n}\n\nexport function makeCrudRoute<TCreate = any, TUpdate = any, TList = any>(opts: CrudFactoryOptions<TCreate, TUpdate, TList>) {\n const metadata = opts.metadata || {}\n const ormCfg = {\n entity: opts.orm.entity,\n idField: opts.orm.idField ?? 'id',\n orgField: opts.orm.orgField === null ? null : opts.orm.orgField ?? 'organizationId',\n tenantField: opts.orm.tenantField === null ? null : opts.orm.tenantField ?? 'tenantId',\n softDeleteField: opts.orm.softDeleteField === null ? null : opts.orm.softDeleteField ?? 'deletedAt',\n }\n const entityName = typeof ormCfg.entity?.name === 'string' && ormCfg.entity.name.length > 0 ? ormCfg.entity.name : undefined\n const resourceInfo = resolveResourceAliasesList(opts, entityName)\n const resourceKind = resourceInfo.primary\n const resourceAliases = resourceInfo.aliases\n const resourceTargets = expandResourceAliases(resourceKind, resourceAliases)\n const defaultIdentifierResolver: CrudIdentifierResolver = (entity, _action) => {\n const id = normalizeIdentifierValue((entity as any)[ormCfg.idField!])\n const orgId = ormCfg.orgField ? normalizeIdentifierValue((entity as any)[ormCfg.orgField]) : null\n const tenantId = ormCfg.tenantField ? normalizeIdentifierValue((entity as any)[ormCfg.tenantField]) : null\n return {\n id: id ?? '',\n organizationId: orgId ?? null,\n tenantId: tenantId ?? null,\n }\n }\n const identifierResolver: CrudIdentifierResolver = opts.resolveIdentifiers\n ? (entity, action) => {\n const raw = opts.resolveIdentifiers!(entity, action)\n const id = normalizeIdentifierValue(raw?.id)\n const organizationId = normalizeIdentifierValue(raw?.organizationId)\n const tenantId = normalizeIdentifierValue(raw?.tenantId)\n return {\n id: id ?? '',\n organizationId: organizationId ?? null,\n tenantId: tenantId ?? null,\n }\n }\n : defaultIdentifierResolver\n\n const listCustomFieldDecorator = opts.list?.decorateCustomFields\n const indexerConfig = opts.indexer as CrudIndexerConfig | undefined\n const eventsConfig = opts.events as CrudEventsConfig | undefined\n\n const inferFieldValue = (item: Record<string, unknown>, keys: string[]): string | null => {\n for (const key of keys) {\n const value = item[key]\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (trimmed.length) return trimmed\n }\n }\n return null\n }\n\n const decorateItemsWithCustomFields = async (items: any[], ctx: CrudCtx): Promise<any[]> => {\n if (!listCustomFieldDecorator || !Array.isArray(items) || items.length === 0) return items\n const entityIds = Array.isArray(listCustomFieldDecorator.entityIds)\n ? listCustomFieldDecorator.entityIds\n : [listCustomFieldDecorator.entityIds]\n if (!entityIds.length) return items\n const cfProfiler = createCrudProfiler(resourceKind, 'custom_fields')\n cfProfiler.mark('prepare')\n let profileClosed = false\n const endProfile = (extra?: Record<string, unknown>) => {\n if (!cfProfiler.enabled || profileClosed) return\n profileClosed = true\n cfProfiler.end(extra)\n }\n try {\n const em = (ctx.container.resolve('em') as EntityManager)\n const organizationIds =\n Array.isArray(ctx.organizationIds) && ctx.organizationIds.length\n ? ctx.organizationIds\n : [ctx.selectedOrganizationId ?? null]\n const definitionIndex = await loadCustomFieldDefinitionIndex({\n em,\n entityIds,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds,\n })\n cfProfiler.mark('definitions_loaded', { definitionCount: definitionIndex.size })\n const decoratedItems = items.map((raw) => {\n if (!raw || typeof raw !== 'object') return raw\n const item = raw as Record<string, unknown>\n const context = listCustomFieldDecorator.resolveContext\n ? listCustomFieldDecorator.resolveContext(raw, ctx) ?? {}\n : {}\n const organizationId =\n context.organizationId ??\n inferFieldValue(item, ['organization_id', 'organizationId'])\n const tenantId =\n context.tenantId ??\n inferFieldValue(item, ['tenant_id', 'tenantId']) ??\n ctx.auth?.tenantId ??\n null\n const decorated = decorateRecordWithCustomFields(item, definitionIndex, {\n organizationId: organizationId ?? null,\n tenantId: tenantId ?? null,\n })\n const output = {\n ...item,\n customValues: decorated.customValues,\n customFields: decorated.customFields,\n }\n return output\n })\n cfProfiler.mark('decorate_complete', { itemCount: decoratedItems.length })\n endProfile({\n entityIds: entityIds.length,\n itemCount: decoratedItems.length,\n })\n return decoratedItems\n } catch (err) {\n console.warn('[crud] failed to decorate custom fields', err)\n endProfile({\n result: 'error',\n entityIds: entityIds.length,\n itemCount: items.length,\n })\n return items\n }\n }\n\n /**\n * Build enricher context from CRUD context and resolve user features for ACL gating.\n * Returns null if enrichers are not configured or auth is missing.\n */\n async function buildEnricherContext(ctx: CrudCtx): Promise<EnricherContext | null> {\n if (!opts.enrichers?.entityId) return null\n if (!ctx.auth) return null\n\n let userFeatures: string[] | undefined\n try {\n const rbac = ctx.container.resolve('rbacService') as RbacServiceLike | undefined\n if (rbac?.getGrantedFeatures) {\n userFeatures = await rbac.getGrantedFeatures(ctx.auth.sub, {\n tenantId: ctx.auth.tenantId,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId,\n })\n }\n } catch {\n // rbacService not available \u2014 enrichers without feature requirements still run\n }\n\n return {\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? '',\n tenantId: ctx.auth.tenantId ?? '',\n userId: ctx.auth.sub,\n em: ctx.container.resolve('em'),\n container: ctx.container,\n userFeatures,\n }\n }\n\n async function resolveUserFeatures(ctx: CrudCtx): Promise<string[] | undefined> {\n if (!ctx.auth) return undefined\n try {\n const rbac = ctx.container.resolve('rbacService') as RbacServiceLike | undefined\n if (rbac?.getGrantedFeatures) {\n return await rbac.getGrantedFeatures(ctx.auth.sub, {\n tenantId: ctx.auth.tenantId,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId,\n })\n }\n } catch {\n // rbacService is optional in some contexts\n }\n return undefined\n }\n\n const interceptorContextCache = new WeakMap<object, ReturnType<typeof buildInterceptorContextInner>>()\n\n async function buildInterceptorContextInner(ctx: CrudCtx) {\n if (!ctx.auth) return null\n return {\n userId: ctx.auth.sub,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? '',\n tenantId: ctx.auth.tenantId ?? '',\n em: ctx.container.resolve('em'),\n container: ctx.container,\n userFeatures: await resolveUserFeatures(ctx),\n }\n }\n\n function buildInterceptorContext(ctx: CrudCtx) {\n const cached = interceptorContextCache.get(ctx)\n if (cached) return cached\n const promise = buildInterceptorContextInner(ctx)\n interceptorContextCache.set(ctx, promise)\n return promise\n }\n\n async function applyInterceptorsBefore(args: {\n ctx: CrudCtx\n request: Request\n method: ApiInterceptorMethod\n body?: Record<string, unknown>\n query?: Record<string, unknown>\n }): Promise<{ errorResponse: Response | null; requestPayload: InterceptorRequest; metadataByInterceptor: Record<string, Record<string, unknown> | undefined> }> {\n const interceptorContext = await buildInterceptorContext(args.ctx)\n const requestPayload: InterceptorRequest = {\n method: args.method,\n url: args.request.url,\n body: cleanInterceptorObject(args.body),\n query: cleanInterceptorObject(args.query),\n headers: toInterceptorHeaders(args.request.headers),\n }\n if (!interceptorContext) {\n return { errorResponse: null, requestPayload, metadataByInterceptor: {} }\n }\n const contextWithHeaders = {\n ...interceptorContext,\n extensionHeaders: parseExtensionHeaders(requestPayload.headers),\n }\n const result = await runApiInterceptorsBefore({\n routePath: normalizeInterceptorRoutePath(args.request),\n method: args.method,\n request: requestPayload,\n context: contextWithHeaders,\n })\n if (!result.ok) {\n return { errorResponse: json(result.body, { status: result.statusCode }), requestPayload, metadataByInterceptor: {} }\n }\n return { errorResponse: null, requestPayload: result.request, metadataByInterceptor: result.metadataByInterceptor }\n }\n\n async function applyInterceptorsAfter(args: {\n ctx: CrudCtx\n request: Request\n method: ApiInterceptorMethod\n requestPayload: InterceptorRequest\n metadataByInterceptor: Record<string, Record<string, unknown> | undefined>\n statusCode: number\n body: Record<string, unknown>\n headers?: Record<string, string>\n }): Promise<{ ok: boolean; statusCode: number; body: Record<string, unknown>; headers: Record<string, string> } | null> {\n const interceptorContext = await buildInterceptorContext(args.ctx)\n if (!interceptorContext) return { ok: true, statusCode: args.statusCode, body: args.body, headers: args.headers ?? {} }\n const result = await runApiInterceptorsAfter({\n routePath: normalizeInterceptorRoutePath(args.request),\n method: args.method,\n request: args.requestPayload,\n response: {\n statusCode: args.statusCode,\n body: args.body,\n headers: args.headers ?? {},\n } satisfies InterceptorResponse,\n context: interceptorContext,\n metadataByInterceptor: args.metadataByInterceptor,\n })\n return result\n }\n\n /**\n * Apply response enrichers to list payload items.\n * Mutates payload.items and adds payload._meta.\n * No-op if enrichers are not configured.\n */\n async function enrichListPayload(payload: any, ctx: CrudCtx, profiler?: Profiler): Promise<void> {\n if (!opts.enrichers?.entityId) return\n const enricherCtx = await buildEnricherContext(ctx)\n if (!enricherCtx) return\n profiler?.mark('enrichers_start')\n const result = await applyResponseEnrichers(payload.items, opts.enrichers.entityId, enricherCtx)\n payload.items = result.items\n if (result._meta.enrichedBy.length > 0 || result._meta.enricherErrors?.length) {\n payload._meta = { ...(payload._meta || {}), ...result._meta }\n }\n profiler?.mark('enrichers_complete', { enricherCount: result._meta.enrichedBy.length })\n }\n\n /**\n * Apply response enrichers to a single record.\n * Returns the enriched record with _meta merged.\n */\n async function enrichSingleRecord(record: any, ctx: CrudCtx): Promise<any> {\n if (!opts.enrichers?.entityId) return record\n const enricherCtx = await buildEnricherContext(ctx)\n if (!enricherCtx) return record\n const result = await applyResponseEnricherToRecord(record, opts.enrichers.entityId, enricherCtx)\n if (result._meta.enrichedBy.length > 0 || result._meta.enricherErrors?.length) {\n return { ...result.record, _meta: result._meta }\n }\n return result.record\n }\n\n async function ensureAuth(request?: Request | null) {\n const auth = request ? await getAuthFromRequest(request) : await getAuthFromCookies()\n if (!auth) return null\n if (auth.tenantId && !isUuid(auth.tenantId)) return null\n return auth\n }\n\n async function withCtx(request: Request): Promise<CrudCtx> {\n const container = await createRequestContainer()\n const rawAuth = await ensureAuth(request)\n let scope: OrganizationScope | null = null\n let selectedOrganizationId: string | null = null\n let organizationIds: string[] | null = null\n if (rawAuth) {\n try {\n scope = await resolveOrganizationScopeForRequest({ container, auth: rawAuth, request })\n } catch {\n scope = null\n }\n }\n const scopedTenantId = scope?.tenantId ?? rawAuth?.tenantId ?? null\n const scopedOrgId = scope ? (scope.selectedId ?? null) : (rawAuth?.orgId ?? null)\n selectedOrganizationId = scopedOrgId\n const scopedAuth = rawAuth\n ? {\n ...rawAuth,\n tenantId: scopedTenantId ?? null,\n orgId: scopedOrgId ?? null,\n }\n : null\n const fallbackOrgId = scopedOrgId ?? rawAuth?.orgId ?? null\n const rawScopeIds = scope?.filterIds\n const scopedIds = Array.isArray(rawScopeIds) ? rawScopeIds.filter((id): id is string => typeof id === 'string' && id.length > 0) : null\n if (!scope) {\n organizationIds = fallbackOrgId ? [fallbackOrgId] : null\n } else if (scopedIds === null) {\n organizationIds = scope.allowedIds === null ? null : (fallbackOrgId ? [fallbackOrgId] : null)\n } else if (scopedIds.length > 0) {\n organizationIds = Array.from(new Set(scopedIds))\n } else if (fallbackOrgId) {\n const allowedIds = Array.isArray(scope?.allowedIds) ? scope.allowedIds : null\n let canUseFallback = false\n if (allowedIds === null) {\n canUseFallback = true\n } else if (allowedIds.includes(fallbackOrgId) || allowedIds.length === 0) {\n canUseFallback = true\n }\n if (canUseFallback) {\n organizationIds = [fallbackOrgId]\n } else {\n organizationIds = []\n }\n } else {\n organizationIds = []\n }\n return { container, auth: scopedAuth, organizationScope: scope, selectedOrganizationId, organizationIds, request }\n }\n\n async function GET(request: Request) {\n const profiler = createCrudProfiler(resourceKind, 'list')\n const requestMeta: Record<string, unknown> = { method: request.method }\n try {\n const urlObj = new URL(request.url)\n requestMeta.path = urlObj.pathname\n requestMeta.url = request.url\n if (urlObj.search) requestMeta.query = urlObj.search\n } catch {\n requestMeta.url = request.url\n }\n profiler.mark('request_received', requestMeta)\n let profileClosed = false\n const finishProfile = (extra?: Record<string, unknown>) => {\n if (!profiler.enabled || profileClosed) return\n profileClosed = true\n const meta = extra ? { ...requestMeta, ...extra } : { ...requestMeta }\n profiler.end(meta)\n }\n try {\n profiler.mark('resolve_context')\n const ctx = await withCtx(request)\n profiler.mark('context_ready')\n if (!ctx.auth) {\n finishProfile({ reason: 'unauthorized' })\n return json({ error: 'Unauthorized' }, { status: 401 })\n }\n if (!opts.list) {\n finishProfile({ reason: 'list_not_configured' })\n return json({ error: 'Not implemented' }, { status: 501 })\n }\n const url = new URL(request.url)\n const rawQueryParams = Object.fromEntries(url.searchParams.entries())\n profiler.mark('query_parsed')\n let validated = opts.list.schema.parse(rawQueryParams)\n profiler.mark('query_validated')\n\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'GET',\n query: (validated as Record<string, unknown>),\n })\n if (beforeInterceptors.errorResponse) {\n finishProfile({ result: 'interceptor_before_blocked' })\n return beforeInterceptors.errorResponse\n }\n const interceptorRequest = beforeInterceptors.requestPayload\n const interceptorMetadata = beforeInterceptors.metadataByInterceptor\n if (interceptorRequest.query) {\n validated = opts.list.schema.parse(interceptorRequest.query)\n }\n const queryParams = {\n ...rawQueryParams,\n ...(interceptorRequest.query ?? {}),\n } as Record<string, unknown>\n const parsedIds = parseIdsParam(queryParams.ids)\n\n await opts.hooks?.beforeList?.(validated as any, ctx)\n profiler.mark('before_list_hook')\n\n const availableFormats = resolveAvailableExportFormats(opts.list)\n const requestedExport = normalizeExportFormat((queryParams as any).format)\n const exportRequested = requestedExport != null && availableFormats.includes(requestedExport)\n const requestedPage = Number((queryParams as any).page ?? 1) || 1\n const requestedPageSize = Math.min(Math.max(Number((queryParams as any).pageSize ?? 50) || 50, 1), 100)\n const exportPageSize = exportRequested ? resolveExportBatchSize(opts.list, requestedPageSize) : requestedPageSize\n const exportScopeParam = (queryParams as any).exportScope ?? (queryParams as any).export_scope\n const exportScope = typeof exportScopeParam === 'string' ? exportScopeParam.toLowerCase() : null\n const exportFullRequested = exportRequested && (exportScope === 'full' || parseBooleanToken((queryParams as any).full) === true)\n profiler.mark('export_configured', { exportRequested, exportFullRequested })\n\n const cacheEnabled = isCrudCacheEnabled() && !exportRequested\n const cacheTimerStart = cacheEnabled && isCrudCacheDebugEnabled()\n ? process.hrtime.bigint()\n : null\n const cache = cacheEnabled ? resolveCrudCache(ctx.container) : null\n const cacheKey = cacheEnabled ? buildCrudCacheKey(resourceKind, request, ctx) : null\n let cacheStatus: 'hit' | 'miss' = 'miss'\n let cachedValue: CrudCacheStoredValue | null = null\n\n if (cacheEnabled && cache && cacheKey) {\n const rawCached = await cache.get(cacheKey)\n if (rawCached !== null && rawCached !== undefined) {\n if (typeof rawCached === 'object' && 'payload' in (rawCached as any)) {\n cachedValue = rawCached as CrudCacheStoredValue\n } else {\n cachedValue = { payload: rawCached, generatedAt: Date.now() }\n }\n }\n }\n profiler.mark('cache_checked', { cached: cachedValue !== null })\n\n const tenantForScope = ctx.auth?.tenantId ?? null\n const maybeStoreCrudCache = async (payload: any) => {\n if (!cacheEnabled || !cache || !cacheKey) return\n if (!payload || typeof payload !== 'object') return\n if (Array.isArray(payload)) return\n const items = Array.isArray((payload as any).items) ? (payload as any).items : []\n const tags = new Set<string>()\n const scopeOrgIds = collectScopeOrganizationIds(ctx)\n const crudSegment = deriveCrudSegmentTag(resourceKind, request)\n for (const target of resourceTargets) {\n for (const tag of buildCollectionTags(target, tenantForScope, scopeOrgIds)) {\n tags.add(tag)\n }\n }\n const recordIds = extractRecordIds(items, ormCfg.idField!)\n for (const recordId of recordIds) {\n for (const target of resourceTargets) {\n tags.add(buildRecordTag(target, tenantForScope, recordId))\n }\n }\n if (crudSegment) {\n tags.add(`crud:segment:${crudSegment}`)\n }\n if (!tags.size) return\n try {\n await cache.set(cacheKey, { payload: safeClone(payload), generatedAt: Date.now() }, { tags: Array.from(tags) })\n debugCrudCache('store', {\n resource: resourceKind,\n key: cacheKey,\n tags: Array.from(tags),\n itemCount: items.length,\n })\n } catch (err) {\n debugCrudCache('store', {\n resource: resourceKind,\n key: cacheKey,\n error: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n const logCacheOutcome = (event: 'hit' | 'miss', itemCount: number) => {\n if (!cacheTimerStart) return\n const elapsedMs = Number(process.hrtime.bigint() - cacheTimerStart) / 1_000_000\n debugCrudCache(event, {\n resource: resourceKind,\n key: cacheKey,\n durationMs: Math.round(elapsedMs * 1000) / 1000,\n itemCount,\n })\n }\n\n const respondWithPayload = (payload: any, extraHeaders?: Record<string, string>) => {\n const headers: Record<string, string> = extraHeaders ? { ...extraHeaders } : {}\n const warning = payload && typeof payload === 'object' && payload.meta?.partialIndexWarning\n if (warning) {\n headers['x-om-partial-index'] = JSON.stringify({\n type: 'partial_index',\n entity: warning.entity,\n entityLabel: warning.entityLabel ?? warning.entity,\n baseCount: warning.baseCount ?? null,\n indexedCount: warning.indexedCount ?? null,\n scope: warning.scope ?? 'scoped',\n })\n }\n if (cacheEnabled) {\n headers['x-om-cache'] = cacheStatus\n }\n return json(payload, Object.keys(headers).length ? { headers } : undefined)\n }\n\n if (cachedValue) {\n cacheStatus = 'hit'\n profiler.mark('cache_hit', { generatedAt: cachedValue.generatedAt ?? null })\n const payload = safeClone(cachedValue.payload)\n if (!payload || typeof payload !== 'object' || Array.isArray(payload) || !Array.isArray((payload as any).items)) {\n cacheStatus = 'miss'\n profiler.mark('cache_payload_invalid', {\n payloadType: Array.isArray(payload) ? 'array' : typeof payload,\n })\n try {\n if (cache && cacheKey && typeof cache.delete === 'function') {\n await cache.delete(cacheKey)\n }\n } catch {\n // ignore cache eviction failure\n }\n cachedValue = null\n }\n }\n\n if (cachedValue) {\n const payload = safeClone(cachedValue.payload)\n const items = Array.isArray((payload as any)?.items) ? (payload as any).items : []\n profiler.mark('cache_payload_ready', { itemCount: items.length })\n await logCrudAccess({\n container: ctx.container,\n auth: ctx.auth,\n request,\n items,\n idField: ormCfg.idField!,\n resourceKind,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n tenantId: ctx.auth.tenantId ?? null,\n query: validated,\n })\n await opts.hooks?.afterList?.(payload, { ...ctx, query: validated as any })\n const cacheAfterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (!cacheAfterInterceptors) {\n finishProfile({ result: 'interceptor_after_empty', cacheStatus })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!cacheAfterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus })\n return json(cacheAfterInterceptors.body, { status: cacheAfterInterceptors.statusCode, headers: cacheAfterInterceptors.headers })\n }\n Object.assign(payload, cacheAfterInterceptors.body)\n await enrichListPayload(payload, ctx, profiler)\n logCacheOutcome('hit', items.length)\n const response = respondWithPayload(payload)\n finishProfile({ result: 'cache_hit', cacheStatus })\n return response\n }\n\n // Prefer query engine when configured\n if (opts.list.entityId && opts.list.fields) {\n profiler.mark('query_engine_prepare')\n const qe = (ctx.container.resolve('queryEngine') as QueryEngine)\n profiler.mark('query_engine_resolved')\n const sortFieldRaw = (queryParams as any).sortField || 'id'\n const sortDirRaw = ((queryParams as any).sortDir || 'asc').toLowerCase() === 'desc' ? SortDir.Desc : SortDir.Asc\n const sortField = (opts.list.sortFieldMap && opts.list.sortFieldMap[sortFieldRaw]) || sortFieldRaw\n const sort: Sort[] = [{ field: sortField as any, dir: sortDirRaw } as any]\n const page: Page = exportRequested\n ? { page: 1, pageSize: exportPageSize }\n : { page: requestedPage, pageSize: requestedPageSize }\n const filters = exportFullRequested\n ? ({} as Where<any>)\n : (opts.list.buildFilters ? await opts.list.buildFilters(validated as any, ctx) : ({} as Where<any>))\n const mergedFilters = exportFullRequested ? filters : mergeIdFilter(filters, parsedIds)\n const withDeleted = parseBooleanToken((queryParams as any).withDeleted) === true\n profiler.mark('filters_ready', { withDeleted })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n profiler.mark('scope_blocked')\n logForbidden({\n resourceKind,\n action: 'list',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n const emptyPayload = { items: [], total: 0, page: page.page, pageSize: page.pageSize, totalPages: 0 }\n await opts.hooks?.afterList?.(emptyPayload, { ...ctx, query: validated as any })\n const emptyAfterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: emptyPayload as Record<string, unknown>,\n })\n if (!emptyAfterInterceptors) {\n finishProfile({ result: 'interceptor_after_empty', cacheStatus, itemCount: 0, total: 0 })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!emptyAfterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus, itemCount: 0, total: 0 })\n return json(emptyAfterInterceptors.body, { status: emptyAfterInterceptors.statusCode, headers: emptyAfterInterceptors.headers })\n }\n Object.assign(emptyPayload, emptyAfterInterceptors.body)\n await maybeStoreCrudCache(emptyPayload)\n logCacheOutcome(cacheStatus, emptyPayload.items.length)\n const response = respondWithPayload(emptyPayload)\n finishProfile({ result: 'empty_scope', cacheStatus, itemCount: 0, total: 0 })\n return response\n }\n const queryOpts: any = {\n fields: opts.list.fields!,\n includeCustomFields: true,\n sort,\n page,\n filters: mergedFilters,\n withDeleted,\n }\n if (opts.list.customFieldSources) {\n queryOpts.customFieldSources = opts.list.customFieldSources\n }\n if (opts.list.joins) {\n queryOpts.joins = opts.list.joins\n }\n if (ormCfg.tenantField) queryOpts.tenantId = ctx.auth.tenantId!\n if (ormCfg.orgField) {\n queryOpts.organizationId = ctx.selectedOrganizationId ?? undefined\n queryOpts.organizationIds = ctx.organizationIds ?? undefined\n }\n const queryEntity = String(opts.list.entityId)\n profiler.mark('query_options_ready')\n const queryProfiler = profiler.child('query_engine', { entity: queryEntity })\n const res = await qe.query(opts.list.entityId as any, { ...queryOpts, profiler: queryProfiler })\n const rawItems = res.items || []\n let transformedItems = rawItems.map(i => (opts.list!.transformItem ? opts.list!.transformItem(i) : i))\n profiler.mark('transform_complete', { itemCount: transformedItems.length })\n transformedItems = await decorateItemsWithCustomFields(transformedItems, ctx)\n profiler.mark('custom_fields_complete', { itemCount: transformedItems.length })\n\n if (opts.list?.entityId && request) {\n try {\n const { overlay, resolveLocale } = getTranslationOverlayPlugin()\n if (overlay && resolveLocale) {\n const locale = resolveLocale(request)\n if (locale) {\n transformedItems = await overlay(transformedItems, {\n entityType: String(opts.list.entityId),\n locale,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? null,\n container: ctx.container,\n })\n }\n }\n } catch (err) {\n console.warn('[CRUD] Translation overlay failed:', err)\n }\n profiler.mark('translation_overlays_complete', { itemCount: transformedItems.length })\n }\n\n await logCrudAccess({\n container: ctx.container,\n auth: ctx.auth,\n request,\n items: transformedItems,\n idField: ormCfg.idField!,\n resourceKind,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n tenantId: ctx.auth.tenantId ?? null,\n query: validated,\n })\n profiler.mark('access_logged')\n\n if (exportRequested && requestedExport) {\n const total = typeof res.total === 'number' ? res.total : rawItems.length\n const initialExportItems = exportFullRequested\n ? rawItems.map(normalizeFullRecordForExport)\n : transformedItems\n let exportItems = [...initialExportItems]\n if (total > exportItems.length) {\n const exportPageSizeNumber = typeof page.pageSize === 'number' ? page.pageSize : exportPageSize\n const queryBase: any = { ...queryOpts }\n delete queryBase.page\n let nextPage = 2\n while (exportItems.length < total) {\n profiler.mark('export_next_page_request', { page: nextPage })\n const nextRes = await qe.query(opts.list.entityId as any, {\n ...queryBase,\n page: { page: nextPage, pageSize: exportPageSizeNumber },\n profiler: profiler.child('query_engine', { entity: queryEntity, page: nextPage, mode: 'export' }),\n })\n const nextItemsRaw = nextRes.items || []\n if (!nextItemsRaw.length) break\n let nextTransformed = nextItemsRaw.map(i => (opts.list!.transformItem ? opts.list!.transformItem(i) : i))\n nextTransformed = await decorateItemsWithCustomFields(nextTransformed, ctx)\n const nextExportItems = exportFullRequested\n ? nextItemsRaw.map(normalizeFullRecordForExport)\n : nextTransformed\n exportItems.push(...nextExportItems)\n if (nextExportItems.length < exportPageSizeNumber) break\n nextPage += 1\n }\n }\n const prepared = exportFullRequested\n ? { columns: ensureColumns(exportItems), rows: exportItems }\n : prepareExportData(exportItems, opts.list)\n const fallbackBase = `${opts.events?.entity || resourceKind || 'list'}${exportFullRequested ? '_full' : ''}`\n const filename = finalizeExportFilename(opts.list, requestedExport, fallbackBase)\n const serialized = serializeExport(prepared, requestedExport)\n const exportPayload = { items: exportItems, total, page: 1, pageSize: exportItems.length, totalPages: 1, ...(res.meta ? { meta: res.meta } : {}) }\n await opts.hooks?.afterList?.(exportPayload, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const response = new Response(serialized.body, {\n headers: {\n 'content-type': serialized.contentType,\n 'content-disposition': `attachment; filename=\"${filename}\"`,\n },\n })\n if (res.meta?.partialIndexWarning) {\n response.headers.set(\n 'x-om-partial-index',\n JSON.stringify({\n type: 'partial_index',\n entity: res.meta.partialIndexWarning.entity,\n entityLabel: res.meta.partialIndexWarning.entityLabel ?? res.meta.partialIndexWarning.entity,\n baseCount: res.meta.partialIndexWarning.baseCount ?? null,\n indexedCount: res.meta.partialIndexWarning.indexedCount ?? null,\n scope: res.meta.partialIndexWarning.scope ?? 'scoped',\n }),\n )\n }\n finishProfile({\n result: 'export',\n cacheStatus,\n itemCount: exportItems.length,\n total,\n })\n return response\n }\n\n const payload = {\n items: transformedItems,\n total: res.total,\n page: page.page || requestedPage,\n pageSize: page.pageSize || requestedPageSize,\n totalPages: Math.ceil(res.total / (Number(page.pageSize) || 1)),\n ...(res.meta ? { meta: res.meta } : {}),\n }\n await opts.hooks?.afterList?.(payload, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (!afterInterceptors) {\n finishProfile({ result: 'interceptor_after_empty', cacheStatus })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!afterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus })\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n Object.assign(payload, afterInterceptors.body)\n await enrichListPayload(payload, ctx, profiler)\n await maybeStoreCrudCache(payload)\n profiler.mark('cache_store_attempt', { cacheEnabled })\n logCacheOutcome(cacheStatus, payload.items.length)\n const response = respondWithPayload(payload)\n finishProfile({\n result: 'ok',\n cacheStatus,\n itemCount: payload.items.length,\n total: payload.total ?? payload.items.length,\n })\n return response\n }\n\n // Fallback: plain ORM list\n profiler.mark('orm_fallback_prepare')\n const em = (ctx.container.resolve('em') as any)\n const repo = em.getRepository(ormCfg.entity)\n profiler.mark('orm_repo_ready')\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n profiler.mark('fallback_scope_blocked')\n logForbidden({\n resourceKind,\n action: 'list',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n const emptyPayload = { items: [], total: 0 }\n await opts.hooks?.afterList?.(emptyPayload, { ...ctx, query: validated as any })\n const fallbackEmptyAfterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: emptyPayload as Record<string, unknown>,\n })\n if (!fallbackEmptyAfterInterceptors) {\n finishProfile({\n result: 'interceptor_after_empty',\n cacheStatus,\n itemCount: 0,\n total: 0,\n branch: 'fallback',\n })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!fallbackEmptyAfterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus, itemCount: 0, total: 0, branch: 'fallback' })\n return json(fallbackEmptyAfterInterceptors.body, { status: fallbackEmptyAfterInterceptors.statusCode, headers: fallbackEmptyAfterInterceptors.headers })\n }\n Object.assign(emptyPayload, fallbackEmptyAfterInterceptors.body)\n await maybeStoreCrudCache(emptyPayload)\n logCacheOutcome(cacheStatus, emptyPayload.items.length)\n const response = respondWithPayload(emptyPayload)\n finishProfile({\n result: 'empty_scope',\n cacheStatus,\n itemCount: 0,\n total: 0,\n branch: 'fallback',\n })\n return response\n }\n const fallbackFilters = exportFullRequested\n ? ({} as Where<any>)\n : (opts.list.buildFilters ? await opts.list.buildFilters(validated as any, ctx) : ({} as Where<any>))\n const mergedFallbackFilters = exportFullRequested\n ? fallbackFilters\n : mergeIdFilter(fallbackFilters, parsedIds)\n const where: any = buildScopedWhere(\n mergedFallbackFilters as Record<string, any>,\n {\n organizationId: ormCfg.orgField ? (ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null) : undefined,\n organizationIds: ormCfg.orgField ? ctx.organizationIds ?? undefined : undefined,\n tenantId: ormCfg.tenantField ? ctx.auth.tenantId : undefined,\n orgField: ormCfg.orgField,\n tenantField: ormCfg.tenantField,\n softDeleteField: ormCfg.softDeleteField,\n }\n )\n let list = await repo.find(where)\n profiler.mark('orm_query_complete', { itemCount: Array.isArray(list) ? list.length : 0 })\n list = await decorateItemsWithCustomFields(list, ctx)\n profiler.mark('fallback_custom_fields_complete', { itemCount: Array.isArray(list) ? list.length : 0 })\n\n if (opts.list?.entityId && request) {\n try {\n const { overlay, resolveLocale } = getTranslationOverlayPlugin()\n if (overlay && resolveLocale) {\n const locale = resolveLocale(request)\n if (locale) {\n list = await overlay(list, {\n entityType: String(opts.list.entityId),\n locale,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? null,\n container: ctx.container,\n })\n }\n }\n } catch (err) {\n console.warn('[CRUD] Translation overlay (fallback) failed:', err)\n }\n profiler.mark('fallback_translation_overlays_complete', { itemCount: Array.isArray(list) ? list.length : 0 })\n }\n\n await logCrudAccess({\n container: ctx.container,\n auth: ctx.auth,\n request,\n items: list,\n idField: ormCfg.idField!,\n resourceKind,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n tenantId: ctx.auth.tenantId ?? null,\n query: validated,\n })\n profiler.mark('access_logged')\n if (exportRequested && requestedExport) {\n const exportItems = exportFullRequested ? list.map(normalizeFullRecordForExport) : list\n const prepared = exportFullRequested\n ? { columns: ensureColumns(exportItems), rows: exportItems }\n : prepareExportData(exportItems, opts.list)\n const fallbackBase = `${opts.events?.entity || resourceKind || 'list'}${exportFullRequested ? '_full' : ''}`\n const filename = finalizeExportFilename(opts.list, requestedExport, fallbackBase)\n const serialized = serializeExport(prepared, requestedExport)\n await opts.hooks?.afterList?.({ items: exportItems, total: exportItems.length, page: 1, pageSize: exportItems.length, totalPages: 1 }, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const response = new Response(serialized.body, {\n headers: {\n 'content-type': serialized.contentType,\n 'content-disposition': `attachment; filename=\"${filename}\"`,\n },\n })\n finishProfile({\n result: 'export',\n cacheStatus,\n itemCount: exportItems.length,\n total: exportItems.length,\n branch: 'fallback',\n })\n return response\n }\n const payload = { items: list, total: list.length }\n await opts.hooks?.afterList?.(payload, { ...ctx, query: validated as any })\n profiler.mark('after_list_hook')\n const fallbackAfterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'GET',\n requestPayload: interceptorRequest,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (!fallbackAfterInterceptors) {\n finishProfile({\n result: 'interceptor_after_empty',\n cacheStatus,\n branch: 'fallback',\n })\n return json({ error: 'Internal interceptor error' }, { status: 500 })\n }\n if (!fallbackAfterInterceptors.ok) {\n finishProfile({ result: 'interceptor_after_failed', cacheStatus, branch: 'fallback' })\n return json(fallbackAfterInterceptors.body, { status: fallbackAfterInterceptors.statusCode, headers: fallbackAfterInterceptors.headers })\n }\n Object.assign(payload, fallbackAfterInterceptors.body)\n await enrichListPayload(payload, ctx, profiler)\n await maybeStoreCrudCache(payload)\n profiler.mark('cache_store_attempt', { cacheEnabled })\n logCacheOutcome(cacheStatus, payload.items.length)\n const response = respondWithPayload(payload)\n finishProfile({\n result: 'ok',\n cacheStatus,\n itemCount: payload.items.length,\n total: payload.total,\n branch: 'fallback',\n })\n return response\n } catch (e) {\n finishProfile({ result: 'error' })\n return handleError(e)\n }\n }\n\n async function POST(request: Request) {\n try {\n const useCommand = !!opts.actions?.create\n if (!opts.create && !useCommand) return json({ error: 'Not implemented' }, { status: 501 })\n const ctx = await withCtx(request)\n if (!ctx.auth) return json({ error: 'Unauthorized' }, { status: 401 })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n logForbidden({\n resourceKind,\n action: 'create',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n return json({ error: 'Forbidden' }, { status: 403 })\n }\n const body = await request.json().catch(() => ({}))\n let interceptorRequestPayload: InterceptorRequest | null = null\n let interceptorMetadata: Record<string, Record<string, unknown> | undefined> = {}\n\n if (useCommand) {\n const commandBus = (ctx.container.resolve('commandBus') as CommandBus)\n const action = opts.actions!.create!\n const parsed = action.schema ? action.schema.parse(body) : body\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'POST',\n body: parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n const interceptedBody = interceptorRequestPayload.body ?? {}\n const reparsed = action.schema ? action.schema.parse(interceptedBody) : interceptedBody\n let input = action.mapInput ? await action.mapInput({ parsed: reparsed, raw: interceptedBody, ctx }) : reparsed\n const userMetadata = action.metadata ? await action.metadata({ input, parsed: reparsed, raw: interceptedBody, ctx }) : null\n\n // Sync before-event (*.creating) \u2014 command path\n const createLifecycleCmd = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'created')\n if (createLifecycleCmd.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), createLifecycleCmd.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: createLifecycleCmd.beforeEventId, entity: createLifecycleCmd.entity!, operation: 'create', timing: 'before', resourceId: null, userId: ctx.auth.sub, organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n if (syncResult.modifiedPayload && typeof input === 'object' && input) {\n input = { ...input as Record<string, unknown>, ...syncResult.modifiedPayload }\n }\n }\n }\n\n const baseMetadata: CommandLogMetadata = {\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n resourceKind,\n context: { cacheAliases: resourceTargets },\n }\n const metadataToSend = mergeCommandMetadata(baseMetadata, userMetadata)\n const { result, logEntry } = await commandBus.execute(action.commandId, { input, ctx, metadata: metadataToSend })\n\n // Sync after-event (*.created) \u2014 command path\n if (createLifecycleCmd.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), createLifecycleCmd.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: createLifecycleCmd.afterEventId, entity: createLifecycleCmd.entity!, operation: 'create', timing: 'after', resourceId: (result as Record<string, unknown>)?.id as string ?? null, userId: ctx.auth.sub, organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n const payload = action.response ? action.response({ result, logEntry, ctx }) : result\n let resolvedPayload = await Promise.resolve(payload)\n if (interceptorRequestPayload && resolvedPayload && typeof resolvedPayload === 'object' && !Array.isArray(resolvedPayload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'POST',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: action.status ?? 201,\n body: resolvedPayload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) resolvedPayload = afterInterceptors.body\n }\n const status = action.status ?? 201\n const response = json(resolvedPayload, { status })\n attachOperationHeader(response, logEntry)\n // Note: side effects (events + indexing) are already flushed by CommandBus.execute()\n // via flushCrudSideEffects(). Calling markCommandResultForIndexing here would cause\n // duplicate event emissions.\n return response\n }\n\n const createConfig = opts.create\n if (!createConfig) throw new Error('Create configuration missing')\n\n let input = createConfig.schema.parse(body)\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'POST',\n body: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n if (interceptorRequestPayload.body) {\n input = createConfig.schema.parse(interceptorRequestPayload.body)\n }\n\n // Sync before-event (*.creating)\n const createLifecycle = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'created')\n const scopeOrganizationId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (createLifecycle.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), createLifecycle.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: createLifecycle.beforeEventId, entity: createLifecycle.entity!, operation: 'create', timing: 'before', resourceId: null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n if (syncResult.modifiedPayload && typeof input === 'object' && input) {\n input = createConfig.schema.parse({ ...input as Record<string, unknown>, ...syncResult.modifiedPayload })\n }\n }\n }\n\n const modified = await opts.hooks?.beforeCreate?.(input as any, ctx)\n if (modified) input = modified\n\n // Mutation guard registry (guards now run on create)\n const userFeatures = await resolveUserFeatures(ctx)\n const { allGuards } = collectAndRunGuards(ctx.container)\n let createGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (allGuards.length && ctx.auth.tenantId) {\n const guardResult = await runMutationGuards(allGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: null,\n operation: 'create',\n requestMethod: request.method,\n requestHeaders: request.headers,\n mutationPayload: input && typeof input === 'object' ? (input as Record<string, unknown>) : null,\n }, { userFeatures: userFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n if (guardResult.modifiedPayload && typeof input === 'object' && input) {\n input = createConfig.schema.parse({ ...input as Record<string, unknown>, ...guardResult.modifiedPayload })\n }\n createGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n const entityData = createConfig.mapToEntity(input as any, ctx)\n // Inject org/tenant\n const targetOrgId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (ormCfg.orgField) {\n if (!targetOrgId) return json({ error: 'Organization context is required' }, { status: 400 })\n entityData[ormCfg.orgField] = targetOrgId\n }\n if (ormCfg.tenantField) {\n if (!ctx.auth.tenantId) return json({ error: 'Tenant context is required' }, { status: 400 })\n entityData[ormCfg.tenantField] = ctx.auth.tenantId\n }\n const entity = await de.createOrmEntity({ entity: ormCfg.entity, data: entityData })\n\n // Custom fields\n if (createConfig.customFields && (createConfig.customFields as any).enabled) {\n const cfc = createConfig.customFields as Exclude<CustomFieldsConfig, false>\n const values = cfc.map\n ? cfc.map(body)\n : (cfc.pickPrefixed ? extractCustomFieldValuesFromPayload(body as Record<string, unknown>) : {})\n if (values && Object.keys(values).length > 0) {\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await de.setCustomFields({\n entityId: cfc.entityId as any,\n recordId: String((entity as any)[ormCfg.idField!]),\n organizationId: targetOrgId,\n tenantId: ctx.auth.tenantId!,\n values,\n })\n }\n }\n\n await opts.hooks?.afterCreate?.(entity, { ...ctx, input: input as any })\n\n // Guard afterSuccess callbacks\n const createdEntityId = String((entity as any)[ormCfg.idField!])\n if (createGuardAfterCallbacks?.length && ctx.auth.tenantId) {\n await runGuardAfterSuccessCallbacks(createGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId, organizationId: scopeOrganizationId, userId: ctx.auth.sub,\n resourceKind, resourceId: createdEntityId, operation: 'create',\n requestMethod: request.method, requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.created)\n if (createLifecycle.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), createLifecycle.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: createLifecycle.afterEventId, entity: createLifecycle.entity!, operation: 'create', timing: 'after', resourceId: createdEntityId, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, entityData: snapshotEntity(entity) },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n const identifiers = identifierResolver(entity, 'created')\n de.markOrmEntityChange({\n action: 'created',\n entity,\n identifiers,\n events: opts.events as CrudEventsConfig | undefined,\n indexer: opts.indexer as CrudIndexerConfig | undefined,\n })\n await de.flushOrmEntityChanges()\n await invalidateCrudCache(ctx.container, resourceKind, identifiers, ctx.auth.tenantId ?? null, 'created', resourceTargets)\n\n let payload = createConfig.response ? createConfig.response(entity) : { id: createdEntityId }\n if (interceptorRequestPayload && payload && typeof payload === 'object' && !Array.isArray(payload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'POST',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 201,\n body: payload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) payload = afterInterceptors.body\n }\n payload = await enrichSingleRecord(payload, ctx)\n return json(payload, { status: 201 })\n } catch (e) {\n return handleError(e)\n }\n }\n\n async function PUT(request: Request) {\n try {\n const useCommand = !!opts.actions?.update\n if (!opts.update && !useCommand) return json({ error: 'Not implemented' }, { status: 501 })\n const ctx = await withCtx(request)\n if (!ctx.auth) return json({ error: 'Unauthorized' }, { status: 401 })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n logForbidden({\n resourceKind,\n action: 'update',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n return json({ error: 'Forbidden' }, { status: 403 })\n }\n const body = await request.json().catch(() => ({}))\n const scopeOrganizationId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n let interceptorRequestPayload: InterceptorRequest | null = null\n let interceptorMetadata: Record<string, Record<string, unknown> | undefined> = {}\n\n if (useCommand) {\n const commandBus = (ctx.container.resolve('commandBus') as CommandBus)\n const action = opts.actions!.update!\n const parsed = action.schema ? action.schema.parse(body) : body\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'PUT',\n body: parsed && typeof parsed === 'object' ? (parsed as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n const interceptedBody = interceptorRequestPayload.body ?? {}\n const reparsed = action.schema ? action.schema.parse(interceptedBody) : interceptedBody\n let input = action.mapInput ? await action.mapInput({ parsed: reparsed, raw: interceptedBody, ctx }) : reparsed\n const userMetadata = action.metadata ? await action.metadata({ input, parsed: reparsed, raw: interceptedBody, ctx }) : null\n const candidateId = normalizeIdentifierValue((input as Record<string, unknown> | null | undefined)?.id)\n\n // Sync before-event (*.updating) \u2014 command path\n const updateLifecycleCmd = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'updated')\n let cmdUpdatePreviousData: Record<string, unknown> | undefined\n if (updateLifecycleCmd.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), updateLifecycleCmd.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n if (candidateId) {\n const prevEntity = await em.findOne(ormCfg.entity as any, { [ormCfg.idField!]: candidateId } as any)\n if (prevEntity) cmdUpdatePreviousData = snapshotEntity(prevEntity)\n }\n const syncPayload = buildSyncPayload(\n { eventId: updateLifecycleCmd.beforeEventId, entity: updateLifecycleCmd.entity!, operation: 'update', timing: 'before', resourceId: candidateId ?? null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, previousData: cmdUpdatePreviousData },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n if (syncResult.modifiedPayload && typeof input === 'object' && input) {\n input = { ...input as Record<string, unknown>, ...syncResult.modifiedPayload }\n }\n }\n }\n\n const updateUserFeatures = await resolveUserFeatures(ctx)\n const { allGuards: updateAllGuards } = collectAndRunGuards(ctx.container)\n let cmdUpdateGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (updateAllGuards.length && ctx.auth.tenantId && candidateId) {\n const guardResult = await runMutationGuards(updateAllGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: candidateId,\n operation: 'update',\n requestMethod: request.method,\n requestHeaders: request.headers,\n mutationPayload: input && typeof input === 'object'\n ? (input as Record<string, unknown>)\n : null,\n }, { userFeatures: updateUserFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n if (guardResult.modifiedPayload && typeof input === 'object' && input) {\n input = { ...input as Record<string, unknown>, ...guardResult.modifiedPayload }\n }\n cmdUpdateGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n const baseMetadata: CommandLogMetadata = {\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n resourceKind,\n context: { cacheAliases: resourceTargets },\n }\n if (candidateId) baseMetadata.resourceId = candidateId\n const metadataToSend = mergeCommandMetadata(baseMetadata, userMetadata)\n const { result, logEntry } = await commandBus.execute(action.commandId, { input, ctx, metadata: metadataToSend })\n const payload = action.response ? action.response({ result, logEntry, ctx }) : result\n let resolvedPayload = await Promise.resolve(payload)\n if (interceptorRequestPayload && resolvedPayload && typeof resolvedPayload === 'object' && !Array.isArray(resolvedPayload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'PUT',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: action.status ?? 200,\n body: resolvedPayload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) resolvedPayload = afterInterceptors.body\n }\n const status = action.status ?? 200\n const response = json(resolvedPayload, { status })\n attachOperationHeader(response, logEntry)\n if (cmdUpdateGuardAfterCallbacks.length && ctx.auth.tenantId && candidateId) {\n await runGuardAfterSuccessCallbacks(cmdUpdateGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: candidateId,\n operation: 'update',\n requestMethod: request.method,\n requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.updated) \u2014 command path\n if (updateLifecycleCmd.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), updateLifecycleCmd.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: updateLifecycleCmd.afterEventId, entity: updateLifecycleCmd.entity!, operation: 'update', timing: 'after', resourceId: candidateId ?? null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, previousData: cmdUpdatePreviousData },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n // Note: side effects (events + indexing) are already flushed by CommandBus.execute()\n // via flushCrudSideEffects(). Calling markCommandResultForIndexing here would cause\n // duplicate event emissions.\n return response\n }\n\n const updateConfig = opts.update\n if (!updateConfig) throw new Error('Update configuration missing')\n\n let input = updateConfig.schema.parse(body)\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'PUT',\n body: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n if (interceptorRequestPayload.body) {\n input = updateConfig.schema.parse(interceptorRequestPayload.body)\n }\n\n // Sync before-event (*.updating)\n const updateLifecycle = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'updated')\n let updatePreviousData: Record<string, unknown> | undefined\n if (updateLifecycle.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), updateLifecycle.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const updateCandidateId = (input as Record<string, unknown>)?.id as string ?? null\n if (updateCandidateId) {\n const prevEntity = await em.findOne(ormCfg.entity as any, { [ormCfg.idField!]: updateCandidateId } as any)\n if (prevEntity) updatePreviousData = snapshotEntity(prevEntity)\n }\n const syncPayload = buildSyncPayload(\n { eventId: updateLifecycle.beforeEventId, entity: updateLifecycle.entity!, operation: 'update', timing: 'before', resourceId: updateCandidateId, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, previousData: updatePreviousData },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n if (syncResult.modifiedPayload && typeof input === 'object' && input) {\n input = updateConfig.schema.parse({ ...input as Record<string, unknown>, ...syncResult.modifiedPayload })\n }\n }\n }\n\n const modified = await opts.hooks?.beforeUpdate?.(input as any, ctx)\n if (modified) input = modified\n\n const id = updateConfig.getId ? updateConfig.getId(input as any) : (input as any).id\n if (!isUuid(id)) return json({ error: 'Invalid id' }, { status: 400 })\n\n // Mutation guard registry (multi-guard)\n const updateUserFeatures = await resolveUserFeatures(ctx)\n const { allGuards: updateAllGuards } = collectAndRunGuards(ctx.container)\n let updateGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (updateAllGuards.length && ctx.auth.tenantId) {\n const guardResult = await runMutationGuards(updateAllGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: id,\n operation: 'update',\n requestMethod: request.method,\n requestHeaders: request.headers,\n mutationPayload: input && typeof input === 'object' ? (input as Record<string, unknown>) : null,\n }, { userFeatures: updateUserFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n if (guardResult.modifiedPayload && typeof input === 'object' && input) {\n input = updateConfig.schema.parse({ ...input as Record<string, unknown>, ...guardResult.modifiedPayload })\n }\n updateGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n\n const targetOrgId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (ormCfg.orgField && !targetOrgId) return json({ error: 'Organization context is required' }, { status: 400 })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n const where: any = buildScopedWhere(\n { [ormCfg.idField!]: id },\n {\n organizationId: ormCfg.orgField ? targetOrgId : undefined,\n organizationIds: ormCfg.orgField ? ctx.organizationIds ?? undefined : undefined,\n tenantId: ormCfg.tenantField ? ctx.auth.tenantId : undefined,\n orgField: ormCfg.orgField,\n tenantField: ormCfg.tenantField,\n softDeleteField: ormCfg.softDeleteField,\n }\n )\n const entity = await de.updateOrmEntity({\n entity: ormCfg.entity,\n where,\n apply: (e: any) => updateConfig.applyToEntity(e, input as any, ctx),\n })\n if (!entity) return json({ error: 'Not found' }, { status: 404 })\n\n // Custom fields\n if (updateConfig.customFields && (updateConfig.customFields as any).enabled) {\n const cfc = updateConfig.customFields as Exclude<CustomFieldsConfig, false>\n const values = cfc.map\n ? cfc.map(body)\n : (cfc.pickPrefixed ? extractCustomFieldValuesFromPayload(body as Record<string, unknown>) : {})\n if (values && Object.keys(values).length > 0) {\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n await de.setCustomFields({\n entityId: cfc.entityId as any,\n recordId: String((entity as any)[ormCfg.idField!]),\n organizationId: targetOrgId,\n tenantId: ctx.auth.tenantId!,\n values,\n })\n }\n }\n\n await opts.hooks?.afterUpdate?.(entity, { ...ctx, input: input as any })\n\n // Guard afterSuccess callbacks (multi)\n if (updateGuardAfterCallbacks.length && ctx.auth.tenantId) {\n await runGuardAfterSuccessCallbacks(updateGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId, organizationId: scopeOrganizationId, userId: ctx.auth.sub,\n resourceKind, resourceId: id, operation: 'update',\n requestMethod: request.method, requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.updated)\n if (updateLifecycle.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), updateLifecycle.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: updateLifecycle.afterEventId, entity: updateLifecycle.entity!, operation: 'update', timing: 'after', resourceId: id, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { payload: input && typeof input === 'object' ? (input as Record<string, unknown>) : undefined, previousData: updatePreviousData, entityData: snapshotEntity(entity) },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n const identifiers = identifierResolver(entity, 'updated')\n de.markOrmEntityChange({\n action: 'updated',\n entity,\n identifiers,\n events: opts.events as CrudEventsConfig | undefined,\n indexer: opts.indexer as CrudIndexerConfig | undefined,\n })\n await de.flushOrmEntityChanges()\n await invalidateCrudCache(ctx.container, resourceKind, identifiers, ctx.auth.tenantId ?? null, 'updated', resourceTargets)\n const payload = updateConfig.response ? updateConfig.response(entity) : { success: true }\n if (interceptorRequestPayload && payload && typeof payload === 'object' && !Array.isArray(payload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'PUT',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) {\n return json(afterInterceptors.body, { status: 200, headers: afterInterceptors.headers })\n }\n }\n return json(payload)\n } catch (e) {\n return handleError(e)\n }\n }\n\n async function DELETE(request: Request) {\n try {\n const ctx = await withCtx(request)\n if (!ctx.auth) return json({ error: 'Unauthorized' }, { status: 401 })\n if (ormCfg.orgField && ctx.organizationIds && ctx.organizationIds.length === 0) {\n logForbidden({\n resourceKind,\n action: 'delete',\n reason: 'organization_scope_empty',\n userId: ctx.auth?.sub ?? null,\n tenantId: ctx.auth?.tenantId ?? null,\n organizationIds: ctx.organizationIds,\n })\n return json({ error: 'Forbidden' }, { status: 403 })\n }\n const useCommand = !!opts.actions?.delete\n const url = new URL(request.url)\n const scopeOrganizationId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n let interceptorRequestPayload: InterceptorRequest | null = null\n let interceptorMetadata: Record<string, Record<string, unknown> | undefined> = {}\n\n if (useCommand) {\n const action = opts.actions!.delete!\n const body = await request.json().catch(() => ({}))\n const raw = { body, query: Object.fromEntries(url.searchParams.entries()) }\n const parsed = action.schema ? action.schema.parse(raw) : raw\n const interceptorInput =\n parsed && typeof parsed === 'object' && (parsed as Record<string, unknown>).body && typeof (parsed as Record<string, unknown>).body === 'object'\n ? ((parsed as Record<string, unknown>).body as Record<string, unknown>)\n : body\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'DELETE',\n body: interceptorInput,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n const interceptedBody = interceptorRequestPayload.body ?? {}\n const reparsedRaw = {\n body: interceptedBody,\n query: Object.fromEntries(url.searchParams.entries()),\n }\n const reparsed = action.schema ? action.schema.parse(reparsedRaw) : reparsedRaw\n const input = action.mapInput ? await action.mapInput({ parsed: reparsed, raw: reparsedRaw, ctx }) : reparsed\n const userMetadata = action.metadata ? await action.metadata({ input, parsed: reparsed, raw: reparsedRaw, ctx }) : null\n const commandBus = (ctx.container.resolve('commandBus') as CommandBus)\n const candidateId = normalizeIdentifierValue(\n (input as Record<string, unknown> | null | undefined)?.id\n ?? (raw.query as Record<string, unknown> | null | undefined)?.id\n ?? (raw.body as Record<string, unknown> | null | undefined)?.id\n )\n\n // Sync before-event (*.deleting) \u2014 command path\n const deleteLifecycleCmd = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'deleted')\n if (deleteLifecycleCmd.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), deleteLifecycleCmd.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: deleteLifecycleCmd.beforeEventId, entity: deleteLifecycleCmd.entity!, operation: 'delete', timing: 'before', resourceId: candidateId ?? null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n }\n }\n\n const deleteUserFeatures = await resolveUserFeatures(ctx)\n const { allGuards: deleteAllGuards } = collectAndRunGuards(ctx.container)\n let cmdDeleteGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (deleteAllGuards.length && ctx.auth.tenantId && candidateId) {\n const guardResult = await runMutationGuards(deleteAllGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: candidateId,\n operation: 'delete',\n requestMethod: request.method,\n requestHeaders: request.headers,\n }, { userFeatures: deleteUserFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n cmdDeleteGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n const baseMetadata: CommandLogMetadata = {\n tenantId: ctx.auth?.tenantId ?? null,\n organizationId: ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null,\n resourceKind,\n context: { cacheAliases: resourceTargets },\n }\n if (candidateId) baseMetadata.resourceId = candidateId\n const metadataToSend = mergeCommandMetadata(baseMetadata, userMetadata)\n const { result, logEntry } = await commandBus.execute(action.commandId, { input, ctx, metadata: metadataToSend })\n const payload = action.response ? action.response({ result, logEntry, ctx }) : result\n let resolvedPayload = await Promise.resolve(payload)\n if (interceptorRequestPayload && resolvedPayload && typeof resolvedPayload === 'object' && !Array.isArray(resolvedPayload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'DELETE',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: action.status ?? 200,\n body: resolvedPayload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) resolvedPayload = afterInterceptors.body\n }\n const status = action.status ?? 200\n const response = json(resolvedPayload, { status })\n attachOperationHeader(response, logEntry)\n if (cmdDeleteGuardAfterCallbacks.length && ctx.auth.tenantId && candidateId) {\n await runGuardAfterSuccessCallbacks(cmdDeleteGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: candidateId,\n operation: 'delete',\n requestMethod: request.method,\n requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.deleted) \u2014 command path\n if (deleteLifecycleCmd.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), deleteLifecycleCmd.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: deleteLifecycleCmd.afterEventId, entity: deleteLifecycleCmd.entity!, operation: 'delete', timing: 'after', resourceId: candidateId ?? null, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n // Note: side effects (events + indexing) are already flushed by CommandBus.execute()\n // via flushCrudSideEffects(). Calling markCommandResultForIndexing here would cause\n // duplicate event emissions.\n return response\n }\n\n const idFrom = opts.del?.idFrom || 'query'\n const id = idFrom === 'query'\n ? url.searchParams.get('id')\n : (await request.json().catch(() => ({}))).id\n if (!isUuid(id)) return json({ error: 'ID is required' }, { status: 400 })\n const beforeInterceptors = await applyInterceptorsBefore({\n ctx,\n request,\n method: 'DELETE',\n body: idFrom === 'query' ? undefined : ({ id } as Record<string, unknown>),\n query: idFrom === 'query' ? ({ id } as Record<string, unknown>) : undefined,\n })\n if (beforeInterceptors.errorResponse) return beforeInterceptors.errorResponse\n interceptorRequestPayload = beforeInterceptors.requestPayload\n interceptorMetadata = beforeInterceptors.metadataByInterceptor\n\n // Sync before-event (*.deleting)\n const deleteLifecycle = deriveLifecycleEventIds(opts.events as CrudEventsConfig | undefined, 'deleted')\n if (deleteLifecycle.beforeEventId && ctx.auth.tenantId) {\n const syncSubs = collectSyncSubscribers(getAllSyncSubscribers(), deleteLifecycle.beforeEventId)\n if (syncSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: deleteLifecycle.beforeEventId, entity: deleteLifecycle.entity!, operation: 'delete', timing: 'before', resourceId: id, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n )\n const syncResult = await runSyncBeforeEvent(syncSubs, syncPayload, ctx.container)\n if (!syncResult.ok) {\n return json(syncResult.errorBody ?? { error: 'Operation blocked' }, { status: syncResult.errorStatus ?? 422 })\n }\n }\n }\n\n await opts.hooks?.beforeDelete?.(id!, ctx)\n\n // Mutation guard registry (multi-guard)\n const deleteUserFeatures = await resolveUserFeatures(ctx)\n const { allGuards: deleteAllGuards } = collectAndRunGuards(ctx.container)\n let deleteGuardAfterCallbacks: Array<{ guard: MutationGuard; metadata: Record<string, unknown> | null }> = []\n if (deleteAllGuards.length && ctx.auth.tenantId) {\n const guardResult = await runMutationGuards(deleteAllGuards, {\n tenantId: ctx.auth.tenantId,\n organizationId: scopeOrganizationId,\n userId: ctx.auth.sub,\n resourceKind,\n resourceId: id,\n operation: 'delete',\n requestMethod: request.method,\n requestHeaders: request.headers,\n }, { userFeatures: deleteUserFeatures ?? [] })\n if (!guardResult.ok) {\n return json(guardResult.errorBody ?? { error: 'Operation blocked by guard' }, { status: guardResult.errorStatus ?? 422 })\n }\n deleteGuardAfterCallbacks = guardResult.afterSuccessCallbacks\n }\n\n const targetOrgId = ctx.selectedOrganizationId ?? ctx.auth.orgId ?? null\n if (ormCfg.orgField && !targetOrgId) return json({ error: 'Organization context is required' }, { status: 400 })\n\n const de = (ctx.container.resolve('dataEngine') as DataEngine)\n const where: any = buildScopedWhere(\n { [ormCfg.idField!]: id },\n {\n organizationId: ormCfg.orgField ? targetOrgId : undefined,\n organizationIds: ormCfg.orgField ? ctx.organizationIds ?? undefined : undefined,\n tenantId: ormCfg.tenantField ? ctx.auth.tenantId : undefined,\n orgField: ormCfg.orgField,\n tenantField: ormCfg.tenantField,\n softDeleteField: ormCfg.softDeleteField,\n }\n )\n const entity = await de.deleteOrmEntity({\n entity: ormCfg.entity,\n where,\n soft: opts.del?.softDelete !== false,\n softDeleteField: ormCfg.softDeleteField ?? undefined,\n })\n if (!entity) return json({ error: 'Not found' }, { status: 404 })\n await opts.hooks?.afterDelete?.(id!, ctx)\n\n // Guard afterSuccess callbacks (multi)\n if (deleteGuardAfterCallbacks.length && ctx.auth.tenantId) {\n await runGuardAfterSuccessCallbacks(deleteGuardAfterCallbacks, {\n tenantId: ctx.auth.tenantId, organizationId: scopeOrganizationId, userId: ctx.auth.sub,\n resourceKind, resourceId: id, operation: 'delete',\n requestMethod: request.method, requestHeaders: request.headers,\n })\n }\n\n // Sync after-event (*.deleted)\n if (deleteLifecycle.afterEventId && ctx.auth.tenantId) {\n const syncAfterSubs = collectSyncSubscribers(getAllSyncSubscribers(), deleteLifecycle.afterEventId)\n if (syncAfterSubs.length) {\n const em = ctx.container.resolve('em') as EntityManager\n const syncPayload = buildSyncPayload(\n { eventId: deleteLifecycle.afterEventId, entity: deleteLifecycle.entity!, operation: 'delete', timing: 'after', resourceId: id, userId: ctx.auth.sub, organizationId: scopeOrganizationId, tenantId: ctx.auth.tenantId!, em, request },\n { entityData: snapshotEntity(entity) },\n )\n await runSyncAfterEvent(syncAfterSubs, syncPayload, ctx.container)\n }\n }\n\n if (entity) {\n const identifiers = identifierResolver(entity, 'deleted')\n de.markOrmEntityChange({\n action: 'deleted',\n entity,\n identifiers,\n events: opts.events as CrudEventsConfig | undefined,\n indexer: opts.indexer as CrudIndexerConfig | undefined,\n })\n await de.flushOrmEntityChanges()\n await invalidateCrudCache(ctx.container, resourceKind, identifiers, ctx.auth.tenantId ?? null, 'deleted', resourceTargets)\n }\n const payload = opts.del?.response ? opts.del.response(id) : { success: true }\n if (interceptorRequestPayload && payload && typeof payload === 'object' && !Array.isArray(payload)) {\n const afterInterceptors = await applyInterceptorsAfter({\n ctx,\n request,\n method: 'DELETE',\n requestPayload: interceptorRequestPayload,\n metadataByInterceptor: interceptorMetadata,\n statusCode: 200,\n body: payload as Record<string, unknown>,\n })\n if (afterInterceptors && !afterInterceptors.ok) {\n return json(afterInterceptors.body, { status: afterInterceptors.statusCode, headers: afterInterceptors.headers })\n }\n if (afterInterceptors?.ok) {\n return json(afterInterceptors.body, { status: 200, headers: afterInterceptors.headers })\n }\n }\n return json(payload)\n } catch (e) {\n return handleError(e)\n }\n }\n\n return { metadata, GET, POST, PUT, DELETE }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["payload", "response", "beforeInterceptors", "input", "de", "updateUserFeatures", "updateAllGuards", "deleteUserFeatures", "deleteAllGuards"]
7
7
  }