@solidstarters/solid-core 1.2.96 → 1.2.98

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 (81) hide show
  1. package/dist/controllers/action-metadata.controller.js +1 -1
  2. package/dist/controllers/action-metadata.controller.js.map +1 -1
  3. package/dist/controllers/export-template.controller.js +1 -1
  4. package/dist/controllers/export-template.controller.js.map +1 -1
  5. package/dist/controllers/export-transaction.controller.js +1 -1
  6. package/dist/controllers/export-transaction.controller.js.map +1 -1
  7. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  8. package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
  9. package/dist/controllers/permission-metadata.controller.js +1 -1
  10. package/dist/controllers/permission-metadata.controller.js.map +1 -1
  11. package/dist/controllers/role-metadata.controller.js +1 -1
  12. package/dist/controllers/role-metadata.controller.js.map +1 -1
  13. package/dist/controllers/service.controller.d.ts +4 -0
  14. package/dist/controllers/service.controller.d.ts.map +1 -1
  15. package/dist/controllers/service.controller.js +30 -2
  16. package/dist/controllers/service.controller.js.map +1 -1
  17. package/dist/controllers/setting.controller.js +1 -1
  18. package/dist/controllers/setting.controller.js.map +1 -1
  19. package/dist/controllers/test.controller.d.ts +0 -3
  20. package/dist/controllers/test.controller.d.ts.map +1 -1
  21. package/dist/controllers/test.controller.js +0 -24
  22. package/dist/controllers/test.controller.js.map +1 -1
  23. package/dist/controllers/user.controller.js +1 -1
  24. package/dist/controllers/user.controller.js.map +1 -1
  25. package/dist/controllers/view-metadata.controller.js +1 -1
  26. package/dist/controllers/view-metadata.controller.js.map +1 -1
  27. package/dist/helpers/solid-registry.d.ts +6 -1
  28. package/dist/helpers/solid-registry.d.ts.map +1 -1
  29. package/dist/helpers/solid-registry.js +8 -0
  30. package/dist/helpers/solid-registry.js.map +1 -1
  31. package/dist/interfaces.d.ts +3 -6
  32. package/dist/interfaces.d.ts.map +1 -1
  33. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  34. package/dist/seeders/module-metadata-seeder.service.js +1 -1
  35. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  36. package/dist/services/crud-helper.service.d.ts +2 -1
  37. package/dist/services/crud-helper.service.d.ts.map +1 -1
  38. package/dist/services/crud-helper.service.js +12 -2
  39. package/dist/services/crud-helper.service.js.map +1 -1
  40. package/dist/services/crud.service.d.ts.map +1 -1
  41. package/dist/services/crud.service.js +7 -4
  42. package/dist/services/crud.service.js.map +1 -1
  43. package/dist/services/locale.service.d.ts +8 -2
  44. package/dist/services/locale.service.d.ts.map +1 -1
  45. package/dist/services/locale.service.js +17 -4
  46. package/dist/services/locale.service.js.map +1 -1
  47. package/dist/services/model-metadata.service.d.ts.map +1 -1
  48. package/dist/services/model-metadata.service.js +2 -0
  49. package/dist/services/model-metadata.service.js.map +1 -1
  50. package/dist/services/module-metadata.service.d.ts.map +1 -1
  51. package/dist/services/module-metadata.service.js +25 -2
  52. package/dist/services/module-metadata.service.js.map +1 -1
  53. package/dist/subscribers/view-metadata.subscriber.d.ts.map +1 -1
  54. package/dist/subscribers/view-metadata.subscriber.js +16 -14
  55. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  56. package/dist/transformers/datetime-transformer.d.ts.map +1 -1
  57. package/dist/transformers/datetime-transformer.js +3 -1
  58. package/dist/transformers/datetime-transformer.js.map +1 -1
  59. package/dist/tsconfig.tsbuildinfo +1 -1
  60. package/package.json +1 -1
  61. package/src/controllers/action-metadata.controller.ts +1 -1
  62. package/src/controllers/export-template.controller.ts +1 -1
  63. package/src/controllers/export-transaction.controller.ts +1 -1
  64. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  65. package/src/controllers/permission-metadata.controller.ts +1 -1
  66. package/src/controllers/role-metadata.controller.ts +1 -1
  67. package/src/controllers/service.controller.ts +20 -1
  68. package/src/controllers/setting.controller.ts +1 -1
  69. package/src/controllers/test.controller.ts +16 -16
  70. package/src/controllers/user.controller.ts +1 -1
  71. package/src/controllers/view-metadata.controller.ts +1 -1
  72. package/src/helpers/solid-registry.ts +12 -0
  73. package/src/interfaces.ts +3 -3
  74. package/src/seeders/module-metadata-seeder.service.ts +3 -1
  75. package/src/services/crud-helper.service.ts +14 -8
  76. package/src/services/crud.service.ts +7 -5
  77. package/src/services/locale.service.ts +15 -4
  78. package/src/services/model-metadata.service.ts +16 -14
  79. package/src/services/module-metadata.service.ts +28 -4
  80. package/src/subscribers/view-metadata.subscriber.ts +19 -15
  81. package/src/transformers/datetime-transformer.ts +3 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidstarters/solid-core",
