@solidstarters/solid-core 1.2.21 → 1.2.22

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 (69) hide show
  1. package/dist/controllers/model-metadata.controller.d.ts +4 -0
  2. package/dist/controllers/model-metadata.controller.d.ts.map +1 -1
  3. package/dist/controllers/model-metadata.controller.js +12 -0
  4. package/dist/controllers/model-metadata.controller.js.map +1 -1
  5. package/dist/controllers/test.controller.d.ts.map +1 -1
  6. package/dist/controllers/test.controller.js +2 -2
  7. package/dist/controllers/test.controller.js.map +1 -1
  8. package/dist/dtos/basic-filters.dto.d.ts +5 -2
  9. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  10. package/dist/dtos/basic-filters.dto.js +13 -9
  11. package/dist/dtos/basic-filters.dto.js.map +1 -1
  12. package/dist/dtos/create-user.dto.d.ts.map +1 -1
  13. package/dist/dtos/create-user.dto.js +2 -2
  14. package/dist/dtos/create-user.dto.js.map +1 -1
  15. package/dist/helpers/schematic.service.js +1 -1
  16. package/dist/helpers/schematic.service.js.map +1 -1
  17. package/dist/index.d.ts +0 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +0 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/jobs/queue-test-subscriber.service.d.ts +1 -0
  22. package/dist/jobs/queue-test-subscriber.service.d.ts.map +1 -1
  23. package/dist/jobs/queue-test-subscriber.service.js +5 -3
  24. package/dist/jobs/queue-test-subscriber.service.js.map +1 -1
  25. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  26. package/dist/seeders/module-metadata-seeder.service.js +30 -23
  27. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  28. package/dist/seeders/seed-data/solid-core-metadata.json +1 -1
  29. package/dist/services/crud-helper.service.d.ts.map +1 -1
  30. package/dist/services/crud-helper.service.js +6 -4
  31. package/dist/services/crud-helper.service.js.map +1 -1
  32. package/dist/services/field-metadata.service.d.ts.map +1 -1
  33. package/dist/services/field-metadata.service.js +40 -7
  34. package/dist/services/field-metadata.service.js.map +1 -1
  35. package/dist/services/model-metadata.service.d.ts +4 -0
  36. package/dist/services/model-metadata.service.d.ts.map +1 -1
  37. package/dist/services/model-metadata.service.js +28 -4
  38. package/dist/services/model-metadata.service.js.map +1 -1
  39. package/dist/services/module-metadata.service.d.ts.map +1 -1
  40. package/dist/services/module-metadata.service.js +4 -4
  41. package/dist/services/module-metadata.service.js.map +1 -1
  42. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  43. package/dist/services/solid-introspect.service.js +9 -1
  44. package/dist/services/solid-introspect.service.js.map +1 -1
  45. package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.d.ts.map +1 -1
  46. package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.js +1 -1
  47. package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.js.map +1 -1
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. package/package.json +1 -1
  50. package/src/controllers/model-metadata.controller.ts +6 -0
  51. package/src/controllers/test.controller.ts +4 -2
  52. package/src/dtos/basic-filters.dto.ts +11 -7
  53. package/src/dtos/create-user.dto.ts +1 -1
  54. package/src/helpers/schematic.service.ts +1 -1
  55. package/src/index.ts +0 -1
  56. package/src/jobs/queue-test-subscriber.service.ts +4 -2
  57. package/src/seeders/module-metadata-seeder.service.ts +30 -26
  58. package/src/seeders/seed-data/solid-core-metadata.json +1 -1
  59. package/src/services/crud-helper.service.ts +8 -6
  60. package/src/services/field-metadata.service.ts +42 -13
  61. package/src/services/model-metadata.service.ts +41 -4
  62. package/src/services/module-metadata.service.ts +8 -4
  63. package/src/services/solid-introspect.service.ts +17 -15
  64. package/src/subscribers/softDeleteAwareEventSubscriber.subscriber.ts +2 -1
  65. package/dist/commands/basic.command.d.ts +0 -19
  66. package/dist/commands/basic.command.d.ts.map +0 -1
  67. package/dist/commands/basic.command.js +0 -79
  68. package/dist/commands/basic.command.js.map +0 -1
  69. package/src/commands/basic.command.ts +0 -60
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidstarters/solid-core",
3
- "version": "1.2.21",
3
+ "version": "1.2.22",
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",
@@ -60,6 +60,12 @@ export class ModelMetadataController {
60
60
  return this.modelMetadataService.create(createDto);
61
61
  }
