@solidxai/core 0.1.13 → 0.1.14

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 (43) hide show
  1. package/CHANGELOG.md +2373 -0
  2. package/dist/constants/media-file-types.d.ts +14 -0
  3. package/dist/constants/media-file-types.d.ts.map +1 -1
  4. package/dist/constants/media-file-types.js +83 -15
  5. package/dist/constants/media-file-types.js.map +1 -1
  6. package/dist/controllers/field-metadata.controller.d.ts +4 -0
  7. package/dist/controllers/field-metadata.controller.d.ts.map +1 -1
  8. package/dist/controllers/view-metadata.controller.d.ts +4 -0
  9. package/dist/controllers/view-metadata.controller.d.ts.map +1 -1
  10. package/dist/helpers/field-crud-managers/LongTextFieldCrudManager.d.ts.map +1 -1
  11. package/dist/helpers/field-crud-managers/LongTextFieldCrudManager.js +3 -2
  12. package/dist/helpers/field-crud-managers/LongTextFieldCrudManager.js.map +1 -1
  13. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +2 -0
  14. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  15. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +10 -52
  16. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  17. package/dist/helpers/field-crud-managers/ShortTextFieldCrudManager.d.ts.map +1 -1
  18. package/dist/helpers/field-crud-managers/ShortTextFieldCrudManager.js +3 -2
  19. package/dist/helpers/field-crud-managers/ShortTextFieldCrudManager.js.map +1 -1
  20. package/dist/helpers/field-crud-managers/textFieldCrudManagerUtils.d.ts +3 -0
  21. package/dist/helpers/field-crud-managers/textFieldCrudManagerUtils.d.ts.map +1 -0
  22. package/dist/helpers/field-crud-managers/textFieldCrudManagerUtils.js +17 -0
  23. package/dist/helpers/field-crud-managers/textFieldCrudManagerUtils.js.map +1 -0
  24. package/dist/services/crud.service.d.ts.map +1 -1
  25. package/dist/services/crud.service.js +2 -1
  26. package/dist/services/crud.service.js.map +1 -1
  27. package/dist/services/field-metadata.service.d.ts +4 -0
  28. package/dist/services/field-metadata.service.d.ts.map +1 -1
  29. package/dist/services/field-metadata.service.js +1 -0
  30. package/dist/services/field-metadata.service.js.map +1 -1
  31. package/dist/services/view-metadata.service.d.ts +4 -0
  32. package/dist/services/view-metadata.service.d.ts.map +1 -1
  33. package/dist/services/view-metadata.service.js +2 -0
  34. package/dist/services/view-metadata.service.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/constants/media-file-types.ts +95 -10
  37. package/src/helpers/field-crud-managers/LongTextFieldCrudManager.ts +3 -2
  38. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +12 -64
  39. package/src/helpers/field-crud-managers/ShortTextFieldCrudManager.ts +3 -2
  40. package/src/helpers/field-crud-managers/textFieldCrudManagerUtils.ts +14 -0
  41. package/src/services/crud.service.ts +2 -1
  42. package/src/services/field-metadata.service.ts +2 -1
  43. package/src/services/view-metadata.service.ts +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"view-metadata.service.js","sourceRoot":"","sources":["../../src/services/view-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { EntityManager } from 'typeorm';\n\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { ViewMetadataRepository } from 'src/repository/view-metadata.repository';\nimport { UpdateViewMetadataDto } from '../dtos/update-view-metadata.dto';\nimport { FieldMetadata } from '../entities/field-metadata.entity';\nimport { ViewMetadata } from '../entities/view-metadata.entity';\nimport { ActionMetadataService } from './action-metadata.service';\nimport { MenuItemMetadataService } from './menu-item-metadata.service';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { UserViewMetadataService } from './user-view-metadata.service';\nimport { MenuItemMetadata } from 'src/entities/menu-item-metadata.entity';\nimport { IWorkflowFieldDataProviderValues } from 'src/interfaces';\n\n@Injectable()\nexport class ViewMetadataService extends CRUDService<ViewMetadata> {\n private readonly comparableFields = [\n 'name',\n 'displayName',\n 'type',\n 'context',\n 'layout',\n 'module',\n 'model',\n ] as const;\n private readonly relationCompareFields = new Set(['module', 'model']);\n private readonly jsonCompareFields = new Set(['layout', 'context']);\n\n private normalizeJsonFieldValue(value: any): any {\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n if (\n (trimmedValue.startsWith('{') && trimmedValue.endsWith('}')) ||\n (trimmedValue.startsWith('[') && trimmedValue.endsWith(']'))\n ) {\n try {\n return this.normalizeJsonFieldValue(JSON.parse(trimmedValue));\n } catch {\n return value;\n }\n }\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeJsonFieldValue(item));\n }\n\n if (value && typeof value === 'object') {\n return Object.keys(value)\n .sort()\n .reduce((result, key) => {\n result[key] = this.normalizeJsonFieldValue(value[key]);\n return result;\n }, {} as Record<string, any>);\n }\n\n return value;\n }\n\n private getCanonicalJsonFieldString(value: any): string {\n return JSON.stringify(this.normalizeJsonFieldValue(value) ?? null);\n }\n\n private hasChanges(existingSolidView: ViewMetadata, updateSolidViewDto: UpdateViewMetadataDto): boolean {\n return this.comparableFields.some((key) => {\n const value = (updateSolidViewDto as any)[key];\n if (typeof value === 'undefined') {\n return false;\n }\n\n if (this.relationCompareFields.has(key)) {\n const relationValue = value as any;\n return (existingSolidView as any)[key]?.id !== relationValue?.id;\n }\n\n if (this.jsonCompareFields.has(key)) {\n return this.getCanonicalJsonFieldString((existingSolidView as any)[key]) !== this.getCanonicalJsonFieldString(value);\n }\n\n return (existingSolidView as any)[key] !== value;\n });\n }\n\n constructor(\n readonly actionMetadataService: ActionMetadataService,\n readonly menuItemMetadataService: MenuItemMetadataService,\n readonly introspectService: SolidIntrospectService,\n readonly userViewMetadataService: UserViewMetadataService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ViewMetadata, 'default')\n readonly repo: ViewMetadataRepository,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n readonly moduleRef: ModuleRef\n ) {\n super(entityManager, repo, 'viewMetadata', 'solid-core', moduleRef);\n }\n\n private readonly logger = new Logger(ViewMetadataService.name);\n\n private parseJsonObject(value: any): Record<string, any> {\n if (!value) {\n return {};\n }\n\n if (typeof value === 'object') {\n return value;\n }\n\n if (typeof value === 'string') {\n try {\n return JSON.parse(value);\n } catch (error: any) {\n this.logger.warn(`Unable to parse workflow field provider context: ${error?.message ?? error}`);\n }\n }\n\n return {};\n }\n\n private async getDefaultWorkflowFieldData(\n workflowField: FieldMetadata,\n workflowFieldName: string,\n fieldsMap: Map<string, FieldMetadata>,\n ): Promise<IWorkflowFieldDataProviderValues[]> {\n if (workflowField.type === 'selectionStatic') {\n return workflowField.selectionStaticValues.map(item => {\n const [value, label] = item.split(\":\");\n return { label, value };\n });\n }\n\n if (workflowField.type === 'relation' && workflowField.relationType === 'many-to-one') {\n const comodelCrudService = this.introspectService.getCRUDService(workflowField.relationCoModelSingularName);\n const data = await comodelCrudService.find({ limit: 100, offset: 0, });\n const records = data.records ?? [];\n const workflowFieldMetadata = fieldsMap.get(workflowFieldName);\n const workflowFieldUserKey = (workflowFieldMetadata as any)?.relationModel?.userKeyField?.name;\n\n if (!workflowFieldUserKey) {\n this.logger.warn(`Unable to identify relation user key for workflow field: ${workflowFieldName}`);\n return [];\n }\n\n return records.map(item => ({ label: item[workflowFieldUserKey], value: item['id'] }));\n }\n\n return [];\n }\n\n private async getWorkflowFieldData(\n entity: ViewMetadata,\n workflowField: FieldMetadata,\n workflowFieldName: string,\n fieldsMap: Map<string, FieldMetadata>,\n query: Record<string, any>,\n activeUser: any,\n ): Promise<readonly IWorkflowFieldDataProviderValues[]> {\n const workflowFieldDataProviderName = entity.layout?.attrs?.workflowFieldDataProvider;\n if (workflowFieldDataProviderName) {\n const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });\n const provider = solidRegistry.getWorkflowFieldDataProviderInstance(workflowFieldDataProviderName);\n if (!provider) {\n throw new BadRequestException(`Workflow field data provider ${workflowFieldDataProviderName} not found`);\n }\n\n return provider.values({\n entityId: query?.id,\n modelName: entity.model?.singularName ?? query?.modelName,\n moduleName: entity.module?.name ?? query?.moduleName,\n workflowFieldName,\n workflowField,\n solidModel: entity.model,\n solidView: entity,\n solidFieldsMetadata: Object.fromEntries(fieldsMap),\n query,\n providerContext: this.parseJsonObject(entity.layout?.attrs?.workflowFieldDataProviderCtxt),\n activeUser,\n });\n }\n\n return this.getDefaultWorkflowFieldData(workflowField, workflowFieldName, fieldsMap);\n }\n\n // START: Custom Service Methods\n async getLayout(query, activeUser) {\n let { modelName, moduleName, viewType, id, populate, menuItemId, menuItemName, actionId, actionName } = query;\n\n // 1. Fetch the action based on actionId.\n const solidRequestContext = {\n activeUser: activeUser\n }\n const actionQuery = {\n populate: [\"view\"]\n }\n let action = null;\n if (actionId) {\n action = await this.actionMetadataService.findOne(actionId, actionQuery, solidRequestContext);\n }\n\n // 2. Fetch the menu based on menuItemId.\n const menuItemQuery = {\n populate: ['action', 'action.model', 'module']\n }\n let menuItem: MenuItemMetadata = null;\n if (menuItemId) {\n menuItem = await this.menuItemMetadataService.findOne(menuItemId, menuItemQuery, solidRequestContext);\n }\n\n let viewModes = [];\n const menuItemModelId = menuItem?.action?.model?.id;\n const menuItemModuleId = menuItem?.module?.id;\n const collectionViewTypes = ['card', 'list', 'kanban', 'tree'];\n if (menuItemModelId && menuItemModuleId) {\n const actionQb = await this.actionMetadataService.repo.createSecurityRuleAwareQueryBuilder('action');\n const actionsForViewModes = await actionQb\n .leftJoinAndSelect('action.model', 'model')\n .leftJoinAndSelect('action.module', 'module')\n .leftJoinAndSelect('action.view', 'view')\n .where('model.id = :modelId', { modelId: menuItemModelId })\n .andWhere('module.id = :moduleId', { moduleId: menuItemModuleId })\n .andWhere('view.type IN (:...viewTypes)', { viewTypes: collectionViewTypes })\n .getMany();\n\n const canonicalActionsByViewType = new Map();\n for (const actionItem of actionsForViewModes) {\n const resolvedViewType = actionItem.view?.type;\n if (!resolvedViewType || canonicalActionsByViewType.has(resolvedViewType)) {\n continue;\n }\n canonicalActionsByViewType.set(resolvedViewType, actionItem);\n }\n\n if (action?.view?.type && collectionViewTypes.includes(action.view.type) && action?.id) {\n canonicalActionsByViewType.set(action.view.type, action);\n }\n\n viewModes = collectionViewTypes\n .map((resolvedViewType) => canonicalActionsByViewType.get(resolvedViewType))\n .filter(Boolean)\n .map(actionItem => ({\n type: actionItem.view?.type ?? '',\n menuItemId: menuItem.id,\n menuItemName: menuItem.displayName,\n actionId: actionItem.id ?? '',\n actionName: actionItem.displayName ?? '',\n }));\n }\n\n const viewId = action?.view?.id\n // 3. Fetch the view based on module, model & view name.\n const entity = await this.repo.findOne({\n where: {\n model: { singularName: modelName },\n module: { name: moduleName },\n ...(actionId && viewId ? { id: action.view.id } : { type: viewType })\n },\n relations: {\n model: {\n userKeyField: true,\n },\n module: true,\n }\n });\n\n if (!entity) {\n throw new BadRequestException(`Unable to identify view for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);\n }\n if (!activeUser?.sub) {\n throw new BadRequestException(`Unable to identify user for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);\n }\n\n // 4. add action and menuItem to Entity which is our solid View\n if (actionId) {\n delete action.view;\n entity['action'] = action\n }\n if (menuItemId) {\n entity['menu'] = menuItem\n }\n\n // 5. See if we have a user specific layout for this view.\n const userLayout = await this.userViewMetadataService.repo.findOne({\n where: {\n user: { id: activeUser?.sub },\n viewMetadata: { id: entity.id },\n },\n });\n // Based on where we found the layout we are converting it from string to json.\n if (userLayout) {\n entity.layout = JSON.parse(userLayout.layout);\n } else {\n entity.layout = JSON.parse(entity.layout);\n }\n\n // 6. We are resolving the create & edit actions if specified in the layout.\n if (entity?.layout?.attrs?.createAction) {\n const actionName: string = entity.layout.attrs.createAction;\n entity.layout.attrs.createAction = await this.actionMetadataService.findOneByUserKey(actionName)\n }\n if (entity?.layout?.attrs?.editAction) {\n const actionName: string = entity.layout.attrs.editAction;\n entity.layout.attrs.editAction = await this.actionMetadataService.findOneByUserKey(actionName)\n }\n\n // 7. For form views we need to fetch the workflow field metadata if specified.\n let workflowFieldName = null;\n let workflowField = null;\n if (viewType === 'form') {\n workflowFieldName = entity.layout?.attrs?.workflowField;\n }\n\n // 8. Create an easy to use map of field metadata, rather than sending an array of fields it becomes easier to use in the frontend.\n const fields = await this.modelMetadataHelperService.loadFieldHierarchy(modelName);\n const fieldsMap = new Map<string, FieldMetadata>();\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n\n // We need to identify the workflowField metadata if specified. \n if (workflowFieldName && field.name === workflowFieldName) {\n workflowField = field;\n }\n\n // For fields of type relation & relationType many-to-one\n // We fetch metadata regarding the relationCoModelSingularName\n if (field.type === 'relation') {\n const relationModel = await this.modelMetadataRepo.find({\n where: {\n singularName: field.relationCoModelSingularName\n },\n relations: {\n userKeyField: true\n }\n });\n\n if (relationModel) {\n field['relationModel'] = relationModel[0];\n }\n }\n if (!fieldsMap.has(field.name)) {\n fieldsMap.set(field.name, field);\n }\n }\n\n // 9. Use the resolved workflowField to populate workflow specific metadata.\n let solidFormViewWorkflowData: readonly IWorkflowFieldDataProviderValues[] = [];\n if (viewType === 'form' && workflowField) {\n solidFormViewWorkflowData = await this.getWorkflowFieldData(entity, workflowField, workflowFieldName, fieldsMap, query, activeUser);\n }\n\n // 10. If this model supports internationalisation, we need to load the locales applicable with the id of an actual record for each locale if present.\n // This is the shape of locales that will be returned \n /**\n * [\n * {locale: 'en', displayName: 'English', isDefault: 'yes', defaultEntityLocaleId: '', entityId: '1'}, \n * {locale: 'en-IN', displayName: 'English (India)', isDefault: 'no', defaultEntityLocaleId: '1', entityId: '2'}, \n * {locale: 'en-SG', displayName: 'English (Singapore)', isDefault: 'no', defaultEntityLocaleId: '', entityId: '3'}, \n * {locale: 'fr', displayName: 'French', isDefault: 'no', defaultEntityLocaleId: '', entityId: ''}\n * ]\n */\n\n let applicableLocales: any[] = [];\n if (entity.model.internationalisation) {\n const draftPublishEnabled = entity.model.draftPublishWorkflow === true;\n applicableLocales = await this.internationalisationHelperService.buildApplicableLocales(\n this.entityManager, modelName, id, query?.defaultEntityLocaleId, draftPublishEnabled,\n );\n }\n\n const r = {\n 'solidView': entity,\n 'solidFieldsMetadata': Object.fromEntries(fieldsMap),\n 'solidFormViewWorkflowData': solidFormViewWorkflowData,\n 'applicableLocales': applicableLocales,\n 'viewModes': viewModes\n }\n\n return r;\n }\n\n private async loadFieldHierarchy(modelName: any) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: modelName,\n },\n relations: {\n fields: true,\n parentModel: {\n fields: true,\n }\n }\n });\n const fields = [];\n if (model) {\n // Add the fields of the current model\n fields.push(...model.fields);\n\n // Add the fields of the parent model\n if (model.parentModel) {\n fields.push(...model.parentModel.fields);\n }\n }\n return fields;\n }\n\n async findOneByUserKey(name: string, relations = {}) {\n const entity = await this.repo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async upsert(updateSolidViewDto: UpdateViewMetadataDto) {\n // First check if module already exists using name\n const existingSolidView = await this.findOneByUserKey(updateSolidViewDto.name, {\n module: true,\n model: true,\n });\n\n // if found\n if (existingSolidView) {\n const hasChanges = this.hasChanges(existingSolidView, updateSolidViewDto);\n\n if (!hasChanges) {\n this.logger.debug(`Skipping view upsert for ${updateSolidViewDto.name}; no changes detected.`);\n return existingSolidView;\n }\n\n const updatedSolidViewDto = { ...existingSolidView, ...updateSolidViewDto };\n return this.repo.save(updatedSolidViewDto);\n }\n // if not found - create new \n else {\n const viewData = this.repo.create(updateSolidViewDto);\n return this.repo.save(viewData);\n }\n }\n\n async createIfNotPresent(updateSolidViewDto: UpdateViewMetadataDto) {\n // First check if module already exists using name\n const existingSolidView = await this.findOneByUserKey(updateSolidViewDto.name);\n\n // if found\n if (existingSolidView) {\n }\n // if not found - create new \n else {\n const viewData = this.repo.create(updateSolidViewDto);\n return this.repo.save(viewData);\n }\n }\n\n // END: Custom Service Methods\n\n}\n"]}
