@solidxai/core 0.1.11-beta.9 → 0.1.11

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 (114) hide show
  1. package/CHANGELOG.md +456 -0
  2. package/dist/controllers/datasource-introspection.controller.d.ts +8 -0
  3. package/dist/controllers/datasource-introspection.controller.d.ts.map +1 -1
  4. package/dist/controllers/media.controller.js +0 -2
  5. package/dist/controllers/media.controller.js.map +1 -1
  6. package/dist/helpers/environment.helper.d.ts +0 -1
  7. package/dist/helpers/environment.helper.d.ts.map +1 -1
  8. package/dist/helpers/environment.helper.js +0 -4
  9. package/dist/helpers/environment.helper.js.map +1 -1
  10. package/dist/helpers/model-metadata-helper.service.d.ts +1 -2
  11. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  12. package/dist/helpers/model-metadata-helper.service.js +2 -6
  13. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  14. package/dist/helpers/module-metadata-helper.service.js +1 -1
  15. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  16. package/dist/helpers/solid-registry.d.ts +1 -2
  17. package/dist/helpers/solid-registry.d.ts.map +1 -1
  18. package/dist/helpers/solid-registry.js.map +1 -1
  19. package/dist/index.d.ts +0 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +0 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/interfaces.d.ts +1 -0
  24. package/dist/interfaces.d.ts.map +1 -1
  25. package/dist/interfaces.js.map +1 -1
  26. package/dist/repository/scheduled-job.repository.d.ts +2 -2
  27. package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
  28. package/dist/repository/scheduled-job.repository.js +3 -6
  29. package/dist/repository/scheduled-job.repository.js.map +1 -1
  30. package/dist/repository/security-rule.repository.d.ts +2 -2
  31. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  32. package/dist/repository/security-rule.repository.js +3 -6
  33. package/dist/repository/security-rule.repository.js.map +1 -1
  34. package/dist/seeders/seed-data/solid-core-metadata.json +62 -33
  35. package/dist/services/authentication.service.d.ts +2 -0
  36. package/dist/services/authentication.service.d.ts.map +1 -1
  37. package/dist/services/authentication.service.js +32 -11
  38. package/dist/services/authentication.service.js.map +1 -1
  39. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  40. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +5 -7
  41. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  42. package/dist/services/crud-helper.service.d.ts.map +1 -1
  43. package/dist/services/crud-helper.service.js +7 -0
  44. package/dist/services/crud-helper.service.js.map +1 -1
  45. package/dist/services/datasource-introspection.service.d.ts +10 -0
  46. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  47. package/dist/services/datasource-introspection.service.js +109 -17
  48. package/dist/services/datasource-introspection.service.js.map +1 -1
  49. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  50. package/dist/services/menu-item-metadata.service.js +1 -0
  51. package/dist/services/menu-item-metadata.service.js.map +1 -1
  52. package/dist/services/model-metadata.service.d.ts +2 -0
  53. package/dist/services/model-metadata.service.d.ts.map +1 -1
  54. package/dist/services/model-metadata.service.js +49 -16
  55. package/dist/services/model-metadata.service.js.map +1 -1
  56. package/dist/services/module-metadata.service.d.ts.map +1 -1
  57. package/dist/services/module-metadata.service.js +0 -28
  58. package/dist/services/module-metadata.service.js.map +1 -1
  59. package/dist/services/settings/default-settings-provider.service.d.ts +212 -0
  60. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  61. package/dist/services/settings/default-settings-provider.service.js +106 -0
  62. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  63. package/dist/services/solid-ts-morph.service.d.ts +6 -0
  64. package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
  65. package/dist/services/solid-ts-morph.service.js +43 -0
  66. package/dist/services/solid-ts-morph.service.js.map +1 -1
  67. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  68. package/dist/subscribers/audit.subscriber.js +2 -8
  69. package/dist/subscribers/audit.subscriber.js.map +1 -1
  70. package/dist/subscribers/computed-entity-field.subscriber.d.ts +0 -8
  71. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  72. package/dist/subscribers/computed-entity-field.subscriber.js +3 -36
  73. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  74. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  75. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  76. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  77. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  78. package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
  79. package/dist/subscribers/scheduled-job.subscriber.js +2 -3
  80. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  81. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  82. package/dist/subscribers/security-rule.subscriber.js +3 -5
  83. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  84. package/package.json +1 -1
  85. package/src/controllers/media.controller.ts +1 -1
  86. package/src/helpers/environment.helper.ts +0 -11
  87. package/src/helpers/model-metadata-helper.service.ts +2 -7
  88. package/src/helpers/module-metadata-helper.service.ts +1 -1
  89. package/src/helpers/solid-registry.ts +1 -7
  90. package/src/index.ts +0 -1
  91. package/src/interfaces.ts +1 -0
  92. package/src/repository/scheduled-job.repository.ts +4 -10
  93. package/src/repository/security-rule.repository.ts +4 -10
  94. package/src/seeders/seed-data/solid-core-metadata.json +62 -33
  95. package/src/services/authentication.service.ts +46 -12
  96. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +5 -11
  97. package/src/services/crud-helper.service.ts +7 -0
  98. package/src/services/datasource-introspection.service.ts +176 -16
  99. package/src/services/menu-item-metadata.service.ts +2 -1
  100. package/src/services/model-metadata.service.ts +63 -22
  101. package/src/services/module-metadata.service.ts +0 -36
  102. package/src/services/settings/default-settings-provider.service.ts +106 -0
  103. package/src/services/solid-ts-morph.service.ts +61 -1
  104. package/src/subscribers/audit.subscriber.ts +2 -11
  105. package/src/subscribers/computed-entity-field.subscriber.ts +6 -63
  106. package/src/subscribers/created-by-updated-by.subscriber.ts +0 -3
  107. package/src/subscribers/field-metadata.subscriber.ts +0 -3
  108. package/src/subscribers/scheduled-job.subscriber.ts +2 -3
  109. package/src/subscribers/security-rule.subscriber.ts +3 -8
  110. package/dist/helpers/nodemon-heartbeat.d.ts +0 -5
  111. package/dist/helpers/nodemon-heartbeat.d.ts.map +0 -1
  112. package/dist/helpers/nodemon-heartbeat.js +0 -67
  113. package/dist/helpers/nodemon-heartbeat.js.map +0 -1
  114. package/src/helpers/nodemon-heartbeat.ts +0 -59
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAG3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEjF,qBACa,uBAAwB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;IAGtE,QAAQ,CAAC,aAAa,EAAE,aAAa;IAGrC,QAAQ,CAAC,IAAI,EAAE,0BAA0B;IACzC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB;IACjD,QAAQ,CAAC,SAAS,EAAE,SAAS;gBALpB,aAAa,EAAE,aAAa,EAG5B,IAAI,EAAE,0BAA0B,EAChC,gBAAgB,EAAE,sBAAsB,EACxC,SAAS,EAAE,SAAS;IAOzB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK;IAU7C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB;IA2BxD,aAAa,CAAC,UAAU,EAAE,cAAc;YAiFhC,aAAa;CAmE5B"}
1
+ {"version":3,"file":"menu-item-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAG3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEjF,qBACa,uBAAwB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;IAGtE,QAAQ,CAAC,aAAa,EAAE,aAAa;IAGrC,QAAQ,CAAC,IAAI,EAAE,0BAA0B;IACzC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB;IACjD,QAAQ,CAAC,SAAS,EAAE,SAAS;gBALpB,aAAa,EAAE,aAAa,EAG5B,IAAI,EAAE,0BAA0B,EAChC,gBAAgB,EAAE,sBAAsB,EACxC,SAAS,EAAE,SAAS;IAOzB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK;IAU7C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB;IA2BxD,aAAa,CAAC,UAAU,EAAE,cAAc;YAiFhC,aAAa;CAoE5B"}
@@ -137,6 +137,7 @@ let MenuItemMetadataService = class MenuItemMetadataService extends crud_service
137
137
  path: path,