62
62
 
63
+ @Public()
64
+ @Post('/update-user-key')
65
+ updateUserKey(@Body() data: any) {
66
+ return this.modelMetadataService.updateUserKey(data);
67
+ }
68
+
63
69
  @ApiBearerAuth("jwt")
64
70
  @Post(':id/generate-code')
65
71
  generateCode(@Param('id', ParseIntPipe) id: number) {
@@ -27,8 +27,10 @@ export class TestController {
27
27
  @Post('upload')
28
28
  @UseInterceptors(FileInterceptor('file')) // 'file' here is the name of the field in the form
29
29
  uploadFile(@UploadedFile() file: Express.Multer.File, @Body() body: any) {
30
- console.log(file);
31
- console.log(body);
30
+ // console.log(file);
31
+ this.logger.debug(file);
32
+ // console.log(body);
33
+ this.logger.debug(body);
32
34
  return { filename: file.originalname };
33
35
  }
34
36
 
@@ -1,8 +1,12 @@
1
1
 
2
2
  import { ApiProperty } from "@nestjs/swagger";
3
- import { IsOptional } from "class-validator";
3
+ import { IsEnum, IsOptional } from "class-validator";
4
4
  import { PaginationQueryDto } from "./pagination-query.dto";
5
5
 
6
+ export enum SoftDeleteFilter {
7
+ INCLUSIVE = "inclusive",
8
+ EXCLUSIVE = "exclusive",
9
+ }
6
10
 
7
11
  export class BasicFilterDto extends PaginationQueryDto {
8
12
 
@@ -34,12 +38,12 @@ export class BasicFilterDto extends PaginationQueryDto {
34
38
  // readonly filters: any[];
35
39
 
36
40
  @IsOptional()
37
- @ApiProperty({ description: "showSoftDeleted" })
38
- readonly showSoftDeleted?: boolean;
39
-
40
- @IsOptional()
41
- @ApiProperty({ description: "showOnlySoftDeleted" })
42
- readonly showOnlySoftDeleted?: boolean;
41
+ @IsEnum(SoftDeleteFilter)
42
+ @ApiProperty({
43
+ description: "showSoftDeleted",
44
+ enum: SoftDeleteFilter,
45
+ })
46
+ readonly showSoftDeleted?: SoftDeleteFilter;
43
47
 
44
48
  @IsOptional()
45
49
  @ApiProperty({ description: "populateGroup" })
@@ -29,7 +29,7 @@ export class CreateUserDto {
29
29
 
30
30
  @IsOptional()
31
31
  @IsBoolean()
32
- forcePasswordChange: boolean = true;
32
+ forcePasswordChange: boolean = false;
33
33
 
34
34
  @IsNotEmpty()
35
35
  @IsString()
@@ -82,7 +82,7 @@ export class SchematicService {
82
82
  // console.log('moduleOptions', moduleOptions);
83
83
  const schematicCommand = ` ${baseCommand} --module=${moduleOptions.module}`;
84
84
  // console.log('schematicCommand', schematicCommand);
85
- this.logger.log('schematicCommand', schematicCommand);
85
+ this.logger.debug('schematicCommand', schematicCommand);
86
86
  return schematicCommand;
87
87
  } else {
88
88
  throw new Error('Schematic command not supported.');
package/src/index.ts CHANGED
@@ -1,4 +1,3 @@
1
- export * from './commands/basic.command'
2
1
  export * from './commands/helper'
3
2
  export * from './commands/refresh-model.command'
4
3
  export * from './commands/refresh-module.command'
@@ -1,4 +1,4 @@
1
- import { Injectable } from '@nestjs/common';
1
+ import { Injectable, Logger } from '@nestjs/common';
2
2
 
3
3
  import { RabbitMqSubscriber } from 'src/services/rabbitmq-subscriber.service';
4
4
  import { QueueMessage } from 'src/interfaces/mq';
@@ -9,6 +9,7 @@ import { QueuesModuleOptions } from "../interfaces";
9
9
 
10
10
  @Injectable()
11
11
  export class TestQueueSubscriber extends RabbitMqSubscriber<any> {
12
+ private readonly testQueueLogger = new Logger(TestQueueSubscriber.name);
12
13
  constructor(
13
14
  readonly mqMessageService: MqMessageService,
14
15
  readonly mqMessageQueueService: MqMessageQueueService,
@@ -23,6 +24,7 @@ export class TestQueueSubscriber extends RabbitMqSubscriber<any> {
23
24
  }
24
25
 
25
26
  subscribe(message: QueueMessage<any>) {
26
- console.log(`Received message ${JSON.stringify(message)}`);
27
+ // console.log(`Received message ${JSON.stringify(message)}`);
28
+ this.testQueueLogger.debug(`Received message: ${JSON.stringify(message)}`);
27
29
  }
28
30
  }
@@ -88,9 +88,11 @@ export class ModuleMetadataSeederService {
88
88
 
89
89
  // Run the permissions seeder.
90
90
  // await this.permissionsSeederService.seed();
91
+ this.logger.log(`Seeding permissions`);
91
92
  await this.seedPermissions();
92
93
 
93
94
  // TODO: move this also the main loop processing. Generate the media storage providers required by default
95
+ this.logger.log(`Seeding media storage providers`);
94
96
  await this.mediaStorageProviderSeederService.seed();
95
97
 
96
98
  // Read the module metadata from a file specified in the .env
@@ -105,8 +107,9 @@ export class ModuleMetadataSeederService {
105
107
  // ...coreModules.map(module => `src/${module}/seeders/seed-data/${module}-metadata.json`),
106
108
  typedSolidCoreMetadata
107
109
  ];
108
-
110
+ this.logger.debug(`getting dynamics modules`);
109
111
  const enabledModules = getDynamicModuleNames();
112
+ this.logger.log(`Seeding metadata`);
110
113
 
111
114
  for (let i = 0; i < enabledModules.length; i++) {
112
115
  const enabledModule = enabledModules[i];
@@ -119,8 +122,8 @@ export class ModuleMetadataSeederService {
119
122
  }
120
123
  }
121
124
 
122
- this.logger.log(`Seed data files are: ${seedDataFiles}`);
123
-
125
+ this.logger.debug(`Seed data files are: ${seedDataFiles}`);
126
+ let usersDetail;
124
127
  for (let i = 0; i < seedDataFiles.length; i++) {
125
128
 
126
129
  // Module, model & field handling.
@@ -134,76 +137,77 @@ export class ModuleMetadataSeederService {
134
137
 
135
138
  // Process module metadata first.
136
139
  const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;
137
- this.logger.log(`[Start] Processing module metadata for ${moduleMetadata.name}`)
140
+ this.logger.debug(`[Start] Processing module metadata for ${moduleMetadata.name}`)
138
141
  await this.seedModuleModelFields(moduleMetadata);
139
- this.logger.log(`[End] Processing module metadata for ${moduleMetadata.name}`)
142
+ this.logger.debug(`[End] Processing module metadata for ${moduleMetadata.name}`)
140
143
 
141
144
  // Media Storage provider templates
142
- this.logger.log(`[Start] Processing Media Storage Provider for ${moduleMetadata.name}`);
145
+ this.logger.debug(`[Start] Processing Media Storage Provider for ${moduleMetadata.name}`);
143
146
  const mediaStorageProviders = overallMetadata.mediaStorageProviders;
144
147
  await this.seedMediaStorageProviders(mediaStorageProviders);
145
- this.logger.log(`[End] Processing Media Storage Provider for ${moduleMetadata.name}`);
148
+ this.logger.debug(`[End] Processing Media Storage Provider for ${moduleMetadata.name}`);
146
149
 
147
150
  // TODO: Custom role handling
148
- this.logger.log(`[End] Processing roles for ${moduleMetadata.name}`)
151
+ this.logger.debug(`[End] Processing roles for ${moduleMetadata.name}`)
149
152
  const roles = overallMetadata.roles;
150
153
  await this.roleService.createRolesIfNotExists(roles);
151
- this.logger.log(`[End] Processing roles for ${moduleMetadata.name}`)
154
+ this.logger.debug(`[End] Processing roles for ${moduleMetadata.name}`)
152
155
 
153
156
  // Custom user handling
154
- this.logger.log(`[Start] Processing users for ${moduleMetadata.name}`);
157
+ this.logger.debug(`[Start] Processing users for ${moduleMetadata.name}`);
155
158
  const users = overallMetadata.users;
159
+ usersDetail = users;
156
160
  await this.seedUsers(users);
157
- this.logger.log(`[End] Processing users for ${moduleMetadata.name}`)
161
+ this.logger.debug(`[End] Processing users for ${moduleMetadata.name}`)
158
162
 
159
163
  // Application Module View handling
160
- this.logger.log(`[Start] Processing views for ${moduleMetadata.name}`);
164
+ this.logger.debug(`[Start] Processing views for ${moduleMetadata.name}`);
161
165
  const views = overallMetadata.views;
162
166
  await this.seedViews(views);
163
- this.logger.log(`[End] Processing views for ${moduleMetadata.name}`)
167
+ this.logger.debug(`[End] Processing views for ${moduleMetadata.name}`)
164
168
 
165
169
  // Application Module Action handling
166
- this.logger.log(`[Start] Processing actions for ${moduleMetadata.name}`);
170
+ this.logger.debug(`[Start] Processing actions for ${moduleMetadata.name}`);
167
171
  const actions = overallMetadata.actions;
168
172
  await this.seedActions(actions);
169
- this.logger.log(`[End] Processing actions for ${moduleMetadata.name}`)
173
+ this.logger.debug(`[End] Processing actions for ${moduleMetadata.name}`)
170
174
 
171
175
  // Application Module Menu handling
172
- this.logger.log(`[Start] Processing menus for ${moduleMetadata.name}`);
176
+ this.logger.debug(`[Start] Processing menus for ${moduleMetadata.name}`);
173
177
  const menus = overallMetadata.menus;
174
178
  await this.seedMenus(menus);
175
- this.logger.log(`[End] Processing menus for ${moduleMetadata.name}`)
179
+ this.logger.debug(`[End] Processing menus for ${moduleMetadata.name}`)
176
180
 
177
181
  // Email templates
178
- this.logger.log(`[Start] Processing email templates for ${moduleMetadata.name}`);
182
+ this.logger.debug(`[Start] Processing email templates for ${moduleMetadata.name}`);
179
183
  const emailTemplates: CreateEmailTemplateDto[] = overallMetadata.emailTemplates;
180
184
  await this.seedEmailTemplates(emailTemplates);
181
- this.logger.log(`[End] Processing email templates for ${moduleMetadata.name}`);
185
+ this.logger.debug(`[End] Processing email templates for ${moduleMetadata.name}`);
182
186
 
183
187
  // Sms templates
184
- this.logger.log(`[Start] Processing sms templates for ${moduleMetadata.name}`);
188
+ this.logger.debug(`[Start] Processing sms templates for ${moduleMetadata.name}`);
185
189
  const smsTemplates: CreateSmsTemplateDto[] = overallMetadata.smsTemplates;
186
190
  await this.seedSmsTemplates(smsTemplates);
187
- this.logger.log(`[End] Processing sms templates for ${moduleMetadata.name}`);
191
+ this.logger.debug(`[End] Processing sms templates for ${moduleMetadata.name}`);
188
192
 
189
193
  // Sms templates
190
- this.logger.log(`[Start] Processing settings for ${moduleMetadata.name}`);
194
+ this.logger.debug(`[Start] Processing settings for ${moduleMetadata.name}`);
191
195
  await this.seedSettings(settingsSeederData);
192
- this.logger.log(`[End] Processing settings for ${moduleMetadata.name}`);
196
+ this.logger.debug(`[End] Processing settings for ${moduleMetadata.name}`);
193
197
 
194
- this.logger.log(`[End] module seed data: ${overallMetadata}`);
198
+ this.logger.debug(`[End] module seed data: ${overallMetadata}`);
195
199
 
196
200
  }
197
201
 
198
202
  // Post seed data file processing.
199
203
 
200
204
  // 1. Give all permissions to the Admin role.
201
- this.logger.log(`About to add all permissions to the Admin role`);
205
+ this.logger.debug(`About to add all permissions to the Admin role`);
202
206
  await this.roleService.addAllPermissionsToRole("Admin");
203
207
  // 2. Give wrapSettings permissions to the Public role.
204
208
  await this.roleService.addPermissionToRole('Public', 'SettingController.wrapSettings');
205
209
  this.logger.log(`All Seeders finished`);
206
-
210
+ this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);
207
211
  }
208
212
 
209
213
 
@@ -2417,7 +2417,7 @@
2417
2417
  "username": "admin@example.service.com",
2418
2418
  "email": "admin@example.service.com",
2419
2419
  "password": "Admin@3214$",
2420
- "forcePasswordChange": false,
2420
+ "forcePasswordChange": true,
2421
2421
  "fullName": "Default Admin"
2422
2422
  }
2423
2423
  ],
@@ -149,7 +149,7 @@ export class CrudHelperService {
149
149
  }
150
150
 
151
151
  buildFilterQuery(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string): SelectQueryBuilder<any> { //TODO : Check how to pass a type to SelectQueryBuilder instead of any
152
- let { limit, offset, showSoftDeleted, showOnlySoftDeleted, filters } = basicFilterDto;
152
+ let { limit, offset, showSoftDeleted, filters } = basicFilterDto;
153
153
  const { fields, sort, groupBy, populate = [] } = basicFilterDto;
154
154
 
155
155
  // Normalize the fields, sort, groupBy and populate options i.e (since they can be either a string or an array of strings, when coming from the request)
@@ -197,11 +197,14 @@ export class CrudHelperService {
197
197
  }
198
198
 
199
199
 
200
- // Apply the soft delete options
201
- if (showSoftDeleted || showOnlySoftDeleted) qb.withDeleted(); // Display the soft deleted records default condition
202
- if (showOnlySoftDeleted) { // Add the condition to show only soft deleted records
203
- qb.andWhere(`${entityAlias}.deletedAt IS NOT NULL`);
200
+ if (showSoftDeleted === 'inclusive') {
201
+ qb.withDeleted();
204
202
  }
203
+
204
+ if (showSoftDeleted === 'exclusive') {
205
+ qb.withDeleted();
206
+ qb.where(`${entityAlias}.deletedAt IS NOT NULL`);
207
+ }
205
208
 
206
209
  // Apply the group by options
207
210
  if (normalizedGroupBy && normalizedGroupBy.length) {
@@ -209,7 +212,6 @@ export class CrudHelperService {
209
212
  qb.addGroupBy(`${entityAlias}.${field}`);
210
213
  });
211
214
  }
212
-
213
215
  // Apply the pagination options
214
216
  if (limit) qb.limit(limit);
215
217
  if (offset) qb.offset(offset);
@@ -12,6 +12,7 @@ import { FieldMetadata } from '../entities/field-metadata.entity';
12
12
  import { ModelMetadata } from '../entities/model-metadata.entity';
13
13
  import { ISelectionProviderValues } from '../interfaces';
14
14
  import { CrudHelperService } from './crud-helper.service';
15
+ import { classify } from '@angular-devkit/core/src/utils/strings';
15
16
 
16
17
 
17
18
  @Injectable()
@@ -47,11 +48,12 @@ export class FieldMetadataService {
47
48
  // const {id, createdAt, updatedAt, deletedAt, ...fieldKeys} = field;
48
49
  switch (field.relationType) {
49
50
  case RelationType.manyToOne: {
51
+ const fieldName = field.relationModelFieldName || `${modelName}s`;
50
52
  const inverseField: FieldMetadata = {
51
53
  ...field,
52
- name: field.relationModelFieldName ?? `${modelName}s`,
53
- displayName: `Inverse ${field.displayName}`,
54
- description: `Inverse field for ${field.displayName}`,
54
+ name: fieldName,
55
+ displayName: classify(fieldName),
56
+ description: classify(fieldName),
55
57
  type: SolidFieldType.relation,
56
58
  isSystem: field.isSystem,
57
59
  relationType: RelationType.oneToMany,
@@ -71,9 +73,38 @@ export class FieldMetadataService {
71
73
  relationJoinColumnName: null,
72
74
  joinColumnName: null,
73
75
  id : null,
74
- // createdAt: null,
75
- // updatedAt: null,
76
- // deletedAt: null,
76
+ }
77
+
78
+ // Load the inverse field,
79
+ const savedField = await this.saveInverseField(fieldRepository, relationModel, inverseField);
80
+ return savedField;
81
+ }
82
+ case RelationType.oneToMany: {
83
+ const fieldName = field.relationModelFieldName || `${modelName}`;
84
+ const inverseField: FieldMetadata = {
85
+ ...field,
86
+ name: fieldName,
87
+ displayName: classify(fieldName),
88
+ description: classify(fieldName),
89
+ type: SolidFieldType.relation,
90
+ isSystem: field.isSystem,
91
+ relationType: RelationType.manyToOne,
92
+ relationModelSingularName: modelName,
93
+ relationCreateInverse: true,
94
+ relationCascade: null,
95
+ relationModelModuleName: moduleName,
96
+ relationModelFieldName: field.name,
97
+ required: false,
98
+ unique: false,
99
+ index: false,
100
+ private: false,
101
+ encrypt: false,
102
+ model: relationModel,
103
+ columnName:null,
104
+ relationJoinTableName: null,
105
+ relationJoinColumnName: null,
106
+ joinColumnName: null,
107
+ id : null,
77
108
  }
78
109
 
79
110
  // Load the inverse field,
@@ -81,18 +112,19 @@ export class FieldMetadataService {
81
112
  return savedField;
82
113
  }
83
114
  case RelationType.manyTomany: {
115
+ const fieldName = field.relationModelFieldName;
84
116
  // Logic to create a manyToMany inverse field definition
85
117
  const inverseFieldManyToMany: FieldMetadata = {
86
118
  ...field,
87
- name: field.relationModelFieldName,
88
- displayName: `Inverse ${field.displayName}`,
89
- description: `Inverse field for ${field.displayName}`,
119
+ name: fieldName,
120
+ displayName: classify(fieldName),
121
+ description: classify(fieldName),
90
122
  type: SolidFieldType.relation,
91
123
  isSystem: field.isSystem,
92
124
  relationType: RelationType.manyTomany,
93
125
  relationModelSingularName: modelName,
94
126
  relationCreateInverse: true,
95
- relationCascade: field.relationCascade,
127
+ relationCascade: null,
96
128
  relationModelModuleName: moduleName,
97
129
  relationModelFieldName: field.name,
98
130
  required: false,
@@ -107,9 +139,6 @@ export class FieldMetadataService {
107
139
  joinColumnName: null,
108
140
  isRelationManyToManyOwner: false,
109
141
  id : null,
110
- // createdAt: null,
111
- // updatedAt: null,
112
- // deletedAt: null,
113
142
  }
114
143
  const savedField = await this.saveInverseField(fieldRepository, relationModel, inverseFieldManyToMany);
115
144
  return savedField;
@@ -131,7 +131,8 @@ export class ModelMetadataService {
131
131
  return model
132
132
  });
133
133
  } catch (error) {
134
- console.error('Transaction failed:', error);
134
+ // console.error('Transaction failed:', error);
135
+ this.logger.error('Transaction failed:', error);
135
136
  throw error;
136
137
  }
137
138
  }
@@ -165,7 +166,8 @@ export class ModelMetadataService {
165
166
  // return model
166
167
  });
167
168
  } catch (error) {
168
- console.error('Transaction failed:', error);
169
+ // console.error('Transaction failed:', error);
170
+ this.logger.error('Transaction failed:', error);
169
171
  throw error;
170
172
  }
171
173
  }
@@ -200,6 +202,7 @@ export class ModelMetadataService {
200
202
  fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);
201
203
  }
202
204
  // console.log(fieldMetadata.displayName);
205
+ // this.logger.debug(fieldMetadata.displayName);
203
206
 
204
207
  const fieldMetadataObject = this.fieldMetadataRepo.create(fieldMetadata);
205
208
  const affectedField = await manager.save(fieldMetadataObject);
@@ -448,7 +451,8 @@ export class ModelMetadataService {
448
451
  await fs.writeFile(filePath, updatedContent);
449
452
 
450
453
  } catch (error) {
451
- console.error('File creation failed:', error);
454
+ // console.error('File creation failed:', error);
455
+ this.logger.error('File creation failed:', error);
452
456
  throw new Error('File creation failed, rolling back transaction'); // Trigger rollback
453
457
  }
454
458
  }
@@ -615,7 +619,8 @@ export class ModelMetadataService {
615
619
  await fs.writeFile(filePath, updatedContent);
616
620
 
617
621
  } catch (error) {
618
- console.error('File creation failed:', error);
622
+ // console.error('File creation failed:', error);
623
+ this.logger.error('File creation failed:', error);
619
624
  throw new Error('File creation failed, rolling back transaction'); // Trigger rollback
620
625
  }
621
626
  }
@@ -905,6 +910,38 @@ export class ModelMetadataService {
905
910
  return output;
906
911
  }
907
912
 
913
+ async updateUserKey(data: any) {
914
+ const { modelName, fieldName } = data;
915
+
916
+ const model = await this.modelMetadataRepo.findOne({
917
+ where: { singularName: modelName },
918
+ relations: ['fields', 'userKeyField'],
919
+ });
920
+
921
+ if (!model) {
922
+ throw new Error(`Model with name ${modelName} not found`);
923
+ }
924
+
925
+ if (model.userKeyField) {
926
+ throw new Error(`User key is already set to ${model.userKeyField.name}. No changes were made.`);
927
+ }
928
+
929
+ const fieldToUpdate = model.fields.find(field => field.name === fieldName);
930
+ if (!fieldToUpdate) {
931
+ throw new Error(`Field with name ${fieldName} not found in model ${modelName}`);
932
+ }
933
+
934
+ fieldToUpdate.isUserKey = true;
935
+
936
+ model.userKeyField = fieldToUpdate;
937
+
938
+ await this.modelMetadataRepo.save(model);
939
+
940
+ return {
941
+ message: `User key has been successfully updated to ${fieldName}.`,
942
+ success: true
943
+ };
944
+ }
908
945
 
909
946
  private async getRelationInverseFields(modelId: number, repo: Repository<FieldMetadata>): Promise<FieldMetadata[]> {
910
947
  return await repo.find({
@@ -112,7 +112,8 @@ export class ModuleMetadataService {
112
112
  return module
113
113
  });
114
114
  } catch (error) {
115
- console.error('Transaction failed:', error);
115
+ // console.error('Transaction failed:', error);
116
+ this.logger.error('Transaction failed:', error);
116
117
  throw error;
117
118
  }
118
119
  }
@@ -165,7 +166,8 @@ export class ModuleMetadataService {
165
166
  await fs.writeFile(filePath, metadataJson);
166
167
 
167
168
  } catch (error) {
168
- console.error('File creation failed:', error);
169
+ // console.error('File creation failed:', error);
170
+ this.logger.error('File creation failed:', error);
169
171
  throw new Error('File creation failed, rolling back transaction'); // Trigger rollback
170
172
  }
171
173
  }
@@ -179,7 +181,8 @@ export class ModuleMetadataService {
179
181
  return module
180
182
  });
181
183
  } catch (error) {
182
- console.error('Transaction failed:', error);
184
+ // console.error('Transaction failed:', error);
185
+ this.logger.error('Transaction failed:', error);
183
186
  throw error;
184
187
  }