1
+ {"version":3,"file":"view-metadata.service.js","sourceRoot":"","sources":["../../src/services/view-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { EntityManager } from 'typeorm';\n\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { SolidRegistry } from 'src/helpers/solid-registry';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { ViewMetadataRepository } from 'src/repository/view-metadata.repository';\nimport { UpdateViewMetadataDto } from '../dtos/update-view-metadata.dto';\nimport { FieldMetadata } from '../entities/field-metadata.entity';\nimport { ViewMetadata } from '../entities/view-metadata.entity';\nimport { ActionMetadataService } from './action-metadata.service';\nimport { MenuItemMetadataService } from './menu-item-metadata.service';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { UserViewMetadataService } from './user-view-metadata.service';\nimport { MenuItemMetadata } from 'src/entities/menu-item-metadata.entity';\nimport { IWorkflowFieldDataProviderValues } from 'src/interfaces';\nimport { MEDIA_FILE_TYPES } from 'src/constants/media-file-types';\n\n@Injectable()\nexport class ViewMetadataService extends CRUDService<ViewMetadata> {\n private readonly comparableFields = [\n 'name',\n 'displayName',\n 'type',\n 'context',\n 'layout',\n 'module',\n 'model',\n ] as const;\n private readonly relationCompareFields = new Set(['module', 'model']);\n private readonly jsonCompareFields = new Set(['layout', 'context']);\n\n private normalizeJsonFieldValue(value: any): any {\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n if (\n (trimmedValue.startsWith('{') && trimmedValue.endsWith('}')) ||\n (trimmedValue.startsWith('[') && trimmedValue.endsWith(']'))\n ) {\n try {\n return this.normalizeJsonFieldValue(JSON.parse(trimmedValue));\n } catch {\n return value;\n }\n }\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeJsonFieldValue(item));\n }\n\n if (value && typeof value === 'object') {\n return Object.keys(value)\n .sort()\n .reduce((result, key) => {\n result[key] = this.normalizeJsonFieldValue(value[key]);\n return result;\n }, {} as Record<string, any>);\n }\n\n return value;\n }\n\n private getCanonicalJsonFieldString(value: any): string {\n return JSON.stringify(this.normalizeJsonFieldValue(value) ?? null);\n }\n\n private hasChanges(existingSolidView: ViewMetadata, updateSolidViewDto: UpdateViewMetadataDto): boolean {\n return this.comparableFields.some((key) => {\n const value = (updateSolidViewDto as any)[key];\n if (typeof value === 'undefined') {\n return false;\n }\n\n if (this.relationCompareFields.has(key)) {\n const relationValue = value as any;\n return (existingSolidView as any)[key]?.id !== relationValue?.id;\n }\n\n if (this.jsonCompareFields.has(key)) {\n return this.getCanonicalJsonFieldString((existingSolidView as any)[key]) !== this.getCanonicalJsonFieldString(value);\n }\n\n return (existingSolidView as any)[key] !== value;\n });\n }\n\n constructor(\n readonly actionMetadataService: ActionMetadataService,\n readonly menuItemMetadataService: MenuItemMetadataService,\n readonly introspectService: SolidIntrospectService,\n readonly userViewMetadataService: UserViewMetadataService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ViewMetadata, 'default')\n readonly repo: ViewMetadataRepository,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n readonly moduleRef: ModuleRef\n ) {\n super(entityManager, repo, 'viewMetadata', 'solid-core', moduleRef);\n }\n\n private readonly logger = new Logger(ViewMetadataService.name);\n\n private parseJsonObject(value: any): Record<string, any> {\n if (!value) {\n return {};\n }\n\n if (typeof value === 'object') {\n return value;\n }\n\n if (typeof value === 'string') {\n try {\n return JSON.parse(value);\n } catch (error: any) {\n this.logger.warn(`Unable to parse workflow field provider context: ${error?.message ?? error}`);\n }\n }\n\n return {};\n }\n\n private async getDefaultWorkflowFieldData(\n workflowField: FieldMetadata,\n workflowFieldName: string,\n fieldsMap: Map<string, FieldMetadata>,\n ): Promise<IWorkflowFieldDataProviderValues[]> {\n if (workflowField.type === 'selectionStatic') {\n return workflowField.selectionStaticValues.map(item => {\n const [value, label] = item.split(\":\");\n return { label, value };\n });\n }\n\n if (workflowField.type === 'relation' && workflowField.relationType === 'many-to-one') {\n const comodelCrudService = this.introspectService.getCRUDService(workflowField.relationCoModelSingularName);\n const data = await comodelCrudService.find({ limit: 100, offset: 0, });\n const records = data.records ?? [];\n const workflowFieldMetadata = fieldsMap.get(workflowFieldName);\n const workflowFieldUserKey = (workflowFieldMetadata as any)?.relationModel?.userKeyField?.name;\n\n if (!workflowFieldUserKey) {\n this.logger.warn(`Unable to identify relation user key for workflow field: ${workflowFieldName}`);\n return [];\n }\n\n return records.map(item => ({ label: item[workflowFieldUserKey], value: item['id'] }));\n }\n\n return [];\n }\n\n private async getWorkflowFieldData(\n entity: ViewMetadata,\n workflowField: FieldMetadata,\n workflowFieldName: string,\n fieldsMap: Map<string, FieldMetadata>,\n query: Record<string, any>,\n activeUser: any,\n ): Promise<readonly IWorkflowFieldDataProviderValues[]> {\n const workflowFieldDataProviderName = entity.layout?.attrs?.workflowFieldDataProvider;\n if (workflowFieldDataProviderName) {\n const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });\n const provider = solidRegistry.getWorkflowFieldDataProviderInstance(workflowFieldDataProviderName);\n if (!provider) {\n throw new BadRequestException(`Workflow field data provider ${workflowFieldDataProviderName} not found`);\n }\n\n return provider.values({\n entityId: query?.id,\n modelName: entity.model?.singularName ?? query?.modelName,\n moduleName: entity.module?.name ?? query?.moduleName,\n workflowFieldName,\n workflowField,\n solidModel: entity.model,\n solidView: entity,\n solidFieldsMetadata: Object.fromEntries(fieldsMap),\n query,\n providerContext: this.parseJsonObject(entity.layout?.attrs?.workflowFieldDataProviderCtxt),\n activeUser,\n });\n }\n\n return this.getDefaultWorkflowFieldData(workflowField, workflowFieldName, fieldsMap);\n }\n\n // START: Custom Service Methods\n async getLayout(query, activeUser) {\n let { modelName, moduleName, viewType, id, populate, menuItemId, menuItemName, actionId, actionName } = query;\n\n // 1. Fetch the action based on actionId.\n const solidRequestContext = {\n activeUser: activeUser\n }\n const actionQuery = {\n populate: [\"view\"]\n }\n let action = null;\n if (actionId) {\n action = await this.actionMetadataService.findOne(actionId, actionQuery, solidRequestContext);\n }\n\n // 2. Fetch the menu based on menuItemId.\n const menuItemQuery = {\n populate: ['action', 'action.model', 'module']\n }\n let menuItem: MenuItemMetadata = null;\n if (menuItemId) {\n menuItem = await this.menuItemMetadataService.findOne(menuItemId, menuItemQuery, solidRequestContext);\n }\n\n let viewModes = [];\n const menuItemModelId = menuItem?.action?.model?.id;\n const menuItemModuleId = menuItem?.module?.id;\n const collectionViewTypes = ['card', 'list', 'kanban', 'tree'];\n if (menuItemModelId && menuItemModuleId) {\n const actionQb = await this.actionMetadataService.repo.createSecurityRuleAwareQueryBuilder('action');\n const actionsForViewModes = await actionQb\n .leftJoinAndSelect('action.model', 'model')\n .leftJoinAndSelect('action.module', 'module')\n .leftJoinAndSelect('action.view', 'view')\n .where('model.id = :modelId', { modelId: menuItemModelId })\n .andWhere('module.id = :moduleId', { moduleId: menuItemModuleId })\n .andWhere('view.type IN (:...viewTypes)', { viewTypes: collectionViewTypes })\n .getMany();\n\n const canonicalActionsByViewType = new Map();\n for (const actionItem of actionsForViewModes) {\n const resolvedViewType = actionItem.view?.type;\n if (!resolvedViewType || canonicalActionsByViewType.has(resolvedViewType)) {\n continue;\n }\n canonicalActionsByViewType.set(resolvedViewType, actionItem);\n }\n\n if (action?.view?.type && collectionViewTypes.includes(action.view.type) && action?.id) {\n canonicalActionsByViewType.set(action.view.type, action);\n }\n\n viewModes = collectionViewTypes\n .map((resolvedViewType) => canonicalActionsByViewType.get(resolvedViewType))\n .filter(Boolean)\n .map(actionItem => ({\n type: actionItem.view?.type ?? '',\n menuItemId: menuItem.id,\n menuItemName: menuItem.displayName,\n actionId: actionItem.id ?? '',\n actionName: actionItem.displayName ?? '',\n }));\n }\n\n const viewId = action?.view?.id\n // 3. Fetch the view based on module, model & view name.\n const entity = await this.repo.findOne({\n where: {\n model: { singularName: modelName },\n module: { name: moduleName },\n ...(actionId && viewId ? { id: action.view.id } : { type: viewType })\n },\n relations: {\n model: {\n userKeyField: true,\n },\n module: true,\n }\n });\n\n if (!entity) {\n throw new BadRequestException(`Unable to identify view for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);\n }\n if (!activeUser?.sub) {\n throw new BadRequestException(`Unable to identify user for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);\n }\n\n // 4. add action and menuItem to Entity which is our solid View\n if (actionId) {\n delete action.view;\n entity['action'] = action\n }\n if (menuItemId) {\n entity['menu'] = menuItem\n }\n\n // 5. See if we have a user specific layout for this view.\n const userLayout = await this.userViewMetadataService.repo.findOne({\n where: {\n user: { id: activeUser?.sub },\n viewMetadata: { id: entity.id },\n },\n });\n // Based on where we found the layout we are converting it from string to json.\n if (userLayout) {\n entity.layout = JSON.parse(userLayout.layout);\n } else {\n entity.layout = JSON.parse(entity.layout);\n }\n\n // 6. We are resolving the create & edit actions if specified in the layout.\n if (entity?.layout?.attrs?.createAction) {\n const actionName: string = entity.layout.attrs.createAction;\n entity.layout.attrs.createAction = await this.actionMetadataService.findOneByUserKey(actionName)\n }\n if (entity?.layout?.attrs?.editAction) {\n const actionName: string = entity.layout.attrs.editAction;\n entity.layout.attrs.editAction = await this.actionMetadataService.findOneByUserKey(actionName)\n }\n\n // 7. For form views we need to fetch the workflow field metadata if specified.\n let workflowFieldName = null;\n let workflowField = null;\n if (viewType === 'form') {\n workflowFieldName = entity.layout?.attrs?.workflowField;\n }\n\n // 8. Create an easy to use map of field metadata, rather than sending an array of fields it becomes easier to use in the frontend.\n const fields = await this.modelMetadataHelperService.loadFieldHierarchy(modelName);\n const fieldsMap = new Map<string, FieldMetadata>();\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n\n // We need to identify the workflowField metadata if specified. \n if (workflowFieldName && field.name === workflowFieldName) {\n workflowField = field;\n }\n\n // For fields of type relation & relationType many-to-one\n // We fetch metadata regarding the relationCoModelSingularName\n if (field.type === 'relation') {\n const relationModel = await this.modelMetadataRepo.find({\n where: {\n singularName: field.relationCoModelSingularName\n },\n relations: {\n userKeyField: true\n }\n });\n\n if (relationModel) {\n field['relationModel'] = relationModel[0];\n }\n }\n if (!fieldsMap.has(field.name)) {\n fieldsMap.set(field.name, field);\n }\n }\n\n // 9. Use the resolved workflowField to populate workflow specific metadata.\n let solidFormViewWorkflowData: readonly IWorkflowFieldDataProviderValues[] = [];\n if (viewType === 'form' && workflowField) {\n solidFormViewWorkflowData = await this.getWorkflowFieldData(entity, workflowField, workflowFieldName, fieldsMap, query, activeUser);\n }\n\n // 10. If this model supports internationalisation, we need to load the locales applicable with the id of an actual record for each locale if present.\n // This is the shape of locales that will be returned \n /**\n * [\n * {locale: 'en', displayName: 'English', isDefault: 'yes', defaultEntityLocaleId: '', entityId: '1'}, \n * {locale: 'en-IN', displayName: 'English (India)', isDefault: 'no', defaultEntityLocaleId: '1', entityId: '2'}, \n * {locale: 'en-SG', displayName: 'English (Singapore)', isDefault: 'no', defaultEntityLocaleId: '', entityId: '3'}, \n * {locale: 'fr', displayName: 'French', isDefault: 'no', defaultEntityLocaleId: '', entityId: ''}\n * ]\n */\n\n let applicableLocales: any[] = [];\n if (entity.model.internationalisation) {\n const draftPublishEnabled = entity.model.draftPublishWorkflow === true;\n applicableLocales = await this.internationalisationHelperService.buildApplicableLocales(\n this.entityManager, modelName, id, query?.defaultEntityLocaleId, draftPublishEnabled,\n );\n }\n\n const r = {\n 'solidView': entity,\n 'solidFieldsMetadata': Object.fromEntries(fieldsMap),\n // Reuse the form view payload for media picker filtering so the runtime widgets\n // can derive category-to-extension fallbacks without exposing unused MIME details.\n 'mediaFileTypeDefinitions': MEDIA_FILE_TYPES.map(({ mediaType, extension }) => ({ mediaType, extension })),\n 'solidFormViewWorkflowData': solidFormViewWorkflowData,\n 'applicableLocales': applicableLocales,\n 'viewModes': viewModes\n }\n\n return r;\n }\n\n private async loadFieldHierarchy(modelName: any) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: modelName,\n },\n relations: {\n fields: true,\n parentModel: {\n fields: true,\n }\n }\n });\n const fields = [];\n if (model) {\n // Add the fields of the current model\n fields.push(...model.fields);\n\n // Add the fields of the parent model\n if (model.parentModel) {\n fields.push(...model.parentModel.fields);\n }\n }\n return fields;\n }\n\n async findOneByUserKey(name: string, relations = {}) {\n const entity = await this.repo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async upsert(updateSolidViewDto: UpdateViewMetadataDto) {\n // First check if module already exists using name\n const existingSolidView = await this.findOneByUserKey(updateSolidViewDto.name, {\n module: true,\n model: true,\n });\n\n // if found\n if (existingSolidView) {\n const hasChanges = this.hasChanges(existingSolidView, updateSolidViewDto);\n\n if (!hasChanges) {\n this.logger.debug(`Skipping view upsert for ${updateSolidViewDto.name}; no changes detected.`);\n return existingSolidView;\n }\n\n const updatedSolidViewDto = { ...existingSolidView, ...updateSolidViewDto };\n return this.repo.save(updatedSolidViewDto);\n }\n // if not found - create new \n else {\n const viewData = this.repo.create(updateSolidViewDto);\n return this.repo.save(viewData);\n }\n }\n\n async createIfNotPresent(updateSolidViewDto: UpdateViewMetadataDto) {\n // First check if module already exists using name\n const existingSolidView = await this.findOneByUserKey(updateSolidViewDto.name);\n\n // if found\n if (existingSolidView) {\n }\n // if not found - create new \n else {\n const viewData = this.repo.create(updateSolidViewDto);\n return this.repo.save(viewData);\n }\n }\n\n // END: Custom Service Methods\n\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidxai/core",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "This module is a NestJS module containing all the required core providers required by a Solid application",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -2,11 +2,100 @@ export type MediaCategory = 'image' | 'audio' | 'video' | 'file' | 'pdf';
2
2
 
3
3
  export const MEDIA_CATEGORIES = ['image', 'audio', 'video', 'file', 'pdf'] as const;
4
4
 
5
- const IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'webp', 'gif', 'bmp', 'tiff', 'heic', 'heif'];
6
- const AUDIO_EXTENSIONS = ['mp3', 'wav', 'ogg', 'aac', 'm4a', 'flac', 'webm'];
7
- const VIDEO_EXTENSIONS = ['mp4', 'mov', 'avi', 'mkv', 'mpeg', 'mpg', '3gp', '3g2', 'webm', 'ogg'];
8
- const DOCUMENT_EXTENSIONS = ['txt', 'md', 'csv', 'json', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'zip', 'rar', '7z'];
9
- const PDF_EXTENSION = 'pdf';
5
+ export type MediaFileTypeDefinition = {
6
+ mediaType: MediaCategory;
7
+ mimeType: string;
8
+ extension: string;
9
+ };
10
+
11
+ // Single source of truth for every supported media extension, its canonical MIME type,
12
+ // and the coarse media category used across validation and UI metadata.
13
+ export const MEDIA_FILE_TYPES: MediaFileTypeDefinition[] = [
14
+ { mediaType: 'image', mimeType: 'image/png', extension: 'png' },
15
+ { mediaType: 'image', mimeType: 'image/jpeg', extension: 'jpg' },
16
+ { mediaType: 'image', mimeType: 'image/jpg', extension: 'jpg' },
17
+ { mediaType: 'image', mimeType: 'image/jpeg', extension: 'jpeg' },
18
+ { mediaType: 'image', mimeType: 'image/webp', extension: 'webp' },
19
+ { mediaType: 'image', mimeType: 'image/gif', extension: 'gif' },
20
+ { mediaType: 'image', mimeType: 'image/bmp', extension: 'bmp' },
21
+ { mediaType: 'image', mimeType: 'image/tiff', extension: 'tiff' },
22
+ { mediaType: 'image', mimeType: 'image/heic', extension: 'heic' },
23
+ { mediaType: 'image', mimeType: 'image/heif', extension: 'heif' },
24
+
25
+ { mediaType: 'audio', mimeType: 'audio/mpeg', extension: 'mp3' },
26
+ { mediaType: 'audio', mimeType: 'audio/mp3', extension: 'mp3' },
27
+ { mediaType: 'audio', mimeType: 'audio/wav', extension: 'wav' },
28
+ { mediaType: 'audio', mimeType: 'audio/x-wav', extension: 'wav' },
29
+ { mediaType: 'audio', mimeType: 'audio/ogg', extension: 'ogg' },
30
+ { mediaType: 'audio', mimeType: 'audio/aac', extension: 'aac' },
31
+ { mediaType: 'audio', mimeType: 'audio/mp4', extension: 'm4a' },
32
+ { mediaType: 'audio', mimeType: 'audio/x-m4a', extension: 'm4a' },
33
+ { mediaType: 'audio', mimeType: 'audio/flac', extension: 'flac' },
34
+ { mediaType: 'audio', mimeType: 'audio/webm', extension: 'webm' },
35
+
36
+ { mediaType: 'video', mimeType: 'video/mp4', extension: 'mp4' },
37
+ { mediaType: 'video', mimeType: 'video/quicktime', extension: 'mov' },
38
+ { mediaType: 'video', mimeType: 'video/x-msvideo', extension: 'avi' },
39
+ { mediaType: 'video', mimeType: 'video/x-matroska', extension: 'mkv' },
40
+ { mediaType: 'video', mimeType: 'video/mpeg', extension: 'mpeg' },
41
+ { mediaType: 'video', mimeType: 'video/mpeg', extension: 'mpg' },
42
+ { mediaType: 'video', mimeType: 'video/3gpp', extension: '3gp' },
43
+ { mediaType: 'video', mimeType: 'video/3gpp2', extension: '3g2' },
44
+ { mediaType: 'video', mimeType: 'video/webm', extension: 'webm' },
45
+ { mediaType: 'video', mimeType: 'video/ogg', extension: 'ogg' },
46
+
47
+ { mediaType: 'file', mimeType: 'text/plain', extension: 'txt' },
48
+ { mediaType: 'file', mimeType: 'text/markdown', extension: 'md' },
49
+ { mediaType: 'file', mimeType: 'text/csv', extension: 'csv' },
50
+ { mediaType: 'file', mimeType: 'application/json', extension: 'json' },
51
+ { mediaType: 'file', mimeType: 'application/msword', extension: 'doc' },
52
+ { mediaType: 'file', mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', extension: 'docx' },
53
+ { mediaType: 'file', mimeType: 'application/vnd.ms-excel', extension: 'xls' },
54
+ { mediaType: 'file', mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', extension: 'xlsx' },
55
+ { mediaType: 'file', mimeType: 'application/vnd.ms-powerpoint', extension: 'ppt' },
56
+ { mediaType: 'file', mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', extension: 'pptx' },
57
+ { mediaType: 'file', mimeType: 'application/zip', extension: 'zip' },
58
+ { mediaType: 'file', mimeType: 'application/x-zip-compressed', extension: 'zip' },
59
+ { mediaType: 'file', mimeType: 'application/x-rar-compressed', extension: 'rar' },
60
+ { mediaType: 'file', mimeType: 'application/x-7z-compressed', extension: '7z' },
61
+
62
+ { mediaType: 'pdf', mimeType: 'application/pdf', extension: 'pdf' },
63
+ ];
64
+
65
+ const createMediaTypeBuckets = (): Record<MediaCategory, string[]> => ({
66
+ image: [],
67
+ audio: [],
68
+ video: [],
69
+ file: [],
70
+ pdf: [],
71
+ });
72
+
73
+ export const MEDIA_TYPE_TO_EXTENSIONS: Record<MediaCategory, string[]> = MEDIA_FILE_TYPES.reduce((acc, fileType) => {
74
+ if (!acc[fileType.mediaType].includes(fileType.extension)) {
75
+ acc[fileType.mediaType].push(fileType.extension);
76
+ }
77
+ return acc;
78
+ }, createMediaTypeBuckets());
79
+
80
+ export const IMAGE_EXTENSIONS = MEDIA_TYPE_TO_EXTENSIONS.image;
81
+ export const AUDIO_EXTENSIONS = MEDIA_TYPE_TO_EXTENSIONS.audio;
82
+ export const VIDEO_EXTENSIONS = MEDIA_TYPE_TO_EXTENSIONS.video;
83
+ export const DOCUMENT_EXTENSIONS = MEDIA_TYPE_TO_EXTENSIONS.file;
84
+ export const PDF_EXTENSION = 'pdf';
85
+
86
+ export const EXTENSION_TO_MIME_TYPE: Record<string, string> = MEDIA_FILE_TYPES.reduce((acc, fileType) => {
87
+ if (!(fileType.extension in acc)) {
88
+ acc[fileType.extension] = fileType.mimeType;
89
+ }
90
+ return acc;
91
+ }, {} as Record<string, string>);
92
+
93
+ export const MIME_TO_MEDIA_TYPE: Record<string, MediaCategory> = MEDIA_FILE_TYPES.reduce((acc, fileType) => {
94
+ if (!(fileType.mimeType in acc)) {
95
+ acc[fileType.mimeType] = fileType.mediaType;
96
+ }
97
+ return acc;
98
+ }, {} as Record<string, MediaCategory>);
10
99
 
11
100
  /**
12
101
  * Extensions that must never be accepted as media uploads, regardless of declared mimetype or
@@ -153,11 +242,7 @@ export function isDangerousMediaFile(file?: UploadedFileLike | null): boolean {
153
242
  * default to 'video' since that's the more common upload case.
154
243
  */
155
244
  export const EXT_TO_MEDIA_TYPE: Record<string, MediaCategory> = {
156
- ...Object.fromEntries(IMAGE_EXTENSIONS.map((ext) => [ext, 'image' as const])),
157
- ...Object.fromEntries(AUDIO_EXTENSIONS.map((ext) => [ext, 'audio' as const])),
158
- ...Object.fromEntries(VIDEO_EXTENSIONS.map((ext) => [ext, 'video' as const])),
159
- ...Object.fromEntries(DOCUMENT_EXTENSIONS.map((ext) => [ext, 'file' as const])),
160
- [PDF_EXTENSION]: 'pdf',
245
+ ...Object.fromEntries(MEDIA_FILE_TYPES.map((fileType) => [fileType.extension, fileType.mediaType])),
161
246
  };
162
247
 
163
248
  /**
@@ -1,5 +1,6 @@
1
1
  import { isEmpty, isNotEmpty, isString, matches } from "class-validator";
2
2
  import { FieldCrudManager, ValidationError } from "src/interfaces";
3
+ import { normalizeTextFieldInDto, normalizeTextFieldValue } from "./textFieldCrudManagerUtils";
3
4
 
4
5
  export interface LongTextFieldOptions {
5
6
  regexPattern: string | undefined | null;
@@ -15,7 +16,7 @@ export class LongTextFieldCrudManager implements FieldCrudManager {
15
16
  }
16
17
 
17
18
  validate(dto: any): ValidationError[] {
18
- const fieldValue: any = dto[this.options.fieldName];
19
+ const fieldValue: any = normalizeTextFieldValue(dto[this.options.fieldName]);
19
20
  return this.applyValidations(fieldValue);
20
21
  }
21
22
 
@@ -36,7 +37,7 @@ export class LongTextFieldCrudManager implements FieldCrudManager {
36
37
  }
37
38
 
38
39
  transformForCreate(dto: any): any {
39
- return dto;
40
+ return normalizeTextFieldInDto(dto, this.options.fieldName);
40
41
  }
41
42
 
42
43
  // Validation to be applied
@@ -1,5 +1,5 @@
1
1
  import { FieldCrudManager, ValidationError } from "src/interfaces";
2
- import { EXT_TO_MEDIA_TYPE, getLowercaseFileExtension, getUploadedFileName, isDangerousMediaFile, MediaCategory } from "src/constants/media-file-types";
2
+ import { EXT_TO_MEDIA_TYPE, getLowercaseFileExtension, getUploadedFileName, isDangerousMediaFile, MediaCategory, MIME_TO_MEDIA_TYPE } from "src/constants/media-file-types";
3
3
 
4
4
  export enum SolidMediaType {
5
5
  mediaSingle = 'mediaSingle',
@@ -10,6 +10,7 @@ export interface MediaFieldOptions {
10
10
  type: SolidMediaType;
11
11
  required: boolean | undefined | null;
12
12
  fieldName: string | undefined | null;
13
+ fieldLabel?: string | undefined | null;
13
14
  mediaMaxSizeKb: number | undefined | null;
14
15
  mediaTypes: string[];
15
16
  mediaAllowedExtensions?: string[] | null;
@@ -18,68 +19,15 @@ export interface MediaFieldOptions {
18
19
 
19
20
  type MediaType = MediaCategory;
20
21
 
21
- const MIME_TO_MEDIA_TYPE: Record<string, MediaType> = {
22
- // Images
23
- 'image/png': 'image',
24
- 'image/jpeg': 'image',
25
- 'image/jpg': 'image',
26
- 'image/webp': 'image',
27
- 'image/gif': 'image',
28
- 'image/bmp': 'image',
29
- 'image/tiff': 'image',
30
- 'image/heic': 'image',
31
- 'image/heif': 'image',
32
-
33
- // Audio
34
- 'audio/mpeg': 'audio', // mp3
35
- 'audio/mp3': 'audio',
36
- 'audio/wav': 'audio',
37
- 'audio/x-wav': 'audio',
38
- 'audio/webm': 'audio',
39
- 'audio/ogg': 'audio',
40
- 'audio/aac': 'audio',
41
- 'audio/mp4': 'audio', // m4a often shows as audio/mp4
42
- 'audio/x-m4a': 'audio',
43
- 'audio/flac': 'audio',
44
-
45
- // Video
46
- 'video/mp4': 'video',
47
- 'video/mpeg': 'video',
48
- 'video/webm': 'video',
49
- 'video/ogg': 'video',
50
- 'video/quicktime': 'video', // mov
51
- 'video/x-msvideo': 'video', // avi
52
- 'video/x-matroska': 'video',// mkv
53
- 'video/3gpp': 'video',
54
- 'video/3gpp2': 'video',
55
-
56
- // Documents / files (treat as "file")
57
- 'application/pdf': 'pdf',
58
- 'text/plain': 'file',
59
- 'text/markdown': 'file',
60
- 'application/json': 'file',
61
- 'text/csv': 'file',
62
-
63
- // Office
64
- 'application/msword': 'file', // doc
65
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'file', // docx
66
- 'application/vnd.ms-excel': 'file', // xls
67
- 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'file', // xlsx
68
- 'application/vnd.ms-powerpoint': 'file', // ppt
69
- 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'file', // pptx,
70
-
71
- // Archives (optional)
72
- 'application/zip': 'file',
73
- 'application/x-zip-compressed': 'file',
74
- 'application/x-rar-compressed': 'file',
75
- 'application/x-7z-compressed': 'file',
76
- };
77
-
78
22
  export class MediaFieldCrudManager implements FieldCrudManager {
79
23
 
80
24
  constructor(private readonly options: MediaFieldOptions) {
81
25
  }
82
26
 
27
+ private getFieldLabel(): string {
28
+ return this.options.fieldLabel || this.options.fieldName || 'File';
29
+ }
30
+
83
31
  private resolveMediaType(file: Express.Multer.File): MediaType | null {
84
32
  // Belt-and-braces: dangerous files are already rejected outright by
85
33
  // validateDangerousFiles, but never let one resolve to a usable category.
@@ -136,7 +84,7 @@ export class MediaFieldCrudManager implements FieldCrudManager {
136
84
  .filter(fieldFile => isDangerousMediaFile(fieldFile))
137
85
  .map(fieldFile => ({
138
86
  field: this.options.fieldName,
139
- error: `${this.options.fieldName} file type not allowed. ` +
87
+ error: `${this.getFieldLabel()} file type not allowed. ` +
140
88
  `${getUploadedFileName(fieldFile) || 'File'} is a potentially dangerous file type.`
141
89
  }));
142
90
  }
@@ -157,7 +105,7 @@ export class MediaFieldCrudManager implements FieldCrudManager {
157
105
  if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {
158
106
  errors.push({
159
107
  field: this.options.fieldName,
160
- error: `${this.options.fieldName} is required`
108
+ error: `${this.getFieldLabel()} is required`
161
109
  });
162
110
  }
163
111
  return errors;
@@ -172,7 +120,7 @@ export class MediaFieldCrudManager implements FieldCrudManager {
172
120
  if (fieldFileSizeInBytes > this.options.mediaMaxSizeKb) {
173
121
  errors.push({
174
122
  field: this.options.fieldName,
175
- error: `${this.options.fieldName} with size ${fieldFileSizeInBytes} KB exceeds max size limit of ${this.options.mediaMaxSizeKb} KB`
123
+ error: `${this.getFieldLabel()} with size ${fieldFileSizeInBytes} KB exceeds max size limit of ${this.options.mediaMaxSizeKb} KB`
176
124
  });
177
125
  }
178
126
  }
@@ -192,7 +140,7 @@ export class MediaFieldCrudManager implements FieldCrudManager {
192
140
  if (!resolvedType || !allowedFileTypes.includes(resolvedType)) {
193
141
  errors.push({
194
142
  field: this.options.fieldName,
195
- error: `${this.options.fieldName} file type not allowed. ` +
143
+ error: `${this.getFieldLabel()} file type not allowed. ` +
196
144
  `Allowed: ${allowedFileTypes.join(', ')}. ` +
197
145
  `Received mimetype: ${fieldFile.mimetype}${resolvedType ? ` (mapped to ${resolvedType})` : ''}`
198
146
  });
@@ -216,7 +164,7 @@ export class MediaFieldCrudManager implements FieldCrudManager {
216
164
  })
217
165
  .map(fieldFile => ({
218
166
  field: this.options.fieldName,
219
- error: `${this.options.fieldName} file type not allowed. ` +
167
+ error: `${this.getFieldLabel()} file type not allowed. ` +
220
168
  `Allowed extensions: ${[...normalizedAllowed].join(', ')}.`
221
169
  }));
222
170
  }
@@ -226,7 +174,7 @@ export class MediaFieldCrudManager implements FieldCrudManager {
226
174
  if (fieldFiles.length > 1) {
227
175
  errors.push({
228
176
  field: this.options.fieldName,
229
- error: `${this.options.fieldName} must be a single file`
177
+ error: `${this.getFieldLabel()} must be a single file`
230
178
  });
231
179
  }
232
180
  return errors;
@@ -1,5 +1,6 @@
1
1
  import { isEmpty, isNotEmpty, isString, length, matches } from "class-validator";
2
2
  import { FieldCrudManager, ValidationError } from "src/interfaces";
3
+ import { normalizeTextFieldInDto, normalizeTextFieldValue } from "./textFieldCrudManagerUtils";
3
4
 
4
5
  export interface ShortTextFieldOptions {
5
6
  length: number | undefined | null;
@@ -16,7 +17,7 @@ export class ShortTextFieldCrudManager implements FieldCrudManager {
16
17
  }
17
18
 
18
19
  validate(dto: any, _files:Array<Express.Multer.File>): ValidationError[] {
19
- const fieldValue: any = dto[this.options.fieldName];
20
+ const fieldValue: any = normalizeTextFieldValue(dto[this.options.fieldName]);
20
21
  return this.applyValidations(fieldValue);
21
22
  }
22
23
 
@@ -39,7 +40,7 @@ export class ShortTextFieldCrudManager implements FieldCrudManager {
39
40
  }
40
41
 
41
42
  transformForCreate(dto: any): any {
42
- return dto;
43
+ return normalizeTextFieldInDto(dto, this.options.fieldName);
43
44
  }
44
45
 
45
46
  // Validation to be applied
@@ -0,0 +1,14 @@
1
+ import { isString } from "class-validator";
2
+
3
+ export const normalizeTextFieldValue = (fieldValue: any): any => {
4
+ return isString(fieldValue) ? fieldValue.trim() : fieldValue;
5
+ };
6
+
7
+ export const normalizeTextFieldInDto = (dto: any, fieldName?: string | null): any => {
8
+ if (!fieldName || !Object.prototype.hasOwnProperty.call(dto, fieldName)) {
9
+ return dto;
10
+ }
11
+
12
+ dto[fieldName] = normalizeTextFieldValue(dto[fieldName]);
13
+ return dto;
14
+ };
@@ -184,7 +184,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
184
184
  const validationErrors = fieldManager.validate(dto, files);
185
185
  const errors = (validationErrors instanceof Promise) ? await validationErrors : validationErrors;
186
186
  if (errors.length > 0) {
187
- throw new BadRequestException(`Validation errors in ${field.name} is invalid i.e ${errors.map(e => e.error).join(', ')}`); //FIXME: Better to return a validation error object
187
+ throw new BadRequestException(`Validation errors in ${field.displayName || field.name} is invalid i.e ${errors.map(e => e.error).join(', ')}`); //FIXME: Better to return a validation error object
188
188
  }
189
189
  const dtoOrPromise = fieldManager.transformForCreate(dto);
190
190
  dto = (dtoOrPromise instanceof Promise) ? await dtoOrPromise : dtoOrPromise;
@@ -444,6 +444,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
444
444
  // Plan the media table schema e.g id, uri, storageProvider, entity_id, entity_name, createdAt, updatedAt
445
445
  const options = {
446
446
  ...commonOptions,
447
+ fieldLabel: fieldMetadata.displayName,
447
448
  mediaMaxSizeKb: fieldMetadata.mediaMaxSizeKb,
448
449
  mediaTypes: fieldMetadata.mediaTypes,
449
450
  mediaAllowedExtensions: fieldMetadata.mediaAllowedExtensions,
@@ -13,7 +13,7 @@ import { UpdateFieldMetaDataDto } from '../dtos/update-field-metadata.dto';
13
13
  import { FieldMetadata } from '../entities/field-metadata.entity';
14
14
  import { ModelMetadata } from '../entities/model-metadata.entity';
15
15
  import { ISelectionProviderValues, MediaStorageProvider } from '../interfaces';
16
- import { MEDIA_CATEGORIES } from '../constants/media-file-types';
16
+ import { MEDIA_CATEGORIES, MEDIA_FILE_TYPES } from '../constants/media-file-types';
17
17
  import { CrudHelperService } from './crud-helper.service';
18
18
  import { ERROR_MESSAGES } from 'src/constants/error-messages';
19
19
  import qs from 'qs';
@@ -416,6 +416,7 @@ export class FieldMetadataService implements OnApplicationBootstrap {
416
416
  ormType: ormFieldTypeForSolid,
417
417
  decryptWhenTypes: enumToResponseArray(DecryptWhenType),
418
418
  mediaTypes: MEDIA_CATEGORIES.map((value) => ({ label: value, value })),
419
+ mediaFileTypeDefinitions: MEDIA_FILE_TYPES.map(({ mediaType, extension }) => ({ mediaType, extension })),
419
420
  relationTypes: enumToResponseArray(RelationType),
420
421
  selectionDynamicProviders: sps,
421
422
  computedProviders: cps,
@@ -17,6 +17,7 @@ import { SolidIntrospectService } from './solid-introspect.service';
17
17
  import { UserViewMetadataService } from './user-view-metadata.service';
18
18
  import { MenuItemMetadata } from 'src/entities/menu-item-metadata.entity';
19
19
  import { IWorkflowFieldDataProviderValues } from 'src/interfaces';
20
+ import { MEDIA_FILE_TYPES } from 'src/constants/media-file-types';
20
21
 
21
22
  @Injectable()
22
23
  export class ViewMetadataService extends CRUDService<ViewMetadata> {
@@ -383,6 +384,9 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
383
384
  const r = {
384
385
  'solidView': entity,
385
386
  'solidFieldsMetadata': Object.fromEntries(fieldsMap),
387
+ // Reuse the form view payload for media picker filtering so the runtime widgets
388
+ // can derive category-to-extension fallbacks without exposing unused MIME details.
389
+ 'mediaFileTypeDefinitions': MEDIA_FILE_TYPES.map(({ mediaType, extension }) => ({ mediaType, extension })),
386
390
  'solidFormViewWorkflowData': solidFormViewWorkflowData,
387
391
  'applicableLocales': applicableLocales,
388
392
  'viewModes': viewModes