@solidstarters/solid-core 1.2.97 → 1.2.99

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 (146) 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.d.ts +1 -1
  18. package/dist/controllers/setting.controller.d.ts.map +1 -1
  19. package/dist/controllers/setting.controller.js +6 -4
  20. package/dist/controllers/setting.controller.js.map +1 -1
  21. package/dist/controllers/test.controller.d.ts +0 -3
  22. package/dist/controllers/test.controller.d.ts.map +1 -1
  23. package/dist/controllers/test.controller.js +0 -24
  24. package/dist/controllers/test.controller.js.map +1 -1
  25. package/dist/controllers/user.controller.js +1 -1
  26. package/dist/controllers/user.controller.js.map +1 -1
  27. package/dist/controllers/view-metadata.controller.js +1 -1
  28. package/dist/controllers/view-metadata.controller.js.map +1 -1
  29. package/dist/dtos/update-settings.dto.d.ts.map +1 -1
  30. package/dist/dtos/update-settings.dto.js +1 -2
  31. package/dist/dtos/update-settings.dto.js.map +1 -1
  32. package/dist/entities/common.entity.d.ts +3 -0
  33. package/dist/entities/common.entity.d.ts.map +1 -1
  34. package/dist/entities/common.entity.js +9 -1
  35. package/dist/entities/common.entity.js.map +1 -1
  36. package/dist/entities/menu-item-metadata.entity.js +1 -1
  37. package/dist/entities/menu-item-metadata.entity.js.map +1 -1
  38. package/dist/helpers/field-crud-managers/PasswordFieldCrudManager.d.ts +1 -0
  39. package/dist/helpers/field-crud-managers/PasswordFieldCrudManager.d.ts.map +1 -1
  40. package/dist/helpers/field-crud-managers/PasswordFieldCrudManager.js +3 -1
  41. package/dist/helpers/field-crud-managers/PasswordFieldCrudManager.js.map +1 -1
  42. package/dist/helpers/model-metadata-helper.service.d.ts +8 -0
  43. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -0
  44. package/dist/helpers/model-metadata-helper.service.js +118 -0
  45. package/dist/helpers/model-metadata-helper.service.js.map +1 -0
  46. package/dist/helpers/schematic.service.d.ts +4 -1
  47. package/dist/helpers/schematic.service.d.ts.map +1 -1
  48. package/dist/helpers/schematic.service.js +8 -10
  49. package/dist/helpers/schematic.service.js.map +1 -1
  50. package/dist/helpers/solid-registry.d.ts +3 -1
  51. package/dist/helpers/solid-registry.d.ts.map +1 -1
  52. package/dist/helpers/solid-registry.js +4 -0
  53. package/dist/helpers/solid-registry.js.map +1 -1
  54. package/dist/index.d.ts +2 -2
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +7 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/interfaces.d.ts +3 -6
  59. package/dist/interfaces.d.ts.map +1 -1
  60. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  61. package/dist/seeders/module-metadata-seeder.service.js +1 -1
  62. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  63. package/dist/seeders/system-fields-seeder.service.d.ts +13 -0
  64. package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -0
  65. package/dist/seeders/system-fields-seeder.service.js +56 -0
  66. package/dist/seeders/system-fields-seeder.service.js.map +1 -0
  67. package/dist/services/authentication.service.js +4 -4
  68. package/dist/services/authentication.service.js.map +1 -1
  69. package/dist/services/computed-fields/concat-computed-field-provider.service.d.ts.map +1 -1
  70. package/dist/services/computed-fields/concat-computed-field-provider.service.js +3 -0
  71. package/dist/services/computed-fields/concat-computed-field-provider.service.js.map +1 -1
  72. package/dist/services/crud.service.d.ts +1 -1
  73. package/dist/services/crud.service.d.ts.map +1 -1
  74. package/dist/services/crud.service.js +7 -6
  75. package/dist/services/crud.service.js.map +1 -1
  76. package/dist/services/model-metadata.service.d.ts.map +1 -1
  77. package/dist/services/model-metadata.service.js +3 -0
  78. package/dist/services/model-metadata.service.js.map +1 -1
  79. package/dist/services/module-metadata.service.d.ts.map +1 -1
  80. package/dist/services/module-metadata.service.js +25 -2
  81. package/dist/services/module-metadata.service.js.map +1 -1
  82. package/dist/services/setting.service.d.ts +1 -1
  83. package/dist/services/setting.service.d.ts.map +1 -1
  84. package/dist/services/setting.service.js +27 -1
  85. package/dist/services/setting.service.js.map +1 -1
  86. package/dist/solid-core.module.d.ts.map +1 -1
  87. package/dist/solid-core.module.js +8 -2
  88. package/dist/solid-core.module.js.map +1 -1
  89. package/dist/subscribers/audit.subscriber.d.ts +4 -5
  90. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  91. package/dist/subscribers/audit.subscriber.js +12 -12
  92. package/dist/subscribers/audit.subscriber.js.map +1 -1
  93. package/dist/subscribers/created-by-updated-by.subscriber.d.ts +12 -0
  94. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -0
  95. package/dist/subscribers/created-by-updated-by.subscriber.js +67 -0
  96. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -0
  97. package/dist/subscribers/model.subscriber.d.ts +4 -1
  98. package/dist/subscribers/model.subscriber.d.ts.map +1 -1
  99. package/dist/subscribers/model.subscriber.js +20 -67
  100. package/dist/subscribers/model.subscriber.js.map +1 -1
  101. package/dist/subscribers/{softDeleteAwareEventSubscriber.subscriber.d.ts → soft-delete-aware-event.subscriber.d.ts} +1 -1
  102. package/dist/subscribers/soft-delete-aware-event.subscriber.d.ts.map +1 -0
  103. package/dist/subscribers/{softDeleteAwareEventSubscriber.subscriber.js → soft-delete-aware-event.subscriber.js} +1 -1
  104. package/dist/subscribers/soft-delete-aware-event.subscriber.js.map +1 -0
  105. package/dist/subscribers/view-metadata.subscriber.d.ts.map +1 -1
  106. package/dist/subscribers/view-metadata.subscriber.js +16 -14
  107. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  108. package/dist/tsconfig.tsbuildinfo +1 -1
  109. package/package.json +1 -1
  110. package/src/controllers/action-metadata.controller.ts +1 -1
  111. package/src/controllers/export-template.controller.ts +1 -1
  112. package/src/controllers/export-transaction.controller.ts +1 -1
  113. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  114. package/src/controllers/permission-metadata.controller.ts +1 -1
  115. package/src/controllers/role-metadata.controller.ts +1 -1
  116. package/src/controllers/service.controller.ts +20 -1
  117. package/src/controllers/setting.controller.ts +4 -3
  118. package/src/controllers/test.controller.ts +16 -16
  119. package/src/controllers/user.controller.ts +1 -1
  120. package/src/controllers/view-metadata.controller.ts +1 -1
  121. package/src/dtos/update-settings.dto.ts +2 -3
  122. package/src/entities/common.entity.ts +8 -2
  123. package/src/entities/menu-item-metadata.entity.ts +1 -1
  124. package/src/helpers/field-crud-managers/PasswordFieldCrudManager.ts +5 -1
  125. package/src/helpers/model-metadata-helper.service.ts +109 -0
  126. package/src/helpers/schematic.service.ts +10 -11
  127. package/src/helpers/solid-registry.ts +6 -1
  128. package/src/index.ts +2 -2
  129. package/src/interfaces.ts +3 -3
  130. package/src/seeders/module-metadata-seeder.service.ts +3 -1
  131. package/src/seeders/system-fields-seeder.service.ts +53 -0
  132. package/src/services/authentication.service.ts +4 -4
  133. package/src/services/computed-fields/concat-computed-field-provider.service.ts +3 -0
  134. package/src/services/crud.service.ts +7 -6
  135. package/src/services/model-metadata.service.ts +17 -15
  136. package/src/services/module-metadata.service.ts +28 -4
  137. package/src/services/setting.service.ts +30 -1
  138. package/src/solid-core.module.ts +8 -1
  139. package/src/subscribers/audit.subscriber.ts +10 -11
  140. package/src/subscribers/created-by-updated-by.subscriber.ts +54 -0
  141. package/src/subscribers/model.subscriber.ts +16 -70
  142. package/src/subscribers/view-metadata.subscriber.ts +19 -15
  143. package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.d.ts.map +0 -1
  144. package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.js.map +0 -1
  145. package/src/services/pending_import_issues +0 -3
  146. /package/src/subscribers/{softDeleteAwareEventSubscriber.subscriber.ts → soft-delete-aware-event.subscriber.ts} +0 -0