3
- "version": "1.2.96",
3
+ "version": "1.2.98",
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",
@@ -7,7 +7,7 @@ import { UpdateActionMetadataDto } from '../dtos/update-action-metadata.dto';
7
7
  import { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';
8
8
  import { SolidRequestContextDecorator } from 'src/decorators/solid-request-context.decorator';
9
9
 
10
- @ApiTags('App')
10
+ @ApiTags('App Builder')
11
11
  @Controller('action-metadata') //FIXME: Change this to the model plural name
12
12
  export class ActionMetadataController {
13
13
  constructor(private readonly service: ActionMetadataService) { }
@@ -7,7 +7,7 @@ import { UpdateExportTemplateDto } from '../dtos/update-export-template.dto';
7
7
  import { Response } from 'express';
8
8
  import { StartExportSyncDto } from 'src/dtos/export.dto';
9
9
 
10
- @ApiTags('Solid')
10
+ @ApiTags('Solid Core')
11
11
  @Controller('export-template') //FIXME: Change this to the model plural name
12
12
  export class ExportTemplateController {
13
13
  constructor(private readonly service: ExportTemplateService) {}
@@ -5,7 +5,7 @@ import { ExportTransactionService } from '../services/export-transaction.service
5
5
  import { CreateExportTransactionDto } from '../dtos/create-export-transaction.dto';
6
6
  import { UpdateExportTransactionDto } from '../dtos/update-export-transaction.dto';
7
7
 
8
- @ApiTags('Solid')
8
+ @ApiTags('Solid Core')
9
9
  @Controller('export-transaction') //FIXME: Change this to the model plural name
10
10
  export class ExportTransactionController {
11
11
  constructor(private readonly service: ExportTransactionService) {}
@@ -9,7 +9,7 @@ import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
9
9
  import { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';
10
10
  import { SolidRequestContextDecorator } from 'src/decorators/solid-request-context.decorator';
11
11
 
12
- @ApiTags('App')
12
+ @ApiTags('App Builder')
13
13
  @Controller('menu-item-metadata') //FIXME: Change this to the model plural name
14
14
  export class MenuItemMetadataController {
15
15
  constructor(private readonly service: MenuItemMetadataService) { }
@@ -7,7 +7,7 @@ import { UpdatePermissionMetadataDto } from '../dtos/update-permission-metadata.
7
7
  import { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';
8
8
  import { SolidRequestContextDecorator } from 'src/decorators/solid-request-context.decorator';
9
9
 
10
- @ApiTags('Solid')
10
+ @ApiTags('Solid Core')
11
11
  @Controller('permission-metadata') //FIXME: Change this to the model plural name
12
12
  export class PermissionMetadataController {
13
13
  constructor(private readonly service: PermissionMetadataService) { }
@@ -7,7 +7,7 @@ import { UpdateRoleMetadataDto } from '../dtos/update-role-metadata.dto';
7
7
  import { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';
8
8
  import { SolidRequestContextDecorator } from 'src/decorators/solid-request-context.decorator';
9
9
 
10
- @ApiTags('Solid')
10
+ @ApiTags('Solid Core')
11
11
  @Controller('role-metadata') //FIXME: Change this to the model plural name
12
12
  export class RoleMetadataController {
13
13
  constructor(private readonly service: RoleMetadataService) {}
@@ -1,4 +1,4 @@
1
- import { Controller, Get } from '@nestjs/common';
1
+ import { Body, Controller, Get, Logger, Post } from '@nestjs/common';
2
2
  import { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core';
3
3
  import { Public } from 'src/decorators/public.decorator';
4
4
  import { SolidRegistry } from '../helpers/solid-registry';
@@ -8,6 +8,8 @@ import { ApiTags } from '@nestjs/swagger';
8
8
  @Controller('')
9
9
  @ApiTags("Common")
10
10
  export class ServiceController {
11
+ private readonly logger = new Logger(ServiceController.name);
12
+
11
13
  constructor(
12
14
  private readonly solidRegistry: SolidRegistry,
13
15
  ) { }
@@ -18,6 +20,23 @@ export class ServiceController {
18
20
  return { pong: 'v1.0.2' };
19
21
  }
20
22
 
23
+ @Public()
24
+ @Post('seed')
25
+ async seedData(@Body() seedData: any) {
26
+ const seeder = this.solidRegistry
27
+ .getSeeders()
28
+ .filter((seeder) => seeder.name === seedData.seeder)
29
+ .map((seeder) => seeder.instance)
30
+ .pop();
31
+ if (!seeder) {
32
+ this.logger.error(`Seeder service ${seedData.seeder} not found. Does your service have a seed() method?`);
33
+ return;
34
+ }
35
+ this.logger.log(`Running the seed() method for seeder :${seeder.constructor.name}`);
36
+ await seeder.seed();
37
+ return { message: `seed data for ${seedData.seeder}` };
38
+ }
39
+
21
40
  // @Public()
22
41
  // @Get('play')
23
42
  // play() {
@@ -8,7 +8,7 @@ import { SolidRequestContextDecorator } from 'src/decorators/solid-request-conte
8
8
  import { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';
9
9
  import { UpdateSettingsDto } from 'src/dtos/update-settings.dto';
10
10
 
11
- @ApiTags('Solid')
11
+ @ApiTags('Solid Core')
12
12
  @Controller('setting') //FIXME: Change this to the model plural name
13
13
  export class SettingController {
14
14
  constructor(private readonly service: SettingService) {}
@@ -34,21 +34,21 @@ export class TestController {
34
34
  return { filename: file.originalname };
35
35
  }
36
36
 
37
- @Public()
38
- @Post('seed')
39
- async seedData(@Body() seedData: any) {
40
- const seeder = this.solidRegistry
41
- .getSeeders()
42
- .filter((seeder) => seeder.name === seedData.seeder)
43
- .map((seeder) => seeder.instance)
44
- .pop();
45
- if (!seeder) {
46
- this.logger.error(`Seeder service ${seedData.seeder} not found. Does your service have a seed() method?`);
47
- return;
48
- }
49
- this.logger.log(`Running the seed() method for seeder :${seeder.constructor.name}`);
50
- await seeder.seed();
51
- return { message: `seed data for ${seedData.seeder}` };
52
- }
37
+ // @Public()
38
+ // @Post('seed')
39
+ // async seedData(@Body() seedData: any) {
40
+ // const seeder = this.solidRegistry
41
+ // .getSeeders()
42
+ // .filter((seeder) => seeder.name === seedData.seeder)
43
+ // .map((seeder) => seeder.instance)
44
+ // .pop();
45
+ // if (!seeder) {
46
+ // this.logger.error(`Seeder service ${seedData.seeder} not found. Does your service have a seed() method?`);
47
+ // return;
48
+ // }
49
+ // this.logger.log(`Running the seed() method for seeder :${seeder.constructor.name}`);
50
+ // await seeder.seed();
51
+ // return { message: `seed data for ${seedData.seeder}` };
52
+ // }
53
53
 
54
54
  }
@@ -11,7 +11,7 @@ import { ActiveUserData } from '../interfaces/active-user-data.interface';
11
11
  import { SolidRequestContextDecorator } from 'src/decorators/solid-request-context.decorator';
12
12
  import { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';
13
13
 
14
- @ApiTags('Solid')
14
+ @ApiTags('Solid Core')
15
15
  @Controller('user') //FIXME: Change this to the model plural name
16
16
  export class UserController {
17
17
  constructor(private readonly service: UserService) { }
@@ -9,7 +9,7 @@ import { SolidRequestContextDto } from 'src/dtos/solid-request-context.dto';
9
9
  import { ActiveUser } from 'src/decorators/active-user.decorator';
10
10
  import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
11
11
 
12
- @ApiTags('App')
12
+ @ApiTags('App Builder')
13
13
  @Controller('view-metadata') //FIXME: Change this to the model plural name
14
14
  export class ViewMetadataController {
15
15
  constructor(private readonly service: ViewMetadataService) { }
@@ -3,6 +3,7 @@ import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
3
3
  import { ISelectionProvider, ISelectionProviderContext } from "../interfaces";
4
4
  import { SecurityRule } from 'src/entities/security-rule.entity';
5
5
  import { EntityManager } from 'typeorm';
6
+ import { Locale } from 'src/entities/locale.entity';
6
7
 
7
8
  type ControllerMetadata = {
8
9
  name: string;
@@ -33,6 +34,7 @@ export enum RESERVED_SOLID_KEYWORDS {
33
34
  userPasswordHistory = "userPasswordHistory",
34
35
  userMetadata = "userMetadata",
35
36
  user = "user",
37
+ locale = "locale"
36
38
  }
37
39
 
38
40
  @Injectable()
@@ -44,6 +46,7 @@ export class SolidRegistry {
44
46
  private controllers: Set<ControllerMetadata> = new Set();
45
47
  private modules: Set<InstanceWrapper> = new Set();
46
48
  private securityRules: SecurityRule[] = [];
49
+ private locales : Locale[] = [];
47
50
 
48
51
  registerController(name: string, methodNames: string[]): void {
49
52
  this.controllers.add({ name: name, methods: methodNames });
@@ -117,6 +120,15 @@ export class SolidRegistry {
117
120
  this.securityRules = securityRules;
118
121
  }
119
122
 
123
+ registerlocales(locales : Locale[]){
124
+ this.locales = locales;
125
+ }
126
+
127
+ //TODO:getlocales from locale model and return default locale where isDefault:true
128
+ getDefaultLocale(): Locale | null {
129
+ return this.locales.find(locale => locale.isDefault === true) || null;
130
+ }
131
+
120
132
  getSecurityRules(modelSingularName: string, roleNames: string[] = []): SecurityRule[] {
121
133
  // If no role is provided, return all security rules for the model
122
134
  if (roleNames.length === 0) {
package/src/interfaces.ts CHANGED
@@ -43,9 +43,9 @@ export interface ModuleMetadataConfiguration {
43
43
  moduleMetadata?: CreateModuleMetadataDto,
44
44
  roles?: CreateRoleMetadataDto[],
45
45
  users?: SignUpDto[],
46
- actions?: CreateActionMetadataDto[],
47
- menus?: CreateMenuItemMetadataDto[],
48
- views?: CreateViewMetadataDto[],
46
+ actions?: any[],
47
+ menus?: any[],
48
+ views?: any[],
49
49
  emailTemplates?: CreateEmailTemplateDto[],
50
50
  smsTemplates?: CreateSmsTemplateDto[],
51
51
  mediaStorageProviders?: CreateMediaStorageProviderMetadataDto[]
@@ -409,8 +409,10 @@ export class ModuleMetadataSeederService {
409
409
  viewData['model'] = await this.modelMetadataService.findOneByUserKey(viewData.modelUserKey);
410
410
  // await this.solidViewService.upsert(viewData);
411
411
  // First check if module already exists using name
412
- await this.solidViewService.createIfNotPresent(viewData);
413
412
 
413
+ // Changed the below to upsert as now we are saving modifications to the view json to file system also.
414
+ // await this.solidViewService.createIfNotPresent(viewData);
415
+ await this.solidViewService.upsert(viewData);
414
416
  }
415
417
  }
416
418
 
@@ -2,12 +2,14 @@ import { Brackets, SelectQueryBuilder, WhereExpressionBuilder } from "typeorm";
2
2
  import { BasicFilterDto } from "../dtos/basic-filters.dto";
3
3
  import { classify } from "@angular-devkit/core/src/utils/strings";
4
4
  import { ActiveUserData } from "src/interfaces/active-user-data.interface";
5
+ import { SolidRegistry } from "src/helpers/solid-registry";
6
+ import { Logger } from "@nestjs/common";
7
+
5
8
 
6
9
  export class CrudHelperService {
7
10
  constructor(
8
-
9
11
  ) { }
10
-
12
+ private readonly logger = new Logger(CrudHelperService.name);
11
13
 
12
14
  private orderOptions(sort: any[] = []) {
13
15
  const orderOptions = {};
@@ -154,8 +156,8 @@ export class CrudHelperService {
154
156
  private hasJoins(queryBuilder: SelectQueryBuilder<any>): boolean {
155
157
  return queryBuilder.expressionMap.joinAttributes.length > 0;
156
158
  }
157
-
158
- buildFilterQuery(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string, internationalisation?: boolean, draftPublishWorkflow?: boolean): SelectQueryBuilder<any> { // TODO : Check how to pass a type to SelectQueryBuilder instead of any
159
+
160
+ buildFilterQuery(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string, internationalisation?: boolean, draftPublishWorkflow?: boolean,moduleRef?:any): SelectQueryBuilder<any> { // TODO : Check how to pass a type to SelectQueryBuilder instead of any
159
161
  let { limit, offset, showSoftDeleted, filters } = basicFilterDto;
160
162
  const { fields, sort, groupBy, populate = [], populateMedia = [], locale, status } = basicFilterDto;
161
163
 
@@ -190,10 +192,14 @@ export class CrudHelperService {
190
192
  if (internationalisation) {
191
193
  // If locale is not provided in the filter dto, then assume it is the default locale to be used.
192
194
  if (!finalLocale) {
193
- // TODO: get the default locale from the database.
194
- // This should be replaced with the actual default locale from the database, make sure to cache this request.
195
- // @Sundaram consult with Oswald and use a registry based approach to fetch the default locale, making sure that it gets cached and we don't have to query again and again.
196
- finalLocale = 'en';
195
+ //Get default locale from registry
196
+ const solidRegistry = moduleRef.get(SolidRegistry, { strict: false });
197
+ const defaultLocale = solidRegistry.getDefaultLocale();
198
+ if(defaultLocale){
199
+ finalLocale = defaultLocale.locale;
200
+ }else{
201
+ finalLocale = 'en';
202
+ }
197
203
  }
198
204
  qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });
199
205
  }
@@ -426,13 +426,15 @@ export class CRUDService<T> { // Add two generic value i.e Person,CreatePersonDt
426
426
  // Create above query on pincode table using query builder
427
427
  var qb: SelectQueryBuilder<T> = this.repo.createQueryBuilder(alias)
428
428
  qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
429
-
429
+ if(internationalisation && draftPublishWorkflow){
430
+ qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias,internationalisation, draftPublishWorkflow,this.moduleRef);
431
+ }
430
432
 
431
433
  if (basicFilterDto.groupBy) {
432
434
  // Get the records and the count
433
- const { groupMeta, groupRecords } = await this.handleGroupFind(qb, groupFilter, populateGroup, alias, populateMedia, internationalisation, draftPublishWorkflow);
435
+ const { groupMeta, groupRecords } = await this.handleGroupFind(qb, groupFilter, populateGroup, alias, populateMedia);
434
436
  const totalGroups = await this.crudHelperService.countGroupedRecords(qb, basicFilterDto, alias);
435
- qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow);
437
+ qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
436
438
 
437
439
  return {
438
440
  meta: {
@@ -463,7 +465,7 @@ export class CRUDService<T> { // Add two generic value i.e Person,CreatePersonDt
463
465
  return this.wrapFindResponse(offset, limit, count, entities);
464
466
  }
465
467
 
466
- private async handleGroupFind(qb: SelectQueryBuilder<T>, groupFilter: BasicFilterDto, populateGroup: boolean, alias: string, populateMedia: string[], internationalisation: boolean, draftPublishWorkflow: boolean) {
468
+ private async handleGroupFind(qb: SelectQueryBuilder<T>, groupFilter: BasicFilterDto, populateGroup: boolean, alias: string, populateMedia: string[]) {
467
469
  const groupByResult = await qb.getRawMany();
468
470
 
469
471
  const groupMeta = [];
@@ -472,7 +474,7 @@ export class CRUDService<T> { // Add two generic value i.e Person,CreatePersonDt
472
474
  for (const group of groupByResult) {
473
475
  if (populateGroup) {
474
476
  let groupByQb: SelectQueryBuilder<T> = this.repo.createQueryBuilder(alias);
475
- groupByQb = this.crudHelperService.buildFilterQuery(groupByQb, groupFilter, alias, internationalisation, draftPublishWorkflow);
477
+ groupByQb = this.crudHelperService.buildFilterQuery(groupByQb, groupFilter, alias);
476
478
  groupByQb = this.crudHelperService.buildGroupByRecordsQuery(groupByQb, group, alias);
477
479
  const [entities, count] = await groupByQb.getManyAndCount();
478
480
 
@@ -1,4 +1,4 @@
1
- import { Injectable } from '@nestjs/common';
1
+ import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
2
2
  import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
3
3
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
4
  import { EntityManager, Repository } from 'typeorm';
@@ -12,8 +12,9 @@ import { CrudHelperService } from 'src/services/crud-helper.service';
12
12
  import { ModelMetadata } from 'src/entities/model-metadata.entity';
13
13
  import { RequestContextService } from './request-context.service';
14
14
  import { Locale } from 'src/entities/locale.entity';
15
+ import { SolidRegistry } from 'src/helpers/solid-registry';
15
16
  @Injectable()
16
- export class LocaleService extends CRUDService<Locale>{
17
+ export class LocaleService extends CRUDService<Locale> implements OnApplicationBootstrap{
17
18
  constructor(
18
19
  readonly modelMetadataService: ModelMetadataService,
19
20
  readonly moduleMetadataService: ModuleMetadataService,
@@ -29,9 +30,19 @@ export class LocaleService extends CRUDService<Locale>{
29
30
  readonly moduleRef: ModuleRef,
30
31
  @InjectRepository(ModelMetadata)
31
32
  private readonly modelMetadataRepo: Repository<ModelMetadata>,
32
- readonly requestContextService: RequestContextService
33
+ readonly requestContextService: RequestContextService,
34
+ readonly solidRegistry: SolidRegistry,
33
35
  ) {
34
36
  super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService,entityManager, repo, 'locale', 'solid-core', moduleRef);
35
37
  }
36
-
38
+ private readonly logger = new Logger(LocaleService.name)
39
+ onApplicationBootstrap() {
40
+ // Load the security rules from the database
41
+ this.loadLocales();
42
+ }
43
+ async loadLocales() {
44
+ const locales = await this.repo.find();
45
+ this.logger.debug(`Loaded ${locales.length} locales into registry`);
46
+ this.solidRegistry.registerlocales(locales);
47
+ }
37
48
  }
@@ -184,7 +184,7 @@ export class ModelMetadataService {
184
184
  relations: {},
185
185
  });
186
186
  createDto['module'] = resolvedModule;
187
-
187
+
188
188
  if (createDto['parentModelId']) {
189
189
  const resolvedParentModel = await this.dataSource
190
190
  .getRepository(ModelMetadata)
@@ -261,6 +261,7 @@ export class ModelMetadataService {
261
261
  userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,
262
262
  isChild: model?.isChild,
263
263
  parentModelUserKey: model?.parentModel?.singularName,
264
+ enableAuditTracking: model?.enableAuditTracking,
264
265
  fields: []
265
266
  }
266
267
 
@@ -420,6 +421,7 @@ export class ModelMetadataService {
420
421
  userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,
421
422
  isChild: model?.isChild,
422
423
  parentModelUserKey: model?.parentModel?.singularName,
424
+ enableAuditTracking: model?.enableAuditTracking,
423
425
  fields: []
424
426
  }
425
427
 
@@ -685,23 +687,23 @@ export class ModelMetadataService {
685
687
  };
686
688
 
687
689
  // Utility function to check if an item with the same name already exists
688
- const notExists = (arr: any[], name: string) => !arr.some(item => item.name === name);
690
+ const notExists = (arr: any[], name: string) => !arr.some(item => item.name === name);
689
691
 
690
- if (notExists(metaData.menus, menuName)) {
691
- metaData.menus.push(menu);
692
- }
692
+ if (notExists(metaData.menus, menuName)) {
693
+ metaData.menus.push(menu);
694
+ }
693
695
 
694
- if (notExists(metaData.actions, viewName)) {
695
- metaData.actions.push(action);
696
- }
696
+ if (notExists(metaData.actions, viewName)) {
697
+ metaData.actions.push(action);
698
+ }
697
699
 
698
- if (notExists(metaData.views, viewName)) {
699
- metaData.views.push(modelListview);
700
- }
700
+ if (notExists(metaData.views, viewName)) {
701
+ metaData.views.push(modelListview);
702
+ }
701
703
 
702
- if (notExists(metaData.views, formViewName)) {
703
- metaData.views.push(modelFormView);
704
- }
704
+ if (notExists(metaData.views, formViewName)) {
705
+ metaData.views.push(modelFormView);
706
+ }
705
707
  // metaData.menus.push(menu);
706
708
  // metaData.actions.push(action);
707
709
  // metaData.views.push(modelListview);
@@ -131,6 +131,7 @@ export class ModuleMetadataService {
131
131
  async createInFile(module: ModuleMetadata) {
132
132
  try {
133
133
  // Prepare the metadata JSON structure
134
+
134
135
  const moduleMetaDataJson: ModuleMetadataConfiguration = {
135
136
  moduleMetadata: {
136
137
  name: module?.name,
@@ -144,8 +145,31 @@ export class ModuleMetadataService {
144
145
  },
145
146
  roles: [],
146
147
  users: [],
147
- actions: [],
148
- menus: [],
148
+ actions: [
149
+ {
150
+ displayName: `${module?.name} Home`,
151
+ name: `${module?.name}-home-action`,
152
+ type: "custom",
153
+ domain: "",
154
+ context: "",
155
+ customComponent: `/admin/core/${module?.name}/home`,
156
+ customIsModal: true,
157
+ serverEndpoint: "",
158
+ viewUserKey: "",
159
+ moduleUserKey: module?.name,
160
+ modelUserKey: ""
161
+ }
162
+ ],
163
+ menus: [
164
+ {
165
+ displayName: "Home",
166
+ name: `${module?.name}-home-menu`,
167
+ sequenceNumber: 1,
168
+ actionUserKey: `${module?.name}-home-action`,
169
+ moduleUserKey: module?.name,
170
+ parentMenuItemUserKey: ""
171
+ }
172
+ ],
149
173
  views: [],
150
174
  emailTemplates: [],
151
175
  smsTemplates: [],
@@ -325,7 +349,7 @@ export class ModuleMetadataService {
325
349
  return true
326
350
  }
327
351
 
328
- async generateCode(options: CodeGenerationOptions): Promise<string> {
352
+ async generateCode(options: CodeGenerationOptions): Promise<string> {
329
353
  if (!options.moduleId && !options.moduleUserKey) {
330
354
  throw new BadRequestException('Module ID or Module Name is required for generating code');
331
355
  }
@@ -338,7 +362,7 @@ export class ModuleMetadataService {
338
362
 
339
363
  // Check if the module name already exists and is loaded
340
364
  const moduleInstance = this.solidRegistry.getModule(`${classify(module.name)}Module`);
341
-
365
+
342
366
  if (!moduleInstance) {
343
367
  const addModuleOutput = await this.generateAddModuleCode(options);
344
368
  const refreshModuleOutput = await this.generateRefreshModuleCode(options);
@@ -37,22 +37,26 @@ export class ViewMetadataSubsciber implements EntitySubscriberInterface<ViewMeta
37
37
  if (!viewMetadata) {
38
38
  throw new Error(`View metadata not found for id ${event.entity.id}`);
39
39
  }
40
- const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(viewMetadata.model.module.name);
41
- try {
42
- await fs.access(filePath);
43
- } catch (error) {
44
- this.logger.error(`File not found at path: ${filePath}`);
45
- return;
46
- }
47
- const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
48
40
 
49
- // Update the view metadata in the module metadata
50
- const viewMetadataIndex = metaData.views.findIndex((view: { name: string }) => view.name === event.entity.name);
51
- if (viewMetadataIndex !== -1) {
52
- metaData.views[viewMetadataIndex].layout = JSON.parse(event.entity.layout);
41
+ // solid-core module metadata file is stored in the npm package when installed, so we do not propogate those changes to the solid-core-metadata.json file
42
+ if (viewMetadata.model.module.name != "solid-core") {
43
+ const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(viewMetadata.model.module.name);
44
+ try {
45
+ await fs.access(filePath);
46
+ } catch (error) {
47
+ this.logger.error(`File not found at path: ${filePath}`);
48
+ return;
49
+ }
50
+ const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
51
+
52
+ // Update the view metadata in the module metadata
53
+ const viewMetadataIndex = metaData.views.findIndex((view: { name: string }) => view.name === event.entity.name);
54
+ if (viewMetadataIndex !== -1) {
55
+ metaData.views[viewMetadataIndex].layout = JSON.parse(event.entity.layout);
56
+ }
57
+ // Write the updated object back to the file
58
+ const updatedContent = JSON.stringify(metaData, null, 2);
59
+ await fs.writeFile(filePath, updatedContent);
53
60
  }
54
- // Write the updated object back to the file
55
- const updatedContent = JSON.stringify(metaData, null, 2);
56
- await fs.writeFile(filePath, updatedContent);
57
61
  }
58
62
  }
@@ -1,8 +1,8 @@
1
+ import { Logger } from '@nestjs/common';
1
2
  import { TransformFnParams } from 'class-transformer';
2
-
3
+ const logger = new Logger('datetimeTransformer');
3
4
  const datetimeTransformer = ({ value }: TransformFnParams): Date | null => {
4
- console.log("date time transformer debug", value);
5
-
5
+ logger.debug("date time transformer debug", value);
6
6
  if (value === '' || value === undefined || value === null) return null;
7
7
 
8
8
  const parsed = new Date(value);