185
188
  }
@@ -251,7 +254,8 @@ export class ModuleMetadataService {
251
254
  await fs.writeFile(filePath, updatedContent);
252
255
 
253
256
  } catch (error) {
254
- console.error('File creation failed:', error);
257
+ // console.error('File creation failed:', error);
258
+ this.logger.error('File creation failed:', error);
255
259
  throw new Error('File creation failed, rolling back transaction'); // Trigger rollback
256
260
  }
257
261
  }
@@ -128,21 +128,23 @@ export class SolidIntrospectService implements OnApplicationBootstrap {
128
128
  return !!isSolidDatabaseModule;
129
129
  }
130
130
 
131
- private isModule(provider: InstanceWrapper) {
132
- // Check if the provider is a module
131
+
132
+ private isModule(provider: InstanceWrapper): boolean {
133
133
  const metatype = provider.metatype;
134
- return metatype && Reflect.getMetadata('imports', metatype);
134
+ // Check if it's a Static Module (Class-Based)
135
+ if (metatype && typeof metatype === 'function' && Reflect.getMetadata('imports', metatype)) {
136
+ return true;
137
+ }
138
+
139
+ // Ensure provider.instance is an object before checking for 'module'
140
+ if (provider.instance && typeof provider.instance === 'object') {
141
+ // Check if it's a Dynamic Module (Object-Based)
142
+ if ('module' in provider.instance && typeof provider.instance.module === 'function') {
143
+ return true;
144
+ }
145
+ }
146
+
147
+ return false;
135
148
  }
136
- // This method uses the @SolidSeeder decorator to identify if a provider is a seeder
137
- // private isSeeder(provider: InstanceWrapper) {
138
- // const { instance } = provider;
139
- // if (!instance) return false;
140
-
141
- // const seederMetadata = this.reflector.get(
142
- // 'SOLID_SERVICE',
143
- // instance.constructor,
144
- // );
145
- // if (!seederMetadata || !seederMetadata.seeder) return false;
146
- // return true;
147
- // }
149
+
148
150
  }
