@solidxai/core 0.1.13-beta.11 → 0.1.13-beta.13

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 (103) hide show
  1. package/.claude/settings.local.json +16 -0
  2. package/CHANGELOG.md +1128 -0
  3. package/CLAUDE.md +26 -0
  4. package/dist/commands/run-tests.command.d.ts +2 -0
  5. package/dist/commands/run-tests.command.d.ts.map +1 -1
  6. package/dist/commands/run-tests.command.js +20 -3
  7. package/dist/commands/run-tests.command.js.map +1 -1
  8. package/dist/seeders/seed-data/solid-core-metadata.json +1 -1
  9. package/dist/services/chatter-message.service.d.ts +4 -1
  10. package/dist/services/chatter-message.service.d.ts.map +1 -1
  11. package/dist/services/chatter-message.service.js +4 -1
  12. package/dist/services/chatter-message.service.js.map +1 -1
  13. package/dist/services/crud-helper.service.d.ts +1 -2
  14. package/dist/services/crud-helper.service.d.ts.map +1 -1
  15. package/dist/services/crud-helper.service.js +2 -16
  16. package/dist/services/crud-helper.service.js.map +1 -1
  17. package/dist/services/crud.service.d.ts.map +1 -1
  18. package/dist/services/crud.service.js +1 -1
  19. package/dist/services/crud.service.js.map +1 -1
  20. package/dist/services/draft-publish-helper.service.d.ts +1 -0
  21. package/dist/services/draft-publish-helper.service.d.ts.map +1 -1
  22. package/dist/services/draft-publish-helper.service.js +38 -4
  23. package/dist/services/draft-publish-helper.service.js.map +1 -1
  24. package/dist/services/settings/default-settings-provider.service.d.ts +62 -6
  25. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  26. package/dist/services/settings/default-settings-provider.service.js +34 -3
  27. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  28. package/dist/testing/reporter/console-reporter.d.ts +3 -0
  29. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  30. package/dist/testing/reporter/console-reporter.js +2 -0
  31. package/dist/testing/reporter/console-reporter.js.map +1 -1
  32. package/dist/testing/reporter/progress-reporter.d.ts +64 -0
  33. package/dist/testing/reporter/progress-reporter.d.ts.map +1 -0
  34. package/dist/testing/reporter/progress-reporter.js +224 -0
  35. package/dist/testing/reporter/progress-reporter.js.map +1 -0
  36. package/dist/testing/reporter/reporter.types.d.ts +3 -0
  37. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  38. package/dist/testing/reporter/reporter.types.js.map +1 -1
  39. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  40. package/dist/testing/runner/run-from-metadata.js +1 -0
  41. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  42. package/dist/theme/theme-registry.d.ts +14 -0
  43. package/dist/theme/theme-registry.d.ts.map +1 -0
  44. package/dist/theme/theme-registry.js +147 -0
  45. package/dist/theme/theme-registry.js.map +1 -0
  46. package/package.json +1 -1
  47. package/src/commands/run-tests.command.ts +17 -3
  48. package/src/seeders/seed-data/solid-core-metadata.json +1 -1
  49. package/src/services/1.js +6 -0
  50. package/src/services/chatter-message.service.ts +22 -1
  51. package/src/services/crud-helper.service.ts +19 -16
  52. package/src/services/crud.service.ts +2 -1
  53. package/src/services/draft-publish-helper.service.ts +56 -4
  54. package/src/services/settings/default-settings-provider.service.ts +34 -3
  55. package/src/testing/README.md +2 -1
  56. package/src/testing/reporter/console-reporter.ts +4 -0
  57. package/src/testing/reporter/progress-reporter.ts +251 -0
  58. package/src/testing/reporter/reporter.types.ts +3 -0
  59. package/src/testing/runner/run-from-metadata.ts +1 -0
  60. package/src/theme/theme-registry.ts +181 -0
  61. package/dist-tests/api/authenticate.spec.js +0 -119
  62. package/dist-tests/api/authenticate.spec.js.map +0 -1
  63. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  64. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  65. package/dist-tests/api/ping.spec.js +0 -21
  66. package/dist-tests/api/ping.spec.js.map +0 -1
  67. package/dist-tests/helpers/auth.js +0 -41
  68. package/dist-tests/helpers/auth.js.map +0 -1
  69. package/dist-tests/helpers/env.js +0 -11
  70. package/dist-tests/helpers/env.js.map +0 -1
  71. package/docs/agent-builder/notebook-lm-prompt-for-agent-builder.md +0 -136
  72. package/docs/agent-builder/team-ready-note-agent-builder.md +0 -305
  73. package/docs/agent-hub-grooming.md +0 -301
  74. package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +0 -438
  75. package/docs/dashboards/dashboard-curl-smoke-tests.txt +0 -146
  76. package/docs/dashboards/delete-legacy-dashboard-metadata.sql +0 -172
  77. package/docs/datasource-introspection-ddl-analysis.md +0 -326
  78. package/docs/datasource-introspection-implementation-plan.md +0 -306
  79. package/docs/grouping-enhancements.md +0 -89
  80. package/docs/java-spring/README.md +0 -3
  81. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  82. package/docs/module-package-import-handoff.md +0 -691
  83. package/docs/seed-changes.md +0 -65
  84. package/docs/test-data-workflow.md +0 -200
  85. package/docs/type-declaration-import-issue.md +0 -24
  86. package/docs/workflow/business-automation-example-notes.md +0 -309
  87. package/docs/workflow/control-flow-node-addition-sop.md +0 -324
  88. package/docs/workflow/data-engineering-pipeline-example-notes.md +0 -330
  89. package/docs/workflow/foreach-example-notes.md +0 -187
  90. package/docs/workflow/hello-world-example-notes.md +0 -271
  91. package/docs/workflow/kestra-concepts-plugins-blueprints.md +0 -315
  92. package/docs/workflow/loop-until-example-notes.md +0 -198
  93. package/docs/workflow/microservices-and-apis-example-notes.md +0 -264
  94. package/docs/workflow/samples.md +0 -25
  95. package/docs/workflow/what-is-kestra.md +0 -79
  96. package/docs/workflow/workflow-core-module-handoff-summary.md +0 -191
  97. package/docs/workflow/workflow-module-brd.md +0 -185
  98. package/docs/workflow/workflow-module-domain-model.md +0 -252
  99. package/docs/workflow/workflow-module-metadata-dsl.md +0 -302
  100. package/docs/workflow/workflow-module-technical-spec.md +0 -293
  101. package/docs/workflow/workflow-node-type-contracts.md +0 -635
  102. package/docs/workflow/workflow-node-ui-metadata-contract.md +0 -1262
  103. package/docs/workflow/workflow-solidx-model-field-spec.md +0 -284