@@ -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);
@@ -926,7 +928,7 @@ export class ModelMetadataService {
926
928
  modelEnableSoftDelete: model.enableSoftDelete,
927
929
  parentModel: model.parentModel?.singularName,
928
930
  parentModule: model.parentModel?.module?.name,
929
-
931
+ draftPublishWorkflowEnabled: model.draftPublishWorkflow,
930
932
  },
931
933
  dryRun
932
934
  );
@@ -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);
@@ -48,6 +48,7 @@ export class SettingService extends CRUDService<Setting> {
48
48
  authPagesLayout: "center",
49
49
  authPagesTheme: "light",
50
50
  appLogo: "",
51
+ companylogo: "",
51
52
  appLogoPosition: "in_form_view",
52
53
  showAuthContent: false,
53
54
  appTitle: process.env.SOLID_APP_NAME || "Solid App",
@@ -130,6 +131,7 @@ export class SettingService extends CRUDService<Setting> {
130
131
  authPagesLayout: "center",
131
132
  authPagesTheme: "light",
132
133
  appLogo: "",
134
+ companylogo: "",
133
135
  appLogoPosition: "in_form_view", //in_form_view | in_image_view
134
136
  showAuthContent: false,
135
137
  appTitle: process.env.SOLID_APP_NAME || "Solid App",
@@ -176,14 +178,41 @@ export class SettingService extends CRUDService<Setting> {
176
178
  }
177
179
  }
178
180
 
179
- async updateSettings(settings: Record<string, any>): Promise<Setting[]> {
181
+ async updateSettings(settings: Record<string, any> = {}, files: Array<Express.Multer.File> = []): Promise<Setting[]> {
180
182
  const existingSettings = await this.repo.find();
181
183
  const existingKeys = new Set(existingSettings.map(s => s.key));
182
184
 
183
185
  const settingsToUpdate: Setting[] = [];
184
186
  const settingsToCreate: Setting[] = [];
185
187
 
188
+ if (files && files.length > 0) {
189
+ for (const file of files) {
190
+ const key = file.fieldname;
191
+ const fileStoragePath = `${this.configService.get('app-builder.fileStorageDir')}/${file.filename}-${file.originalname}`;
192
+
193
+ await this.fileService.copyFile(file.path, fileStoragePath);
194
+ await this.fileService.deleteFile(file.path);
195
+
196
+ if (existingKeys.has(key)) {
197
+ const existingSetting = existingSettings.find(s => s.key === key);
198
+ if (existingSetting) {
199
+ existingSetting.value = fileStoragePath;
200
+ settingsToUpdate.push(existingSetting);
201
+ }
202
+ } else {
203
+ const newSetting = new Setting();
204
+ newSetting.key = key;
205
+ newSetting.value = fileStoragePath;
206
+ settingsToCreate.push(newSetting);
207
+ }
208
+ }
209
+ }
210
+
186
211
  for (const [key, value] of Object.entries(settings)) {
212
+ if (files && files.some(f => f.fieldname === key)) {
213
+ continue;
214
+ }
215
+
187
216
  const stringValue = typeof value === 'boolean' ? value.toString() :
188
217
  Array.isArray(value) ? value.join(',') :
189
218
  value === null || value === undefined ? '' : String(value);
@@ -119,7 +119,7 @@ import { Msg91OTPService } from './services/sms/Msg91OTPService';
119
119
  import { Msg91SMSService } from './services/sms/Msg91SMSService';
120
120
  // import { UserService } from './services/user.service';
121
121
  import { Msg91WhatsappService } from './services/whatsapp/Msg91WhatsappService';
122
- import { SoftDeleteAwareEventSubscriber } from './subscribers/softDeleteAwareEventSubscriber.subscriber';
122
+ import { SoftDeleteAwareEventSubscriber } from './subscribers/soft-delete-aware-event.subscriber';
123
123
 
124
124
  import { PermissionMetadataController } from './controllers/permission-metadata.controller';
125
125
  import { PermissionMetadata } from './entities/permission-metadata.entity';
@@ -181,6 +181,9 @@ import { ImportTransactionErrorLog } from './entities/import-transaction-error-l
181
181
  import { ImportTransactionErrorLogService } from './services/import-transaction-error-log.service';
182
182
  import { ImportTransactionErrorLogController } from './controllers/import-transaction-error-log.controller';
183
183
  import { LocaleListSelectionProvider } from './services/selection-providers/locale-list-selection-provider.service';
184
+ import { CreatedByUpdatedBySubscriber } from './subscribers/created-by-updated-by.subscriber';
185
+ import { SystemFieldsSeederService } from './seeders/system-fields-seeder.service';
186
+ import { ModelMetadataHelperService } from './helpers/model-metadata-helper.service';
184
187
 
185
188
 
186
189
  @Global()
@@ -299,6 +302,7 @@ import { LocaleListSelectionProvider } from './services/selection-providers/loca
299
302
  ModuleMetadataService,
300
303
  ModuleMetadataHelperService,
301
304
  ModelMetadataService,
305
+ ModelMetadataHelperService,
302
306
  FieldMetadataService,
303
307
  RemoveFieldsCommand,
304
308
  RefreshModelCommand,
@@ -391,6 +395,9 @@ import { LocaleListSelectionProvider } from './services/selection-providers/loca
391
395
  FieldRepository,
392
396
  ImportTransactionService,
393
397
  ImportTransactionErrorLogService,
398
+ CreatedByUpdatedBySubscriber,
399
+ SystemFieldsSeederService,
400
+
394
401
  ],
395
402
  exports: [
396
403
  ModuleMetadataService,
@@ -1,21 +1,20 @@
1
- import { Connection, EntitySubscriberInterface, EventSubscriber, InsertEvent, RemoveEvent, UpdateEvent } from 'typeorm';
2
- import { ChatterMessageService } from '../services/chatter-message.service';
3
- import { EntityMetadata } from 'typeorm';
4
- import { InjectRepository } from '@nestjs/typeorm';
5
- import { ModelMetadata } from '../entities/model-metadata.entity';
6
- import { Repository } from 'typeorm';
7
1
  import { Injectable } from '@nestjs/common';
2
+ import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
3
+ import { DataSource, EntityMetadata, EntitySubscriberInterface, EventSubscriber, InsertEvent, RemoveEvent, Repository, UpdateEvent } from 'typeorm';
4
+ import { ModelMetadata } from '../entities/model-metadata.entity';
5
+ import { ChatterMessageService } from '../services/chatter-message.service';
8
6
  @Injectable()
9
7
  @EventSubscriber()
10
8
  export class AuditSubscriber implements EntitySubscriberInterface {
11
-
9
+
12
10
  constructor(
13
- private readonly connection: Connection,
11
+ @InjectDataSource()
12
+ private readonly dataSource: DataSource,
14
13
  private readonly chatterMessageService: ChatterMessageService,
15
14
  @InjectRepository(ModelMetadata)
16
15
  private readonly modelMetadataRepo: Repository<ModelMetadata>,
17
16
  ) {
18
- connection.subscribers.push(this);
17
+ this.dataSource.subscribers.push(this);
19
18
  }
20
19
 
21
20
  private async shouldTrackAudit(entity: any, metadata: EntityMetadata): Promise<boolean> {
@@ -33,8 +32,8 @@ export class AuditSubscriber implements EntitySubscriberInterface {
33
32
  return false;
34
33
  }
35
34
 
36
- const auditFields = model.fields.filter(field =>
37
- field.enableAuditTracking &&
35
+ const auditFields = model.fields.filter(field =>
36
+ field.enableAuditTracking &&
38
37
  !['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&
39
38
  !(field.type === 'relation' && field.relationType === 'one-to-many')
40
39
  );
@@ -0,0 +1,54 @@
1
+ import { Injectable } from "@nestjs/common";
2
+ import { InjectDataSource } from "@nestjs/typeorm";
3
+ import { User } from "src/entities/user.entity";
4
+ import { ActiveUserData } from "src/interfaces/active-user-data.interface";
5
+ import { RequestContextService } from "src/services/request-context.service";
6
+ import { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent, UpdateEvent } from "typeorm";
7
+
8
+ @Injectable()
9
+ @EventSubscriber()
10
+ export class CreatedByUpdatedBySubscriber implements EntitySubscriberInterface {
11
+ constructor(
12
+ @InjectDataSource()
13
+ private readonly dataSource: DataSource,
14
+ private readonly requestContextService: RequestContextService,
15
+ ) {
16
+ this.dataSource.subscribers.push(this);
17
+ }
18
+
19
+ async beforeInsert(event: InsertEvent<any>) {
20
+ await this.stampUserField(event, true);
21
+ }
22
+
23
+ async beforeUpdate(event: UpdateEvent<any>) {
24
+ await this.stampUserField(event, false);
25
+ }
26
+
27
+ private async stampUserField(event: InsertEvent<any> | UpdateEvent<any>, isInsert: boolean){
28
+ if (!event.entity) {
29
+ return;
30
+ }
31
+ // Get the current active user details from the request context
32
+ const activeUserOrUndefined = this.requestContextService.getActiveUser;
33
+ if (!activeUserOrUndefined) {
34
+ return;
35
+ }
36
+
37
+ const loadedUser = await this.loadUser(activeUserOrUndefined as unknown as ActiveUserData);
38
+ if (isInsert) {
39
+ event.entity.createdBy = loadedUser;
40
+ event.entity.updatedBy = loadedUser; // For insert, we set both createdBy and updatedBy to the same user
41
+ }
42
+ else {
43
+ event.entity.updatedBy = loadedUser;
44
+ }
45
+ }
46
+
47
+ private async loadUser(activeUser: ActiveUserData): Promise<User> {
48
+ const userRepo = this.dataSource.getRepository(User); // Assuming 'User' is the entity name for users in your application
49
+ const loadedUser = await userRepo.findOne({
50
+ where: { id: activeUser.sub }, // Assuming 'sub' is the user ID in the JWT token
51
+ });
52
+ return loadedUser;;
53
+ }
54
+ }
@@ -1,9 +1,9 @@
1
- import { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent, UpdateEvent } from 'typeorm';
2
- import { ModelMetadata } from '../entities/model-metadata.entity';
3
- import { FieldMetadata } from '../entities/field-metadata.entity';
4
1
  import { Injectable, Logger, NotFoundException } from '@nestjs/common';
5
2
  import { InjectDataSource } from '@nestjs/typeorm';
6
- import { RemoveFieldsCommand } from '../commands/remove-fields.command';
3
+ import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
4
+ import { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent } from 'typeorm';
5
+ import { FieldMetadata } from '../entities/field-metadata.entity';
6
+ import { ModelMetadata } from '../entities/model-metadata.entity';
7
7
 
8
8
  @EventSubscriber()
9
9
  @Injectable()
@@ -13,7 +13,7 @@ export class ModelSubscriber implements EntitySubscriberInterface<ModelMetadata>
13
13
  constructor(
14
14
  @InjectDataSource()
15
15
  private readonly dataSource: DataSource,
16
-
16
+ private readonly modelHelperService: ModelMetadataHelperService,
17
17
  ) {
18
18
  this.dataSource.subscribers.push(this);
19
19
  }
@@ -25,76 +25,22 @@ export class ModelSubscriber implements EntitySubscriberInterface<ModelMetadata>
25
25
  async afterInsert(event: InsertEvent<ModelMetadata>): Promise<void> {
26
26
  this.logger.debug(`[ModelSubscriber] getting invoked for insert on model: ${event.entity.singularName}`);
27
27
 
28
- // const fieldMetadataRepo = event.manager.getRepository(FieldMetadata);
29
- // const fieldMetadataRepo = this.dataSource.getRepository(FieldMetadata);
30
28
  const transactionManager = event.queryRunner?.manager;
31
29
  if (!transactionManager) {
32
30
  throw new NotFoundException(`Trnasaction Manager not found`);
33
-
34
31
  }
35
32
 
36
- const systemFieldsMetadata = [
37
- {
38
- name: "id",
39
- displayName: "Id",
40
- type: "int",
41
- ormType: "bigint",
42
- isSystem: true,
43
- model: event.entity,
44
- },
45
- {
46
- name: "createdAt",
47
- displayName: "Created At",
48
- type: "datetime",
49
- ormType: "timestamp",
50
- isSystem: true,
51
- model: event.entity,
52
- },
53
- {
54
- name: "updatedAt",
55
- displayName: "Updated At",
56
- type: "datetime",
57
- ormType: "timestamp",
58
- isSystem: true,
59
- model: event.entity,
60
- },
61
- {
62
- name: "deletedAt",
63
- displayName: "Deleted At",
64
- type: "datetime",
65
- ormType: "timestamp",
66
- isSystem: true,
67
- model: event.entity,
68
- },
69
- {
70
- name: "publishedAt",
71
- displayName: "Published At",
72
- type: "datetime",
73
- ormType: "timestamp",
74
- isSystem: true,
75
- model: event.entity,
76
- },
77
- {
78
- name: "localeName",
79
- displayName: "Locale",
80
- type: "shortText",
81
- ormType: "varchar",
82
- isSystem: true,
83
- model: event.entity,
84
- },
85
- {
86
- name: "defaultEntityLocaleId",
87
- displayName: "Default Entity Locale Id",
88
- type: "int",
89
- ormType: "integer",
90
- isSystem: true,
91
- model: event.entity,
92
- }
93
- ];
94
- await transactionManager.save(FieldMetadata, systemFieldsMetadata);
95
- // Save to the database.
96
- // fieldMetadataRepo.save(systemFieldsMetadata);
97
-
33
+ await transactionManager.save(FieldMetadata, this.systemFieldMetadataToBeAdded(event));
98
34
  }
99
35
 
36
+
37
+ private systemFieldMetadataToBeAdded(event: InsertEvent<ModelMetadata>) {
38
+ const systemFieldsDefaultMetadata = this.modelHelperService.getSystemFieldsMetadata();
39
+ // map and add the model as event.entity for the above metadata
40
+ const systemFieldsMetadata = systemFieldsDefaultMetadata.map(field => ({
41
+ ...field,
42
+ model: event.entity,
43
+ }));
44
+ return systemFieldsMetadata;
45
+ }
100
46
  }
@@ -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 +0,0 @@
1
- {"version":3,"file":"softDeleteAwareEventSubscriber.subscriber.d.ts","sourceRoot":"","sources":["../../src/subscribers/softDeleteAwareEventSubscriber.subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,yBAAyB,EAAmB,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGhH,qBAEa,8BAA+B,YAAW,yBAAyB;IAIxE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAH/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;gBAGrD,UAAU,EAAE,UAAU;IAK3C,gBAAgB,CAAC,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI;IAclE,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI;CAM/D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"softDeleteAwareEventSubscriber.subscriber.js","sourceRoot":"","sources":["../../src/subscribers/softDeleteAwareEventSubscriber.subscriber.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAuE;AACvE,6CAAmD;AACnD,qCAAgH;AAKzG,IAAM,8BAA8B,sCAApC,MAAM,8BAA8B;IAEvC,YAEI,UAAuC;QAAtB,eAAU,GAAV,UAAU,CAAY;QAH1B,WAAM,GAAG,IAAI,eAAM,CAAC,gCAA8B,CAAC,IAAI,CAAC,CAAC;QAKtE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,KAA2B;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,CAAC,cAAc,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5C,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,cAAc,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAEpE,CAAC;IAED,aAAa,CAAC,KAAwB;QAClC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,MAAM,CAAC,cAAc,GAAG,aAAa,CAAC;IAC1C,CAAC;CAEJ,CAAA;AA7BY,wEAA8B;yCAA9B,8BAA8B;IAF1C,IAAA,yBAAe,GAAE;IACjB,IAAA,mBAAU,GAAE;IAIJ,WAAA,IAAA,0BAAgB,GAAE,CAAA;qCACU,oBAAU;GAJlC,8BAA8B,CA6B1C"}
@@ -1,3 +0,0 @@
1
- 1. fileLocation -> file
2
- 2. Change the import response to return proper shape.
3
- 3. Change the urls to reflect proper semantics.