@@ -23,7 +23,8 @@ export class SoftDeleteAwareEventSubscriber implements EntitySubscriberInterface
23
23
  } else {
24
24
  entity.deletedTracker = `${entity.deletedAt}`; // Set trackerDate to the deleted Date
25
25
  }
26
- console.log('TrackerDate updated:', entity.trackerDate);
26
+ // console.log('TrackerDate updated:', entity.trackerDate);
27
+ this.logger.debug(`TrackerDate updated: ${entity.trackerDate}`);
27
28
 
28
29
  }
29
30
 
@@ -1,19 +0,0 @@
1
- import { CommandRunner } from 'nest-commander';
2
- interface BasicCommandOptions {
3
- string?: string;
4
- boolean?: boolean;
5
- number?: number;
6
- }
7
- export declare class BasicCommand extends CommandRunner {
8
- constructor();
9
- run(passedParam: string[], options?: BasicCommandOptions): Promise<void>;
10
- parseNumber(val: string): number;
11
- parseString(val: string): string;
12
- parseBoolean(val: string): boolean;
13
- runWithString(param: string[], option: string): void;
14
- runWithNumber(param: string[], option: number): void;
15
- runWithBoolean(param: string[], option: boolean): void;
16
- runWithNone(param: string[]): void;
17
- }
18
- export {};
19
- //# sourceMappingURL=basic.command.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"basic.command.d.ts","sourceRoot":"","sources":["../../src/commands/basic.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAEhE,UAAU,mBAAmB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,YAAa,SAAQ,aAAa;;IAKrC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9E,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAKhC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAKhC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIlC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpD,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAItD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;CAGrC"}