@@ -1 +1 @@
1
- {"version":3,"file":"draft-publish-helper.service.js","sourceRoot":"","sources":["../../src/services/draft-publish-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, NotFoundException } from \"@nestjs/common\";\nimport { EntityManager, FindOptionsWhere, In, SelectQueryBuilder } from \"typeorm\";\nimport { QueryDeepPartialEntity } from \"typeorm/query-builder/QueryPartialEntity\";\nimport { DRAFT_PUBLISH_VERSIONING_FIELD_NAMES } from \"../constants/draft-publish-fields\";\nimport { RelationType, SolidFieldType } from \"../dtos/create-field-metadata.dto\";\nimport { CommonEntity } from \"../entities/common.entity\";\nimport { FieldMetadata } from \"../entities/field-metadata.entity\";\nimport { Media } from \"../entities/media.entity\";\nimport { ModelMetadata } from \"../entities/model-metadata.entity\";\nimport { SolidBaseRepository } from \"../repository/solid-base.repository\";\nimport { normalizeObjectKeys } from \"./object.utils\";\n\ntype TransformDtoResult = {\n dto: any;\n hasMediaFields: boolean;\n};\n\ntype DraftPublishCrudContext<T extends CommonEntity> = {\n repo: SolidBaseRepository<T>;\n modelName: string;\n moduleName: string;\n validateAndTransformDto: (\n field: FieldMetadata,\n dto: any,\n files: Express.Multer.File[],\n hasMediaFields: boolean,\n isPartialUpdate?: boolean,\n isUpdate?: boolean,\n entityId?: number,\n ) => Promise<TransformDtoResult>;\n saveMedia: (model: ModelMetadata, files: Express.Multer.File[], savedEntity: T) => Promise<void>;\n getDatasourceDefaultEntityManager: () => EntityManager;\n getColumnDatabaseName: (propertyName: string) => string;\n escapeDatabaseName: (databaseName: string) => string;\n};\n\nexport class DraftPublishHelperService {\n isDraftPublishEnabled(model: ModelMetadata): boolean {\n return model?.draftPublishWorkflow === true;\n }\n\n assertDraftPublishWorkflowEnabled(model: ModelMetadata, modelName: string): void {\n if (!this.isDraftPublishEnabled(model)) {\n throw new BadRequestException(`Publish workflow is not enabled for ${modelName}`);\n }\n }\n\n assertUpdateAllowed<T extends CommonEntity>(model: ModelMetadata, entity: T, modelName: string): void {\n if (!this.isDraftPublishEnabled(model)) return;\n if (entity.isLatest === false) {\n throw new BadRequestException(`Only the latest version of ${modelName} can be updated.`);\n }\n }\n\n shouldCopyPublishedVersionForUpdate<T extends CommonEntity>(model: ModelMetadata, entity: T): boolean {\n return this.isDraftPublishEnabled(model) && entity.isPublished === true;\n }\n\n applyCreateDefaults(model: ModelMetadata, createDto: any): void {\n if (!this.isDraftPublishEnabled(model)) return;\n createDto.isLatest = true;\n createDto.isPublished = false;\n createDto.publishedAt = null;\n createDto.publishedTracker = \"na\";\n }\n\n async ensureInitialEntityVersionId<T extends CommonEntity>(\n model: ModelMetadata,\n repo: SolidBaseRepository<T>,\n savedEntity: T,\n ): Promise<T> {\n if (!this.isDraftPublishEnabled(model) || savedEntity.initialEntityVersionId) return savedEntity;\n savedEntity.initialEntityVersionId = savedEntity.id;\n return repo.save(savedEntity) as Promise<T>;\n }\n\n applyDraftPublishFilterDefaults(\n qb: SelectQueryBuilder<any>,\n filters: any,\n entityAlias: string,\n ): void {\n const hasIsLatestFilter = this.filtersContainField(filters, 'isLatest');\n const hasInitialVersionFilter = this.filtersContainField(filters, 'initialEntityVersionId');\n const isPublishedViewRequested = this.filtersContainBooleanValue(filters, 'isPublished', true);\n const shouldApplyDefaultLatestFilter = !isPublishedViewRequested && !hasIsLatestFilter && !hasInitialVersionFilter;\n\n if (shouldApplyDefaultLatestFilter) {\n // OR in deletedAt IS NOT NULL so soft-deleted rows — always isLatest: false\n // once deleted, see markDeletedDraftPublishVersionsAsNotLatest — stay visible\n // when showSoftDeleted=inclusive/exclusive calls qb.withDeleted() to bypass\n // TypeORM's automatic deletedAt-IS-NULL exclusion. Under the default query\n // (no withDeleted()), deletedAt IS NOT NULL rows are already excluded by\n // TypeORM itself, so this OR has no effect there.\n qb.andWhere(\n `(${entityAlias}.isLatest = :defaultIsLatest OR ${entityAlias}.deletedAt IS NOT NULL)`,\n { defaultIsLatest: true },\n );\n }\n }\n\n filtersContainField(filters: any, fieldName: string): boolean {\n return this.someFilterLeaf(filters, fieldName, () => true);\n }\n\n async copyPublishedVersionAndUpdate<T extends CommonEntity>(\n context: DraftPublishCrudContext<T>,\n id: number,\n updateDto: any,\n files: Express.Multer.File[],\n isPartialUpdate: boolean,\n model: ModelMetadata,\n ): Promise<T> {\n const relationNames = this.getVersionedRelationNames(model);\n const sourceEntity = await context.repo.findOne({\n where: { id } as unknown as FindOptionsWhere<T>,\n relations: relationNames as any,\n });\n\n if (!sourceEntity) {\n throw new Error(`Entity [${context.moduleName}.${context.modelName}] with id ${id} not found`);\n }\n\n let hasMediaFields = false;\n // Snapshot of what the caller actually submitted, used only for hasOwnProperty checks\n // below; the transform pipeline works off its own copy (transformedDto) so this\n // reference never needs to be cloned.\n const submittedDto = updateDto;\n let transformedDto = { ...updateDto };\n\n for (const field of model.fields) {\n const transformed = await context.validateAndTransformDto(field, transformedDto, files, hasMediaFields, isPartialUpdate, false);\n transformedDto = transformed.dto;\n hasMediaFields = transformed.hasMediaFields;\n }\n\n const newVersionPayload = this.buildNewVersionPayload(context.repo, sourceEntity, relationNames);\n\n for (const field of model.fields) {\n if (this.wasFieldSubmitted(submittedDto, field) && Object.prototype.hasOwnProperty.call(transformedDto, field.name)) {\n newVersionPayload[field.name] = transformedDto[field.name];\n }\n }\n\n const chainId = sourceEntity.initialEntityVersionId || sourceEntity.id;\n newVersionPayload.initialEntityVersionId = chainId;\n newVersionPayload.isLatest = true;\n newVersionPayload.isPublished = false;\n newVersionPayload.publishedAt = null;\n newVersionPayload.publishedTracker = this.createTemporaryPublishedVersionTracker();\n\n const savedVersion = await context.repo.manager.transaction(async (manager) => {\n const transactionalRepo = manager.getRepository(context.repo.metadata.target);\n\n await manager\n .createQueryBuilder()\n .update(context.repo.metadata.target)\n .set({ isLatest: false } as any)\n .where(`${context.escapeDatabaseName(context.getColumnDatabaseName('isLatest'))} = :isLatest`, { isLatest: true })\n .andWhere(`(${context.escapeDatabaseName(context.getColumnDatabaseName('initialEntityVersionId'))} = :chainId OR ${context.escapeDatabaseName(context.getColumnDatabaseName('id'))} = :chainId)`, { chainId })\n .callListeners(false)\n .execute();\n\n const newVersion = transactionalRepo.create(newVersionPayload);\n let persistedVersion = await transactionalRepo.save(newVersion) as unknown as T;\n persistedVersion.publishedTracker = this.createPublishedVersionTracker(persistedVersion.id);\n persistedVersion = await transactionalRepo.save(persistedVersion as any) as unknown as T;\n\n await this.cloneMediaForVersion(context, model, sourceEntity.id, persistedVersion, files, manager);\n\n return persistedVersion;\n });\n\n if (hasMediaFields) {\n await context.saveMedia(model, files, savedVersion);\n }\n\n return savedVersion;\n }\n\n assertDraftPublishDeleteAllowed<T extends CommonEntity>(\n modelName: string,\n entities: T[],\n ): void {\n // The caller just loaded these entities, so their isPublished flags are already\n // current — no need to re-query the DB for the same rows.\n const currentPublishedEntityIds = entities\n .filter(entity => entity.isPublished === true)\n .map(entity => entity.id);\n\n if (currentPublishedEntityIds.length > 0) {\n throw new BadRequestException(\n `Published ${modelName} record cannot be deleted. Publish another draft or unpublish it before deleting. Invalid Ids ${currentPublishedEntityIds.join(', ')}.`\n );\n }\n }\n\n markDeletedDraftPublishVersionsAsNotLatest<T extends CommonEntity>(model: ModelMetadata, entities: T[]): void {\n if (!this.isDraftPublishEnabled(model)) return;\n for (const entity of entities) {\n if (entity.isLatest === true) {\n entity.isLatest = false;\n }\n }\n }\n\n getLatestDraftPublishChainIds<T extends CommonEntity>(entities: T[]): number[] {\n return Array.from(new Set(\n entities\n .filter(entity => entity.isLatest === true)\n .map(entity => entity.initialEntityVersionId || entity.id)\n ));\n }\n\n getEntityIds<T extends CommonEntity>(entities: T[]): number[] {\n return entities.map(entity => entity.id).filter(Boolean);\n }\n\n async promoteLatestDraftPublishVersionAfterDelete<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n deletedLatestChainIds: number[],\n deletedIds: number[],\n ): Promise<void> {\n if (deletedLatestChainIds.length === 0) return;\n\n // Chains are independent of one another, so promote replacements concurrently\n // rather than awaiting one chain at a time.\n await Promise.all(deletedLatestChainIds.map(chainId =>\n this.promoteReplacementForChain(repo, chainId, deletedIds)\n ));\n }\n\n private async promoteReplacementForChain<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n chainId: number,\n deletedIds: number[],\n ): Promise<void> {\n const replacementQuery = repo.manager\n .createQueryBuilder(repo.metadata.target, 'entity')\n .where('(entity.initialEntityVersionId = :chainId OR entity.id = :chainId)', { chainId })\n .orderBy('entity.createdAt', 'DESC')\n .addOrderBy('entity.id', 'DESC');\n\n if (deletedIds.length > 0) {\n replacementQuery.andWhere('entity.id NOT IN (:...deletedIds)', { deletedIds });\n }\n\n const replacement = await replacementQuery.getOne() as T | null;\n if (!replacement) return;\n\n await repo.manager\n .createQueryBuilder()\n .update(repo.metadata.target)\n .set({ isLatest: false } as any)\n .where('(initial_entity_version_id = :chainId OR id = :chainId)', { chainId })\n .execute();\n\n await repo.update(replacement.id, { isLatest: true } as unknown as QueryDeepPartialEntity<T>);\n }\n\n async promoteRecoveredDraftPublishVersion<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n recoveredEntity: T,\n ): Promise<void> {\n const chainId = recoveredEntity.initialEntityVersionId || recoveredEntity.id;\n\n await repo.manager\n .createQueryBuilder()\n .update(repo.metadata.target)\n .set({ isLatest: false } as any)\n .where('(initial_entity_version_id = :chainId OR id = :chainId)', { chainId })\n .execute();\n\n await repo.update(recoveredEntity.id, { isLatest: true } as unknown as QueryDeepPartialEntity<T>);\n recoveredEntity.isLatest = true;\n }\n\n async publishRecord<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n model: ModelMetadata,\n modelName: string,\n id: number,\n activeUser?: any,\n ): Promise<T> {\n const entity = await this.loadLatestEntityForPublishAction(repo, model, modelName, id, 'published');\n\n if (entity.isPublished) {\n throw new BadRequestException(`${modelName} with id ${id} is already published`);\n }\n\n const chainId = entity.initialEntityVersionId || entity.id;\n\n return repo.manager.transaction(async (manager) => {\n const transactionalRepo = manager.getRepository(repo.metadata.target);\n const chainVersions = await transactionalRepo.find({\n where: [\n { initialEntityVersionId: chainId },\n { id: chainId },\n ] as any,\n }) as unknown as T[];\n const archivedVersions = chainVersions\n .filter(version => version.id !== entity.id)\n .map(version => ({\n ...version,\n isPublished: false,\n publishedTracker: this.createPublishedVersionTracker(version.id),\n }));\n\n if (archivedVersions.length > 0) {\n await transactionalRepo.save(archivedVersions as any);\n }\n\n return transactionalRepo.save({\n ...entity,\n initialEntityVersionId: chainId,\n isPublished: true,\n publishedAt: new Date(),\n publishedTracker: \"na\",\n updatedBy: activeUser?.sub ?? entity.updatedBy,\n } as any) as Promise<T>;\n });\n }\n\n async unpublishRecord<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n model: ModelMetadata,\n modelName: string,\n id: number,\n activeUser?: any,\n ): Promise<T> {\n const entity = await this.loadLatestEntityForPublishAction(repo, model, modelName, id, 'unpublished');\n\n if (!entity.isPublished) {\n throw new BadRequestException(`${modelName} with id ${id} is already unpublished`);\n }\n\n return repo.save({\n ...entity,\n isPublished: false,\n updatedBy: activeUser?.sub ?? entity.updatedBy,\n });\n }\n\n /**\n * Load the latest version of a draft/publish-enabled record for a publish/unpublish\n * action, applying the two checks both actions share (workflow enabled, version is latest).\n */\n private async loadLatestEntityForPublishAction<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n model: ModelMetadata,\n modelName: string,\n id: number,\n action: 'published' | 'unpublished',\n ): Promise<T> {\n this.assertDraftPublishWorkflowEnabled(model, modelName);\n\n const entity = await repo.findOne({ where: { id } as any });\n if (!entity) {\n throw new NotFoundException(`${modelName} with id ${id} not found`);\n }\n\n if (entity.isLatest === false) {\n throw new BadRequestException(`Only the latest version of ${modelName} can be ${action}.`);\n }\n\n return entity;\n }\n\n /**\n * Walk a (possibly nested, $and/$or-combined) filters object looking for any leaf keyed\n * by `fieldName`, delegating the leaf test to the caller. Shared by filtersContainField\n * (any occurrence counts) and filtersContainBooleanValue (occurrence must match a value).\n */\n private someFilterLeaf(filters: any, fieldName: string, matchesLeaf: (value: any) => boolean): boolean {\n if (!filters || typeof filters !== 'object') return false;\n const normalizedFilters = normalizeObjectKeys(filters);\n\n return Object.keys(normalizedFilters).some(key => {\n const [rawField] = key.split(':');\n const value = normalizedFilters[key];\n if (rawField === fieldName) return matchesLeaf(value);\n if (key === '$and' || key === '$or') {\n return Array.isArray(value) && value.some((nestedFilter: any) => this.someFilterLeaf(nestedFilter, fieldName, matchesLeaf));\n }\n return value && typeof value === 'object' && this.someFilterLeaf(value, fieldName, matchesLeaf);\n });\n }\n\n private normalizeBooleanFilterValue(value: boolean | string | undefined): boolean | undefined {\n if (value === undefined || value === null || value === '') return undefined;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n const normalized = value.toLowerCase();\n if (normalized === 'true') return true;\n if (normalized === 'false') return false;\n }\n return undefined;\n }\n\n private filtersContainBooleanValue(filters: any, fieldName: string, expectedValue: boolean): boolean {\n return this.someFilterLeaf(filters, fieldName, value => this.extractBooleanFilterValues(value).includes(expectedValue));\n }\n\n private extractBooleanFilterValues(filterValue: any): boolean[] {\n if (filterValue === undefined || filterValue === null) return [];\n const directValue = this.normalizeBooleanFilterValue(filterValue);\n if (directValue !== undefined) return [directValue];\n if (Array.isArray(filterValue)) {\n return filterValue\n .map(value => this.normalizeBooleanFilterValue(value))\n .filter((value): value is boolean => value !== undefined);\n }\n if (typeof filterValue !== 'object') return [];\n\n const normalizedValue = normalizeObjectKeys(filterValue);\n return Object.keys(normalizedValue)\n .filter(operator => operator === '$eq' || operator === '$in')\n .flatMap(operator => this.extractBooleanFilterValues(normalizedValue[operator]));\n }\n\n private getVersionedRelationNames(model: ModelMetadata): string[] {\n return model.fields\n .filter(field => field.type === SolidFieldType.relation && field.relationType !== RelationType.oneToMany)\n .map(field => field.name);\n }\n\n private wasFieldSubmitted(dto: any, field: FieldMetadata): boolean {\n if (!dto) return false;\n if (Object.prototype.hasOwnProperty.call(dto, field.name)) return true;\n if (field.type !== SolidFieldType.relation) return false;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.name}Id`)) return true;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.name}Ids`)) return true;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.name}UserKey`)) return true;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.name}Command`)) return true;\n if (field.relationCoModelFieldName) {\n if (Object.prototype.hasOwnProperty.call(dto, `${field.relationCoModelFieldName}Ids`)) return true;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.relationCoModelFieldName}Command`)) return true;\n }\n return false;\n }\n\n private buildNewVersionPayload<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n sourceEntity: T,\n relationNames: string[],\n ): any {\n const newVersionPayload: any = {};\n const excludedColumns = new Set([\n 'id',\n 'createdAt',\n 'updatedAt',\n 'deletedAt',\n 'createdBy',\n 'updatedBy',\n 'publishedAt',\n ...DRAFT_PUBLISH_VERSIONING_FIELD_NAMES,\n ]);\n\n repo.metadata.columns.forEach(column => {\n if (!excludedColumns.has(column.propertyName)) {\n newVersionPayload[column.propertyName] = sourceEntity[column.propertyName];\n }\n });\n\n for (const relationName of relationNames) {\n newVersionPayload[relationName] = sourceEntity[relationName];\n }\n\n return newVersionPayload;\n }\n\n private async cloneMediaForVersion<T extends CommonEntity>(\n context: DraftPublishCrudContext<T>,\n model: ModelMetadata,\n sourceEntityId: number,\n targetEntity: T,\n files: Express.Multer.File[] = [],\n entityManager?: EntityManager,\n ): Promise<void> {\n const mediaFields = model.fields.filter(field => field.type === SolidFieldType.mediaSingle || field.type === SolidFieldType.mediaMultiple);\n if (mediaFields.length === 0) return;\n\n const uploadedFieldNames = new Set(files.map(file => file.fieldname));\n const clonableFieldIds = mediaFields\n .filter(field => !uploadedFieldNames.has(field.name))\n .map(field => field.id);\n if (clonableFieldIds.length === 0) return;\n\n const mediaRepository = (entityManager ?? context.getDatasourceDefaultEntityManager()).getRepository(Media);\n\n // One query for every clonable media field instead of one query per field.\n const sourceMedia = await mediaRepository.find({\n where: {\n entityId: sourceEntityId,\n modelMetadata: { id: model.id },\n fieldMetadata: { id: In(clonableFieldIds) },\n } as any,\n relations: {\n modelMetadata: true,\n mediaStorageProviderMetadata: true,\n fieldMetadata: true,\n } as any,\n });\n if (sourceMedia.length === 0) return;\n\n // Reuse the same underlying file across versions instead of physically duplicating it\n // in storage; MediaService.deletePhysicalFile guards against removing the file while\n // another Media row still references it. Saved as a single batch instead of one insert\n // per row.\n const clonedMedia = sourceMedia.map(media => mediaRepository.create({\n entityId: targetEntity.id,\n relativeUri: media.relativeUri,\n fileSize: media.fileSize,\n mimeType: media.mimeType,\n originalFileName: media.originalFileName,\n modelMetadata: media.modelMetadata,\n mediaStorageProviderMetadata: media.mediaStorageProviderMetadata,\n fieldMetadata: media.fieldMetadata,\n }));\n await mediaRepository.save(clonedMedia);\n }\n\n private createPublishedVersionTracker(seed: number | string): string {\n return `version:${seed}`;\n }\n\n private createTemporaryPublishedVersionTracker(): string {\n return `version:pending:${Date.now()}:${Math.random().toString(36).slice(2)}`;\n }\n}\n"]}
1
+ {"version":3,"file":"draft-publish-helper.service.js","sourceRoot":"","sources":["../../src/services/draft-publish-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, NotFoundException } from \"@nestjs/common\";\nimport { EntityManager, FindOptionsWhere, In, SelectQueryBuilder } from \"typeorm\";\nimport { QueryDeepPartialEntity } from \"typeorm/query-builder/QueryPartialEntity\";\nimport { DRAFT_PUBLISH_VERSIONING_FIELD_NAMES } from \"../constants/draft-publish-fields\";\nimport { RelationType, SolidFieldType } from \"../dtos/create-field-metadata.dto\";\nimport { CommonEntity } from \"../entities/common.entity\";\nimport { FieldMetadata } from \"../entities/field-metadata.entity\";\nimport { Media } from \"../entities/media.entity\";\nimport { ModelMetadata } from \"../entities/model-metadata.entity\";\nimport { SolidBaseRepository } from \"../repository/solid-base.repository\";\nimport { normalizeObjectKeys } from \"./object.utils\";\n\ntype TransformDtoResult = {\n dto: any;\n hasMediaFields: boolean;\n};\n\ntype DraftPublishCrudContext<T extends CommonEntity> = {\n repo: SolidBaseRepository<T>;\n modelName: string;\n moduleName: string;\n validateAndTransformDto: (\n field: FieldMetadata,\n dto: any,\n files: Express.Multer.File[],\n hasMediaFields: boolean,\n isPartialUpdate?: boolean,\n isUpdate?: boolean,\n entityId?: number,\n ) => Promise<TransformDtoResult>;\n saveMedia: (model: ModelMetadata, files: Express.Multer.File[], savedEntity: T) => Promise<void>;\n getDatasourceDefaultEntityManager: () => EntityManager;\n getColumnDatabaseName: (propertyName: string) => string;\n escapeDatabaseName: (databaseName: string) => string;\n};\n\nexport class DraftPublishHelperService {\n isDraftPublishEnabled(model: ModelMetadata): boolean {\n return model?.draftPublishWorkflow === true;\n }\n\n assertDraftPublishWorkflowEnabled(model: ModelMetadata, modelName: string): void {\n if (!this.isDraftPublishEnabled(model)) {\n throw new BadRequestException(`Publish workflow is not enabled for ${modelName}`);\n }\n }\n\n assertUpdateAllowed<T extends CommonEntity>(model: ModelMetadata, entity: T, modelName: string): void {\n if (!this.isDraftPublishEnabled(model)) return;\n if (entity.isLatest === false) {\n throw new BadRequestException(`Only the latest version of ${modelName} can be updated.`);\n }\n }\n\n shouldCopyPublishedVersionForUpdate<T extends CommonEntity>(model: ModelMetadata, entity: T): boolean {\n return this.isDraftPublishEnabled(model) && entity.isPublished === true;\n }\n\n applyCreateDefaults(model: ModelMetadata, createDto: any): void {\n if (!this.isDraftPublishEnabled(model)) return;\n createDto.isLatest = true;\n createDto.isPublished = false;\n createDto.publishedAt = null;\n createDto.publishedTracker = \"na\";\n }\n\n async ensureInitialEntityVersionId<T extends CommonEntity>(\n model: ModelMetadata,\n repo: SolidBaseRepository<T>,\n savedEntity: T,\n ): Promise<T> {\n if (!this.isDraftPublishEnabled(model) || savedEntity.initialEntityVersionId) return savedEntity;\n savedEntity.initialEntityVersionId = savedEntity.id;\n return repo.save(savedEntity) as Promise<T>;\n }\n\n applyDraftPublishFilterDefaults(\n qb: SelectQueryBuilder<any>,\n filters: any,\n entityAlias: string,\n ): void {\n const hasIsLatestFilter = this.filtersContainField(filters, 'isLatest');\n const hasInitialVersionFilter = this.filtersContainField(filters, 'initialEntityVersionId');\n const isPublishedViewRequested = this.filtersContainBooleanValue(filters, 'isPublished', true);\n const shouldApplyDefaultLatestFilter = !isPublishedViewRequested && !hasIsLatestFilter && !hasInitialVersionFilter;\n\n if (shouldApplyDefaultLatestFilter) {\n // OR in deletedAt IS NOT NULL so soft-deleted rows — always isLatest: false\n // once deleted, see markDeletedDraftPublishVersionsAsNotLatest — stay visible\n // when showSoftDeleted=inclusive/exclusive calls qb.withDeleted() to bypass\n // TypeORM's automatic deletedAt-IS-NULL exclusion. Under the default query\n // (no withDeleted()), deletedAt IS NOT NULL rows are already excluded by\n // TypeORM itself, so this OR has no effect there.\n qb.andWhere(\n `(${entityAlias}.isLatest = :defaultIsLatest OR ${entityAlias}.deletedAt IS NOT NULL)`,\n { defaultIsLatest: true },\n );\n }\n }\n\n filtersContainField(filters: any, fieldName: string): boolean {\n return this.someFilterLeaf(filters, fieldName, () => true);\n }\n\n async copyPublishedVersionAndUpdate<T extends CommonEntity>(\n context: DraftPublishCrudContext<T>,\n id: number,\n updateDto: any,\n files: Express.Multer.File[],\n isPartialUpdate: boolean,\n model: ModelMetadata,\n ): Promise<T> {\n const relationNames = this.getVersionedRelationNames(model);\n const sourceEntity = await context.repo.findOne({\n where: { id } as unknown as FindOptionsWhere<T>,\n relations: relationNames as any,\n });\n\n if (!sourceEntity) {\n throw new Error(`Entity [${context.moduleName}.${context.modelName}] with id ${id} not found`);\n }\n\n let hasMediaFields = false;\n // Snapshot of what the caller actually submitted, used only for hasOwnProperty checks\n // below; the transform pipeline works off its own copy (transformedDto) so this\n // reference never needs to be cloned.\n const submittedDto = updateDto;\n let transformedDto = { ...updateDto };\n\n for (const field of model.fields) {\n const transformed = await context.validateAndTransformDto(field, transformedDto, files, hasMediaFields, isPartialUpdate, false);\n transformedDto = transformed.dto;\n hasMediaFields = transformed.hasMediaFields;\n }\n\n const newVersionPayload = this.buildNewVersionPayload(context.repo, sourceEntity, relationNames);\n\n for (const field of model.fields) {\n if (this.wasFieldSubmitted(submittedDto, field) && Object.prototype.hasOwnProperty.call(transformedDto, field.name)) {\n newVersionPayload[field.name] = transformedDto[field.name];\n }\n }\n\n const chainId = sourceEntity.initialEntityVersionId || sourceEntity.id;\n newVersionPayload.initialEntityVersionId = chainId;\n newVersionPayload.isLatest = true;\n newVersionPayload.isPublished = false;\n newVersionPayload.publishedAt = null;\n newVersionPayload.publishedTracker = this.createTemporaryPublishedVersionTracker();\n\n const savedVersion = await context.repo.manager.transaction(async (manager) => {\n const transactionalRepo = manager.getRepository(context.repo.metadata.target);\n\n await manager\n .createQueryBuilder()\n .update(context.repo.metadata.target)\n .set({ isLatest: false } as any)\n .where(`${context.escapeDatabaseName(context.getColumnDatabaseName('isLatest'))} = :isLatest`, { isLatest: true })\n .andWhere(`(${context.escapeDatabaseName(context.getColumnDatabaseName('initialEntityVersionId'))} = :chainId OR ${context.escapeDatabaseName(context.getColumnDatabaseName('id'))} = :chainId)`, { chainId })\n .callListeners(false)\n .execute();\n\n const newVersion = transactionalRepo.create(newVersionPayload);\n let persistedVersion = await transactionalRepo.save(newVersion) as unknown as T;\n persistedVersion.publishedTracker = this.createPublishedVersionTracker(persistedVersion.id);\n persistedVersion = await transactionalRepo.save(persistedVersion as any) as unknown as T;\n\n await this.cloneMediaForVersion(context, model, sourceEntity.id, persistedVersion, files, manager);\n\n return persistedVersion;\n });\n\n if (hasMediaFields) {\n await context.saveMedia(model, files, savedVersion);\n }\n\n return savedVersion;\n }\n\n assertDraftPublishDeleteAllowed<T extends CommonEntity>(\n modelName: string,\n entities: T[],\n ): void {\n // The caller just loaded these entities, so their isPublished flags are already\n // current — no need to re-query the DB for the same rows.\n const currentPublishedEntityIds = entities\n .filter(entity => entity.isPublished === true)\n .map(entity => entity.id);\n\n if (currentPublishedEntityIds.length > 0) {\n throw new BadRequestException(\n `Published ${modelName} record cannot be deleted. Publish another draft or unpublish it before deleting. Invalid Ids ${currentPublishedEntityIds.join(', ')}.`\n );\n }\n }\n\n markDeletedDraftPublishVersionsAsNotLatest<T extends CommonEntity>(model: ModelMetadata, entities: T[]): void {\n if (!this.isDraftPublishEnabled(model)) return;\n for (const entity of entities) {\n if (entity.isLatest === true) {\n entity.isLatest = false;\n }\n }\n }\n\n getLatestDraftPublishChainIds<T extends CommonEntity>(entities: T[]): number[] {\n return Array.from(new Set(\n entities\n .filter(entity => entity.isLatest === true)\n .map(entity => entity.initialEntityVersionId || entity.id)\n ));\n }\n\n getEntityIds<T extends CommonEntity>(entities: T[]): number[] {\n return entities.map(entity => entity.id).filter(Boolean);\n }\n\n async promoteLatestDraftPublishVersionAfterDelete<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n deletedLatestChainIds: number[],\n deletedIds: number[],\n ): Promise<void> {\n if (deletedLatestChainIds.length === 0) return;\n\n // Chains are independent of one another, so promote replacements concurrently\n // rather than awaiting one chain at a time.\n await Promise.all(deletedLatestChainIds.map(chainId =>\n this.promoteReplacementForChain(repo, chainId, deletedIds)\n ));\n }\n\n private async promoteReplacementForChain<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n chainId: number,\n deletedIds: number[],\n ): Promise<void> {\n const replacementQuery = repo.manager\n .createQueryBuilder(repo.metadata.target, 'entity')\n .where('(entity.initialEntityVersionId = :chainId OR entity.id = :chainId)', { chainId })\n .orderBy('entity.createdAt', 'DESC')\n .addOrderBy('entity.id', 'DESC');\n\n if (deletedIds.length > 0) {\n replacementQuery.andWhere('entity.id NOT IN (:...deletedIds)', { deletedIds });\n }\n\n const replacement = await replacementQuery.getOne() as T | null;\n if (!replacement) return;\n\n await repo.manager\n .createQueryBuilder()\n .update(repo.metadata.target)\n .set({ isLatest: false } as any)\n .where('(initial_entity_version_id = :chainId OR id = :chainId)', { chainId })\n .execute();\n\n await repo.update(replacement.id, { isLatest: true } as unknown as QueryDeepPartialEntity<T>);\n }\n\n async promoteRecoveredDraftPublishVersion<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n recoveredEntity: T,\n ): Promise<void> {\n const chainId = recoveredEntity.initialEntityVersionId || recoveredEntity.id;\n\n await repo.manager\n .createQueryBuilder()\n .update(repo.metadata.target)\n .set({ isLatest: false } as any)\n .where('(initial_entity_version_id = :chainId OR id = :chainId)', { chainId })\n .execute();\n\n await repo.update(recoveredEntity.id, { isLatest: true } as unknown as QueryDeepPartialEntity<T>);\n recoveredEntity.isLatest = true;\n }\n\n async publishRecord<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n model: ModelMetadata,\n modelName: string,\n id: number,\n activeUser?: any,\n ): Promise<T> {\n const entity = await this.loadLatestEntityForPublishAction(repo, model, modelName, id, 'published');\n\n if (entity.isPublished) {\n throw new BadRequestException(`${modelName} with id ${id} is already published`);\n }\n\n const chainId = entity.initialEntityVersionId || entity.id;\n\n return repo.manager.transaction(async (manager) => {\n const transactionalRepo = manager.getRepository(repo.metadata.target);\n const chainVersions = await transactionalRepo.find({\n where: [\n { initialEntityVersionId: chainId },\n { id: chainId },\n ] as any,\n }) as unknown as T[];\n const archivedVersions = chainVersions\n .filter(version => version.id !== entity.id)\n .map(version => ({\n ...version,\n isPublished: false,\n publishedTracker: this.createPublishedVersionTracker(version.id),\n }));\n\n if (archivedVersions.length > 0) {\n await transactionalRepo.save(archivedVersions as any);\n }\n\n return transactionalRepo.save({\n ...entity,\n initialEntityVersionId: chainId,\n isPublished: true,\n publishedAt: new Date(),\n publishedTracker: \"na\",\n updatedBy: activeUser?.sub ?? entity.updatedBy,\n } as any) as Promise<T>;\n });\n }\n\n async unpublishRecord<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n model: ModelMetadata,\n modelName: string,\n id: number,\n activeUser?: any,\n ): Promise<T> {\n const entity = await this.loadLatestEntityForPublishAction(repo, model, modelName, id, 'unpublished');\n\n if (!entity.isPublished) {\n throw new BadRequestException(`${modelName} with id ${id} is already unpublished`);\n }\n\n const chainId = entity.initialEntityVersionId || entity.id;\n\n return repo.manager.transaction(async (manager) => {\n const transactionalRepo = manager.getRepository(repo.metadata.target);\n\n // Release the \"na\" published tracker before anything else can claim it, mirroring\n // publishRecord's archive-others-then-publish ordering in reverse. unpublishRecord\n // only ever acts on the latest version (see loadLatestEntityForPublishAction), so\n // this always becomes a Draft rather than an Archived version — clear publishedAt\n // to match applyCreateDefaults' Draft convention instead of leaving a stale date.\n const unpublishedEntity = await transactionalRepo.save({\n ...entity,\n isPublished: false,\n publishedAt: null,\n publishedTracker: this.createPublishedVersionTracker(entity.id),\n updatedBy: activeUser?.sub ?? entity.updatedBy,\n } as any) as unknown as T;\n\n const chainVersions = await transactionalRepo.find({\n where: [\n { initialEntityVersionId: chainId },\n { id: chainId },\n ] as any,\n }) as unknown as T[];\n\n const versionToRestore = this.pickMostRecentlyPublishedVersion(\n chainVersions.filter(version => version.id !== entity.id),\n );\n\n if (versionToRestore) {\n await transactionalRepo.save({\n ...versionToRestore,\n isPublished: true,\n publishedAt: new Date(),\n publishedTracker: \"na\",\n } as any);\n }\n\n return unpublishedEntity;\n });\n }\n\n /**\n * Among the other versions in a chain, find the one that was live most recently before\n * being superseded (i.e. the \"Archived\" version unpublishRecord should restore). Ties on\n * publishedAt fall back to the highest id, matching pickCurrentLocaleRecord's ordering.\n */\n private pickMostRecentlyPublishedVersion<T extends CommonEntity>(versions: T[]): T | null {\n const previouslyPublished = versions.filter(version => Boolean(version.publishedAt));\n if (previouslyPublished.length === 0) return null;\n\n return previouslyPublished.sort((a, b) => {\n const aPublishedAt = new Date(a.publishedAt as any).getTime();\n const bPublishedAt = new Date(b.publishedAt as any).getTime();\n if (aPublishedAt !== bPublishedAt) return bPublishedAt - aPublishedAt;\n return Number(b.id) - Number(a.id);\n })[0];\n }\n\n /**\n * Load the latest version of a draft/publish-enabled record for a publish/unpublish\n * action, applying the two checks both actions share (workflow enabled, version is latest).\n */\n private async loadLatestEntityForPublishAction<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n model: ModelMetadata,\n modelName: string,\n id: number,\n action: 'published' | 'unpublished',\n ): Promise<T> {\n this.assertDraftPublishWorkflowEnabled(model, modelName);\n\n const entity = await repo.findOne({ where: { id } as any });\n if (!entity) {\n throw new NotFoundException(`${modelName} with id ${id} not found`);\n }\n\n if (entity.isLatest === false) {\n throw new BadRequestException(`Only the latest version of ${modelName} can be ${action}.`);\n }\n\n return entity;\n }\n\n /**\n * Walk a (possibly nested, $and/$or-combined) filters object looking for any leaf keyed\n * by `fieldName`, delegating the leaf test to the caller. Shared by filtersContainField\n * (any occurrence counts) and filtersContainBooleanValue (occurrence must match a value).\n */\n private someFilterLeaf(filters: any, fieldName: string, matchesLeaf: (value: any) => boolean): boolean {\n if (!filters || typeof filters !== 'object') return false;\n const normalizedFilters = normalizeObjectKeys(filters);\n\n return Object.keys(normalizedFilters).some(key => {\n const [rawField] = key.split(':');\n const value = normalizedFilters[key];\n if (rawField === fieldName) return matchesLeaf(value);\n if (key === '$and' || key === '$or') {\n return Array.isArray(value) && value.some((nestedFilter: any) => this.someFilterLeaf(nestedFilter, fieldName, matchesLeaf));\n }\n return value && typeof value === 'object' && this.someFilterLeaf(value, fieldName, matchesLeaf);\n });\n }\n\n private normalizeBooleanFilterValue(value: boolean | string | undefined): boolean | undefined {\n if (value === undefined || value === null || value === '') return undefined;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n const normalized = value.toLowerCase();\n if (normalized === 'true') return true;\n if (normalized === 'false') return false;\n }\n return undefined;\n }\n\n private filtersContainBooleanValue(filters: any, fieldName: string, expectedValue: boolean): boolean {\n return this.someFilterLeaf(filters, fieldName, value => this.extractBooleanFilterValues(value).includes(expectedValue));\n }\n\n private extractBooleanFilterValues(filterValue: any): boolean[] {\n if (filterValue === undefined || filterValue === null) return [];\n const directValue = this.normalizeBooleanFilterValue(filterValue);\n if (directValue !== undefined) return [directValue];\n if (Array.isArray(filterValue)) {\n return filterValue\n .map(value => this.normalizeBooleanFilterValue(value))\n .filter((value): value is boolean => value !== undefined);\n }\n if (typeof filterValue !== 'object') return [];\n\n const normalizedValue = normalizeObjectKeys(filterValue);\n return Object.keys(normalizedValue)\n .filter(operator => operator === '$eq' || operator === '$in')\n .flatMap(operator => this.extractBooleanFilterValues(normalizedValue[operator]));\n }\n\n private getVersionedRelationNames(model: ModelMetadata): string[] {\n return model.fields\n .filter(field => field.type === SolidFieldType.relation && field.relationType !== RelationType.oneToMany)\n .map(field => field.name);\n }\n\n private wasFieldSubmitted(dto: any, field: FieldMetadata): boolean {\n if (!dto) return false;\n if (Object.prototype.hasOwnProperty.call(dto, field.name)) return true;\n if (field.type !== SolidFieldType.relation) return false;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.name}Id`)) return true;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.name}Ids`)) return true;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.name}UserKey`)) return true;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.name}Command`)) return true;\n if (field.relationCoModelFieldName) {\n if (Object.prototype.hasOwnProperty.call(dto, `${field.relationCoModelFieldName}Ids`)) return true;\n if (Object.prototype.hasOwnProperty.call(dto, `${field.relationCoModelFieldName}Command`)) return true;\n }\n return false;\n }\n\n private buildNewVersionPayload<T extends CommonEntity>(\n repo: SolidBaseRepository<T>,\n sourceEntity: T,\n relationNames: string[],\n ): any {\n const newVersionPayload: any = {};\n const excludedColumns = new Set([\n 'id',\n 'createdAt',\n 'updatedAt',\n 'deletedAt',\n 'createdBy',\n 'updatedBy',\n 'publishedAt',\n ...DRAFT_PUBLISH_VERSIONING_FIELD_NAMES,\n ]);\n\n repo.metadata.columns.forEach(column => {\n if (!excludedColumns.has(column.propertyName)) {\n newVersionPayload[column.propertyName] = sourceEntity[column.propertyName];\n }\n });\n\n for (const relationName of relationNames) {\n newVersionPayload[relationName] = sourceEntity[relationName];\n }\n\n return newVersionPayload;\n }\n\n private async cloneMediaForVersion<T extends CommonEntity>(\n context: DraftPublishCrudContext<T>,\n model: ModelMetadata,\n sourceEntityId: number,\n targetEntity: T,\n files: Express.Multer.File[] = [],\n entityManager?: EntityManager,\n ): Promise<void> {\n const mediaFields = model.fields.filter(field => field.type === SolidFieldType.mediaSingle || field.type === SolidFieldType.mediaMultiple);\n if (mediaFields.length === 0) return;\n\n const uploadedFieldNames = new Set(files.map(file => file.fieldname));\n const clonableFieldIds = mediaFields\n .filter(field => !uploadedFieldNames.has(field.name))\n .map(field => field.id);\n if (clonableFieldIds.length === 0) return;\n\n const mediaRepository = (entityManager ?? context.getDatasourceDefaultEntityManager()).getRepository(Media);\n\n // One query for every clonable media field instead of one query per field.\n const sourceMedia = await mediaRepository.find({\n where: {\n entityId: sourceEntityId,\n modelMetadata: { id: model.id },\n fieldMetadata: { id: In(clonableFieldIds) },\n } as any,\n relations: {\n modelMetadata: true,\n mediaStorageProviderMetadata: true,\n fieldMetadata: true,\n } as any,\n });\n if (sourceMedia.length === 0) return;\n\n // Reuse the same underlying file across versions instead of physically duplicating it\n // in storage; MediaService.deletePhysicalFile guards against removing the file while\n // another Media row still references it. Saved as a single batch instead of one insert\n // per row.\n const clonedMedia = sourceMedia.map(media => mediaRepository.create({\n entityId: targetEntity.id,\n relativeUri: media.relativeUri,\n fileSize: media.fileSize,\n mimeType: media.mimeType,\n originalFileName: media.originalFileName,\n modelMetadata: media.modelMetadata,\n mediaStorageProviderMetadata: media.mediaStorageProviderMetadata,\n fieldMetadata: media.fieldMetadata,\n }));\n await mediaRepository.save(clonedMedia);\n }\n\n private createPublishedVersionTracker(seed: number | string): string {\n return `version:${seed}`;\n }\n\n private createTemporaryPublishedVersionTracker(): string {\n return `version:pending:${Date.now()}:${Math.random().toString(36).slice(2)}`;\n }\n}\n"]}
@@ -197,14 +197,42 @@ declare const getSolidCoreSettings: (isProd: boolean) => [{
197
197
  readonly helpText: "Privacy policy URL shown when legal links are enabled.";
198
198
  }, {
199
199
  readonly moduleName: "solid-core";
200
- readonly key: "enableDarkMode";
200
+ readonly key: "showThemeToggle";
201
201
  readonly value: true;
202
202
  readonly level: SettingLevel.SystemAdminEditable;
203
- readonly label: "Enable Dark Mode";
203
+ readonly label: "Show Theme Toggle";
204
204
  readonly group: "app-settings";
205
205
  readonly sortOrder: 120;
206
206
  readonly controlType: "boolean";
207
- readonly helpText: "Enables dark theme support for frontend surfaces that honor the global appearance setting.";
207
+ readonly helpText: "Shows the theme toggle in the frontend so users can switch between light and dark themes.";
208
+ }, {
209
+ readonly moduleName: "solid-core";
210
+ readonly key: "lightTheme";
211
+ readonly value: string;
212
+ readonly level: SettingLevel.SystemAdminEditable;
213
+ readonly label: "Light Theme";
214
+ readonly group: "app-settings";
215
+ readonly sortOrder: 125;
216
+ readonly controlType: "selectionStatic";
217
+ readonly options: {
218
+ label: string;
219
+ value: string;
220
+ }[];
221
+ readonly helpText: "Selects the theme used whenever the application is in light mode.";
222
+ }, {
223
+ readonly moduleName: "solid-core";
224
+ readonly key: "darkTheme";
225
+ readonly value: string;
226
+ readonly level: SettingLevel.SystemAdminEditable;
227
+ readonly label: "Dark Theme";
228
+ readonly group: "app-settings";
229
+ readonly sortOrder: 126;
230
+ readonly controlType: "selectionStatic";
231
+ readonly options: {
232
+ label: string;
233
+ value: string;
234
+ }[];
235
+ readonly helpText: "Selects the theme used whenever the application is in dark mode.";
208
236
  }, {
209
237
  readonly moduleName: "solid-core";
210
238
  readonly key: "copyright";
@@ -1496,14 +1524,42 @@ export declare class SolidCoreDefaultSettingsProvider implements ISettingsProvid
1496
1524
  readonly helpText: "Privacy policy URL shown when legal links are enabled.";
1497
1525
  }, {
1498
1526
  readonly moduleName: "solid-core";
1499
- readonly key: "enableDarkMode";
1527
+ readonly key: "showThemeToggle";
1500
1528
  readonly value: true;
1501
1529
  readonly level: SettingLevel.SystemAdminEditable;
1502
- readonly label: "Enable Dark Mode";
1530
+ readonly label: "Show Theme Toggle";
1503
1531
  readonly group: "app-settings";
1504
1532
  readonly sortOrder: 120;
1505
1533
  readonly controlType: "boolean";
1506
- readonly helpText: "Enables dark theme support for frontend surfaces that honor the global appearance setting.";
1534
+ readonly helpText: "Shows the theme toggle in the frontend so users can switch between light and dark themes.";
1535
+ }, {
1536
+ readonly moduleName: "solid-core";
1537
+ readonly key: "lightTheme";
1538
+ readonly value: string;
1539
+ readonly level: SettingLevel.SystemAdminEditable;
1540
+ readonly label: "Light Theme";
1541
+ readonly group: "app-settings";
1542
+ readonly sortOrder: 125;
1543
+ readonly controlType: "selectionStatic";
1544
+ readonly options: {
1545
+ label: string;
1546
+ value: string;
1547
+ }[];
1548
+ readonly helpText: "Selects the theme used whenever the application is in light mode.";
1549
+ }, {
1550
+ readonly moduleName: "solid-core";
1551
+ readonly key: "darkTheme";
1552
+ readonly value: string;
1553
+ readonly level: SettingLevel.SystemAdminEditable;
1554
+ readonly label: "Dark Theme";
1555
+ readonly group: "app-settings";
1556
+ readonly sortOrder: 126;
1557
+ readonly controlType: "selectionStatic";
1558
+ readonly options: {
1559
+ label: string;
1560
+ value: string;
1561
+ }[];
1562
+ readonly helpText: "Selects the theme used whenever the application is in dark mode.";
1507
1563
  }, {
1508
1564
  readonly moduleName: "solid-core";
1509
1565
  readonly key: "copyright";
@@ -1 +1 @@
1
- {"version":3,"file":"default-settings-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/settings/default-settings-provider.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"default-settings-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/settings/default-settings-provider.service.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ const common_1 = require("@nestjs/common");
11
11
  const disallow_in_production_decorator_1 = require("../../decorators/disallow-in-production.decorator");
12
12
  const settings_provider_decorator_1 = require("../../decorators/settings-provider.decorator");
13
13
  const interfaces_1 = require("../../interfaces");
14
+ const theme_registry_1 = require("../../theme/theme-registry");
14
15
  exports.DEFAULT_MEDIA_UPLOAD_DIR = "media-uploads";
15
16
  exports.DEFAULT_MEDIA_FILE_STORAGE_DIR = "media-files-storage";
16
17
  const timeoutFromEnv = (value, fallback) => {
@@ -220,14 +221,44 @@ const getSolidCoreSettings = (isProd) => [
220
221
  },
221
222
  {
222
223
  moduleName: "solid-core",
223
- key: "enableDarkMode",
224
+ key: "showThemeToggle",
224
225
  value: true,
225
226
  level: interfaces_1.SettingLevel.SystemAdminEditable,
226
- label: "Enable Dark Mode",
227
+ label: "Show Theme Toggle",
227
228
  group: "app-settings",
228
229
  sortOrder: 120,
229
230
  controlType: "boolean",
230
- helpText: "Enables dark theme support for frontend surfaces that honor the global appearance setting.",
231
+ helpText: "Shows the theme toggle in the frontend so users can switch between light and dark themes.",
232
+ },
233
+ {
234
+ moduleName: "solid-core",
235
+ key: "lightTheme",
236
+ value: (0, theme_registry_1.getDefaultThemeKey)("light"),
237
+ level: interfaces_1.SettingLevel.SystemAdminEditable,
238
+ label: "Light Theme",
239
+ group: "app-settings",
240
+ sortOrder: 125,
241
+ controlType: "selectionStatic",
242
+ options: (0, theme_registry_1.getThemesByMode)("light").map((theme) => ({
243
+ label: theme.label,
244
+ value: theme.key,
245
+ })),
246
+ helpText: "Selects the theme used whenever the application is in light mode.",
247
+ },
248
+ {
249
+ moduleName: "solid-core",
250
+ key: "darkTheme",
251
+ value: (0, theme_registry_1.getDefaultThemeKey)("dark"),
252
+ level: interfaces_1.SettingLevel.SystemAdminEditable,
253
+ label: "Dark Theme",
254
+ group: "app-settings",
255
+ sortOrder: 126,
256
+ controlType: "selectionStatic",
257
+ options: (0, theme_registry_1.getThemesByMode)("dark").map((theme) => ({
258
+ label: theme.label,
259
+ value: theme.key,
260
+ })),
261
+ helpText: "Selects the theme used whenever the application is in dark mode.",
231
262
  },
232
263
  {
233
264
  moduleName: "solid-core",