138
138
  key: rootItem.name.toLowerCase().replace(/\s+/g, '-'),
139
139
  icon: rootItem.iconName,
140
+ isSystem: (rootItem.action?.model?.isSystem ?? false) || rootItem.module?.name === "solid-core",
140
141
  };
141
142
  if (children.length > 0) {
142
143
  data["children"] = await this.buildMenuTree(children, allMenuItems, activeUser);
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item-metadata.service.js","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { EntityManager } from 'typeorm';\nimport { CRUDService } from 'src/services/crud.service';\n\n\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { UpdateMenuItemMetadataDto } from '../dtos/update-menu-item-metadata.dto';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\nimport { kebabCase } from 'lodash';\nimport { MenuItemMetadataRepository } from 'src/repository/menu-item-metadata.repository';\nimport { SavedFiltersRepository } from 'src/repository/saved-filters.repository';\n\n@Injectable()\nexport class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {\n constructor(\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(MenuItemMetadata, 'default')\n // readonly repo: Repository<MenuItemMetadata>,\n readonly repo: MenuItemMetadataRepository,\n readonly savedFiltersRepo: SavedFiltersRepository,\n readonly moduleRef: ModuleRef\n\n ) {\n super(entityManager, repo, 'menuItemMetadata', 'solid-core', moduleRef);\n }\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(updateSolidMenuItemDto: UpdateMenuItemMetadataDto) {\n // Leave out all the extra attributes only keep the ones we are interested in updating.\n const { moduleUserKey, parentMenuItemUserKey, actionUserKey, rolesIds, rolesCommand, ...cleanUpdateSolidMenuItemDto } = updateSolidMenuItemDto;\n\n // First check if module already exists using name\n const existingMenuItem = await this.repo.findOne({\n where: {\n name: updateSolidMenuItemDto.name\n },\n relations: [\"roles\"]\n });\n\n // if found\n if (existingMenuItem) {\n // TODO: This is very slow disabling this for now..\n // const updatedSolidActionDto = { ...existingMenuItem, ...cleanUpdateSolidMenuItemDto };\n // return this.repo.save(updatedSolidActionDto);\n }\n // if not found - create new \n else {\n // @ts-ignore\n const moduleMetadata = this.repo.create(cleanUpdateSolidMenuItemDto);\n return this.repo.save(moduleMetadata);\n }\n }\n\n\n async findUserMenus(activeUser: ActiveUserData) {\n // 1. For the users role, fire a query to load all menus that this role has access to. \n // const usersMenuItems = this.solidMenuItemRepo.find({\n // where: {\n // roles: {\n // name: In(activeUser.roles)\n // }\n // },\n // relations: ['module', 'parentMenuItem', 'action']\n // });\n const qb = await this.repo.createSecurityRuleAwareQueryBuilder('menuItem')\n\n const menuItems = await qb\n .leftJoinAndSelect('menuItem.module', 'module')\n .leftJoinAndSelect('menuItem.parentMenuItem', 'parentMenuItem')\n .leftJoinAndSelect('menuItem.action', 'action')\n .leftJoinAndSelect('action.model', 'model') // Join the model relation of action\n .leftJoinAndSelect('action.view', 'view') // Join the view relation of action\n .leftJoinAndSelect('menuItem.roles', 'roles')\n .where('roles.name IN (:...roleNames)', { roleNames: activeUser.roles })\n .addOrderBy('module.menuSequenceNumber', 'ASC')\n .addOrderBy('menuItem.sequenceNumber', 'ASC')\n .getMany();\n\n // 2. First arrange the output of the above query by module based on module\n const modulesToMenuItemsMap = new Map<string, MenuItemMetadata[]>();\n const modulesMap = new Map<string, ModuleMetadata>();\n menuItems.forEach(menuItem => {\n const moduleName = menuItem.module.name;\n\n // Keep track of all menu items under a given module.\n if (!modulesToMenuItemsMap.has(moduleName)) {\n modulesToMenuItemsMap.set(moduleName, []);\n }\n modulesToMenuItemsMap.get(moduleName).push(menuItem);\n\n // Keep track of the modules information separately.\n if (!modulesMap.has(moduleName)) {\n modulesMap.set(moduleName, menuItem.module);\n }\n });\n\n // 3. Then for each module, do a recursive compilation of children based on parentMenuItem, while doing this use the relation - action to get hold of the path. \n const menu: any[] = [];\n\n // modulesToMenuItemsMap.forEach((menuItems, moduleName) => {\n // const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);\n // const moduleMetadata = modulesMap.get(moduleName);\n\n // const moduleMenu = {\n // title: moduleMetadata.displayName,\n // // No need for path the module level.\n // // path: ``,\n // key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n // // TODO: We need to add the module icon as part of the metadata so it can be brought here. \n // // icon: `/images/menu/${moduleName.toLowerCase().replace(/\\s+/g, '-')}.svg`,\n // children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),\n // icon: moduleMetadata.menuIconUrl,\n // };\n\n // menu.push(moduleMenu);\n // });\n for (const [moduleName, menuItemsForModule] of modulesToMenuItemsMap.entries()) {\n const rootMenuItems = menuItemsForModule.filter(item => !item.parentMenuItem);\n const moduleMetadata = modulesMap.get(moduleName);\n\n const moduleMenu = {\n title: moduleMetadata.displayName,\n key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n children: await this.buildMenuTree(rootMenuItems, menuItemsForModule, activeUser), // ✅ await here\n icon: moduleMetadata.menuIconUrl,\n };\n\n menu.push(moduleMenu);\n }\n\n\n return menu.filter(m => m.children.length > 0);\n }\n\n // Recursive function to build the tree\n private async buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): Promise<any[]> {\n const menuItemsData = await Promise.all(\n rootItems.map(async rootItem => {\n const allowedMenuItems = allMenuItems.filter(i => {\n if (!i.parentMenuItem) {\n return true\n } else {\n if(i.action.type === 'custom'){\n return true;\n }\n return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)\n }\n });\n // Get immediate children of the current loop variable menuItem.\n const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);\n const menuItemId = rootItem?.id ?? \"\";\n const menuItemName = rootItem?.name ?? \"\";\n const actionId = rootItem?.action?.id ?? \"\";\n const actionName = rootItem?.action?.name ?? \"\";\n // TODO: We should specify path only if there are no more children present. \n // For now adding path everywhere. \n let path = '';\n\n const layout = rootItem?.action?.view && rootItem?.action?.view?.layout ? JSON.parse(rootItem?.action?.view?.layout) : null\n let savedFilterId = null;\n if (layout && layout?.attrs?.defaultSavedFilter) {\n const savedFilter = await this.savedFiltersRepo.findOne({\n where: {\n name: layout?.attrs?.defaultSavedFilter,\n isPrivate: false\n },\n });\n if (savedFilter) {\n savedFilterId = savedFilter.id\n }\n }\n if (rootItem.action && rootItem.action.type === 'custom') {\n path = `${rootItem.action.customComponent}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;\n }\n if (rootItem.action && rootItem.action.type === 'solid') {\n if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {\n // TODO: Here we are assuming that we will always take the user to collection view of a model. \n // We can make provision to take them other views also in the future. \n // path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;\n path = `/admin/core/${rootItem.module.name}/${kebabCase(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;\n\n }\n }\n\n // We are not checking for empty path coz, this is required for parent menu items.\n const data = {\n title: rootItem.displayName || rootItem.name,\n path: path,\n key: rootItem.name.toLowerCase().replace(/\\s+/g, '-'),\n icon: rootItem.iconName,\n // iconVariant : rootItem.iconVariant\n }\n if (children.length > 0) {\n data[\"children\"] = await this.buildMenuTree(children, allMenuItems, activeUser);\n }\n return data;\n\n }));\n return menuItemsData.filter(mi => mi && mi)\n }\n\n\n}\n"]}
1
+ {"version":3,"file":"menu-item-metadata.service.js","sourceRoot":"","sources":["../../src/services/menu-item-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { EntityManager } from 'typeorm';\nimport { CRUDService } from 'src/services/crud.service';\n\n\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { UpdateMenuItemMetadataDto } from '../dtos/update-menu-item-metadata.dto';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\nimport { kebabCase } from 'lodash';\nimport { MenuItemMetadataRepository } from 'src/repository/menu-item-metadata.repository';\nimport { SavedFiltersRepository } from 'src/repository/saved-filters.repository';\n\n@Injectable()\nexport class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {\n constructor(\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(MenuItemMetadata, 'default')\n // readonly repo: Repository<MenuItemMetadata>,\n readonly repo: MenuItemMetadataRepository,\n readonly savedFiltersRepo: SavedFiltersRepository,\n readonly moduleRef: ModuleRef\n\n ) {\n super(entityManager, repo, 'menuItemMetadata', 'solid-core', moduleRef);\n }\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(updateSolidMenuItemDto: UpdateMenuItemMetadataDto) {\n // Leave out all the extra attributes only keep the ones we are interested in updating.\n const { moduleUserKey, parentMenuItemUserKey, actionUserKey, rolesIds, rolesCommand, ...cleanUpdateSolidMenuItemDto } = updateSolidMenuItemDto;\n\n // First check if module already exists using name\n const existingMenuItem = await this.repo.findOne({\n where: {\n name: updateSolidMenuItemDto.name\n },\n relations: [\"roles\"]\n });\n\n // if found\n if (existingMenuItem) {\n // TODO: This is very slow disabling this for now..\n // const updatedSolidActionDto = { ...existingMenuItem, ...cleanUpdateSolidMenuItemDto };\n // return this.repo.save(updatedSolidActionDto);\n }\n // if not found - create new \n else {\n // @ts-ignore\n const moduleMetadata = this.repo.create(cleanUpdateSolidMenuItemDto);\n return this.repo.save(moduleMetadata);\n }\n }\n\n\n async findUserMenus(activeUser: ActiveUserData) {\n // 1. For the users role, fire a query to load all menus that this role has access to. \n // const usersMenuItems = this.solidMenuItemRepo.find({\n // where: {\n // roles: {\n // name: In(activeUser.roles)\n // }\n // },\n // relations: ['module', 'parentMenuItem', 'action']\n // });\n const qb = await this.repo.createSecurityRuleAwareQueryBuilder('menuItem')\n\n const menuItems = await qb\n .leftJoinAndSelect('menuItem.module', 'module')\n .leftJoinAndSelect('menuItem.parentMenuItem', 'parentMenuItem')\n .leftJoinAndSelect('menuItem.action', 'action')\n .leftJoinAndSelect('action.model', 'model') // Join the model relation of action\n .leftJoinAndSelect('action.view', 'view') // Join the view relation of action\n .leftJoinAndSelect('menuItem.roles', 'roles')\n .where('roles.name IN (:...roleNames)', { roleNames: activeUser.roles })\n .addOrderBy('module.menuSequenceNumber', 'ASC')\n .addOrderBy('menuItem.sequenceNumber', 'ASC')\n .getMany();\n\n // 2. First arrange the output of the above query by module based on module\n const modulesToMenuItemsMap = new Map<string, MenuItemMetadata[]>();\n const modulesMap = new Map<string, ModuleMetadata>();\n menuItems.forEach(menuItem => {\n const moduleName = menuItem.module.name;\n\n // Keep track of all menu items under a given module.\n if (!modulesToMenuItemsMap.has(moduleName)) {\n modulesToMenuItemsMap.set(moduleName, []);\n }\n modulesToMenuItemsMap.get(moduleName).push(menuItem);\n\n // Keep track of the modules information separately.\n if (!modulesMap.has(moduleName)) {\n modulesMap.set(moduleName, menuItem.module);\n }\n });\n\n // 3. Then for each module, do a recursive compilation of children based on parentMenuItem, while doing this use the relation - action to get hold of the path. \n const menu: any[] = [];\n\n // modulesToMenuItemsMap.forEach((menuItems, moduleName) => {\n // const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);\n // const moduleMetadata = modulesMap.get(moduleName);\n\n // const moduleMenu = {\n // title: moduleMetadata.displayName,\n // // No need for path the module level.\n // // path: ``,\n // key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n // // TODO: We need to add the module icon as part of the metadata so it can be brought here. \n // // icon: `/images/menu/${moduleName.toLowerCase().replace(/\\s+/g, '-')}.svg`,\n // children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),\n // icon: moduleMetadata.menuIconUrl,\n // };\n\n // menu.push(moduleMenu);\n // });\n for (const [moduleName, menuItemsForModule] of modulesToMenuItemsMap.entries()) {\n const rootMenuItems = menuItemsForModule.filter(item => !item.parentMenuItem);\n const moduleMetadata = modulesMap.get(moduleName);\n\n const moduleMenu = {\n title: moduleMetadata.displayName,\n key: moduleName.toLowerCase().replace(/\\s+/g, '-'),\n children: await this.buildMenuTree(rootMenuItems, menuItemsForModule, activeUser), // ✅ await here\n icon: moduleMetadata.menuIconUrl,\n };\n\n menu.push(moduleMenu);\n }\n\n\n return menu.filter(m => m.children.length > 0);\n }\n\n // Recursive function to build the tree\n private async buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): Promise<any[]> {\n const menuItemsData = await Promise.all(\n rootItems.map(async rootItem => {\n const allowedMenuItems = allMenuItems.filter(i => {\n if (!i.parentMenuItem) {\n return true\n } else {\n if (i.action.type === 'custom') {\n return true;\n }\n return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)\n }\n });\n // Get immediate children of the current loop variable menuItem.\n const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);\n const menuItemId = rootItem?.id ?? \"\";\n const menuItemName = rootItem?.name ?? \"\";\n const actionId = rootItem?.action?.id ?? \"\";\n const actionName = rootItem?.action?.name ?? \"\";\n // TODO: We should specify path only if there are no more children present. \n // For now adding path everywhere. \n let path = '';\n\n const layout = rootItem?.action?.view && rootItem?.action?.view?.layout ? JSON.parse(rootItem?.action?.view?.layout) : null\n let savedFilterId = null;\n if (layout && layout?.attrs?.defaultSavedFilter) {\n const savedFilter = await this.savedFiltersRepo.findOne({\n where: {\n name: layout?.attrs?.defaultSavedFilter,\n isPrivate: false\n },\n });\n if (savedFilter) {\n savedFilterId = savedFilter.id\n }\n }\n if (rootItem.action && rootItem.action.type === 'custom') {\n path = `${rootItem.action.customComponent}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;\n }\n if (rootItem.action && rootItem.action.type === 'solid') {\n if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {\n // TODO: Here we are assuming that we will always take the user to collection view of a model. \n // We can make provision to take them other views also in the future. \n // path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;\n path = `/admin/core/${rootItem.module.name}/${kebabCase(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;\n\n }\n }\n\n // We are not checking for empty path coz, this is required for parent menu items.\n const data = {\n title: rootItem.displayName || rootItem.name,\n path: path,\n key: rootItem.name.toLowerCase().replace(/\\s+/g, '-'),\n icon: rootItem.iconName,\n // iconVariant : rootItem.iconVariant\n isSystem: (rootItem.action?.model?.isSystem ?? false) || rootItem.module?.name === \"solid-core\",\n }\n if (children.length > 0) {\n data[\"children\"] = await this.buildMenuTree(children, allMenuItems, activeUser);\n }\n return data;\n\n }));\n return menuItemsData.filter(mi => mi && mi)\n }\n\n\n}\n"]}
@@ -46,6 +46,8 @@ export declare class ModelMetadataService {
46
46
  deleteMany(ids: number[]): Promise<any>;
47
47
  remove(id: number): Promise<ModelMetadata>;
48
48
  cleanupOnDelete(modelEntityId: number): Promise<void>;
49
+ private resolveSolidApiRoot;
50
+ private cleanupAssociatedTypeormDatasourceFiles;
49
51
  private cleanupAssociatedViewsActionsAndMenus;
50
52
  private cleanupAssociatedImports;
51
53
  private cleanupAssociatedPermissions;
@@ -1 +1 @@
1
- {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,7 @@ exports.ModelMetadataService = void 0;
49
49
  const common_1 = require("@nestjs/common");
50
50
  const typeorm_1 = require("@nestjs/typeorm");
51
51
  const fs = __importStar(require("fs/promises"));
52
+ const fs_1 = require("fs");
52
53
  const path = __importStar(require("path"));
53
54
  const typeorm_2 = require("typeorm");
54
55
  const model_metadata_entity_1 = require("../entities/model-metadata.entity");
@@ -70,8 +71,6 @@ const permission_metadata_entity_1 = require("../entities/permission-metadata.en
70
71
  const role_metadata_entity_1 = require("../entities/role-metadata.entity");
71
72
  const view_metadata_entity_1 = require("../entities/view-metadata.entity");
72
73
  const command_service_1 = require("../helpers/command.service");
73
- const environment_helper_1 = require("../helpers/environment.helper");
74
- const nodemon_heartbeat_1 = require("../helpers/nodemon-heartbeat");
75
74
  const schematic_service_1 = require("../helpers/schematic.service");
76
75
  const string_helper_1 = require("../helpers/string.helper");
77
76
  const crud_helper_service_1 = require("./crud-helper.service");
@@ -607,6 +606,54 @@ let ModelMetadataService = class ModelMetadataService {
607
606
  this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);
608
607
  }
609
608
  }
609
+ await this.cleanupAssociatedTypeormDatasourceFiles(modelEntity, modulePath);
610
+ }
611
+ resolveSolidApiRoot() {
612
+ const cwd = process.cwd();
613
+ const candidates = [
614
+ cwd,
615
+ path.join(cwd, 'solid-api'),
616
+ ];
617
+ for (const candidate of candidates) {
618
+ const srcRoot = path.join(candidate, 'src');
619
+ if ((0, fs_1.existsSync)(srcRoot)) {
620
+ return candidate;
621
+ }
622
+ }
623
+ return null;
624
+ }
625
+ async cleanupAssociatedTypeormDatasourceFiles(modelEntity, modulePath) {
626
+ if (!modulePath) {
627
+ return;
628
+ }
629
+ const solidApiRoot = this.resolveSolidApiRoot();
630
+ if (!solidApiRoot) {
631
+ this.logger.warn(`Unable to locate consuming solid-api workspace while cleaning datasource files for model '${modelEntity.singularName}'`);
632
+ return;
633
+ }
634
+ const srcRoot = path.join(solidApiRoot, 'src');
635
+ const srcEntries = await fs.readdir(srcRoot).catch(() => []);
636
+ const datasourceFiles = srcEntries
637
+ .filter((entry) => /^typeorm-.*-datasource\.ts$/.test(entry))
638
+ .map((entry) => path.join(srcRoot, entry));
639
+ if (datasourceFiles.length === 0) {
640
+ return;
641
+ }
642
+ const moduleDirName = path.basename(modulePath);
643
+ const entityClassName = (0, string_helper_1.classify)(modelEntity.singularName);
644
+ const entityImportPath = `./${moduleDirName}/entities/${(0, lodash_1.kebabCase)(modelEntity.singularName)}.entity`;
645
+ this.logger.log(`Scanning ${datasourceFiles.length} TypeORM datasource file(s) for model '${modelEntity.singularName}' cleanup`);
646
+ try {
647
+ this.solidTsMorphService.begin();
648
+ for (const datasourceFile of datasourceFiles) {
649
+ this.solidTsMorphService.cleanupTypeormDatasourceEntity(datasourceFile, entityImportPath, entityClassName);
650
+ }
651
+ await this.solidTsMorphService.commit();
652
+ }
653
+ catch (error) {
654
+ this.solidTsMorphService.rollback();
655
+ this.logger.error(`Failed to clean datasource files for model '${modelEntity.singularName}':`, error);
656
+ }
610
657
  }
611
658
  async cleanupAssociatedViewsActionsAndMenus(modelId) {
612
659
  const viewRepo = this.dataSource.getRepository(view_metadata_entity_1.ViewMetadata);
@@ -791,20 +838,6 @@ let ModelMetadataService = class ModelMetadataService {
791
838
  }
792
839
  async generateCodeViaCtl(modelId) {
793
840
  const model = await this.findOne(modelId);
794
- const isEmbedded = (0, environment_helper_1.isEmbeddedDb)();
795
- if (isEmbedded) {
796
- this.logger.log('Embedded database detected — generating API code in-process');
797
- const heartbeat = (0, nodemon_heartbeat_1.startNodemonHeartbeat)(path.join(process.cwd(), 'src'));
798
- try {
799
- return await this.handleGenerateCode({
800
- modelUserKey: model.singularName,
801
- dryRun: false,
802
- });
803
- }
804
- finally {
805
- heartbeat.stop();
806
- }
807
- }
808
841
  return this.commandService.executeCommandWithArgs({
809
842
  command: 'npx',
810
843
  args: ['@solidxai/solidctl@latest', 'generate', 'model', `--name=${model.singularName}`],