@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.
- package/dist/controllers/model-metadata.controller.d.ts +4 -0
- package/dist/controllers/model-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/model-metadata.controller.js +12 -0
- package/dist/controllers/model-metadata.controller.js.map +1 -1
- package/dist/controllers/test.controller.d.ts.map +1 -1
- package/dist/controllers/test.controller.js +2 -2
- package/dist/controllers/test.controller.js.map +1 -1
- package/dist/dtos/basic-filters.dto.d.ts +5 -2
- package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
- package/dist/dtos/basic-filters.dto.js +13 -9
- package/dist/dtos/basic-filters.dto.js.map +1 -1
- package/dist/dtos/create-user.dto.d.ts.map +1 -1
- package/dist/dtos/create-user.dto.js +2 -2
- package/dist/dtos/create-user.dto.js.map +1 -1
- package/dist/helpers/schematic.service.js +1 -1
- package/dist/helpers/schematic.service.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/jobs/queue-test-subscriber.service.d.ts +1 -0
- package/dist/jobs/queue-test-subscriber.service.d.ts.map +1 -1
- package/dist/jobs/queue-test-subscriber.service.js +5 -3
- package/dist/jobs/queue-test-subscriber.service.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +30 -23
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +1 -1
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +6 -4
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js +40 -7
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +4 -0
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +28 -4
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +4 -4
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/solid-introspect.service.d.ts.map +1 -1
- package/dist/services/solid-introspect.service.js +9 -1
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.d.ts.map +1 -1
- package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.js +1 -1
- package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/controllers/model-metadata.controller.ts +6 -0
- package/src/controllers/test.controller.ts +4 -2
- package/src/dtos/basic-filters.dto.ts +11 -7
- package/src/dtos/create-user.dto.ts +1 -1
- package/src/helpers/schematic.service.ts +1 -1
- package/src/index.ts +0 -1
- package/src/jobs/queue-test-subscriber.service.ts +4 -2
- package/src/seeders/module-metadata-seeder.service.ts +30 -26
- package/src/seeders/seed-data/solid-core-metadata.json +1 -1
- package/src/services/crud-helper.service.ts +8 -6
- package/src/services/field-metadata.service.ts +42 -13
- package/src/services/model-metadata.service.ts +41 -4
- package/src/services/module-metadata.service.ts +8 -4
- package/src/services/solid-introspect.service.ts +17 -15
- package/src/subscribers/softDeleteAwareEventSubscriber.subscriber.ts +2 -1
- package/dist/commands/basic.command.d.ts +0 -19
- package/dist/commands/basic.command.d.ts.map +0 -1
- package/dist/commands/basic.command.js +0 -79
- package/dist/commands/basic.command.js.map +0 -1
- 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.
|
|
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
|
-
|
|
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
|
-
@
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
readonly
|
|
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" })
|
|
@@ -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.
|
|
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,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.
|
|
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.
|
|
140
|
+
this.logger.debug(`[Start] Processing module metadata for ${moduleMetadata.name}`)
|
|
138
141
|
await this.seedModuleModelFields(moduleMetadata);
|
|
139
|
-
this.logger.
|
|
142
|
+
this.logger.debug(`[End] Processing module metadata for ${moduleMetadata.name}`)
|
|
140
143
|
|
|
141
144
|
// Media Storage provider templates
|
|
142
|
-
this.logger.
|
|
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.
|
|
148
|
+
this.logger.debug(`[End] Processing Media Storage Provider for ${moduleMetadata.name}`);
|
|
146
149
|
|
|
147
150
|
// TODO: Custom role handling
|
|
148
|
-
this.logger.
|
|
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.
|
|
154
|
+
this.logger.debug(`[End] Processing roles for ${moduleMetadata.name}`)
|
|
152
155
|
|
|
153
156
|
// Custom user handling
|
|
154
|
-
this.logger.
|
|
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.
|
|
161
|
+
this.logger.debug(`[End] Processing users for ${moduleMetadata.name}`)
|
|
158
162
|
|
|
159
163
|
// Application Module View handling
|
|
160
|
-
this.logger.
|
|
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.
|
|
167
|
+
this.logger.debug(`[End] Processing views for ${moduleMetadata.name}`)
|
|
164
168
|
|
|
165
169
|
// Application Module Action handling
|
|
166
|
-
this.logger.
|
|
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.
|
|
173
|
+
this.logger.debug(`[End] Processing actions for ${moduleMetadata.name}`)
|
|
170
174
|
|
|
171
175
|
// Application Module Menu handling
|
|
172
|
-
this.logger.
|
|
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.
|
|
179
|
+
this.logger.debug(`[End] Processing menus for ${moduleMetadata.name}`)
|
|
176
180
|
|
|
177
181
|
// Email templates
|
|
178
|
-
this.logger.
|
|
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.
|
|
185
|
+
this.logger.debug(`[End] Processing email templates for ${moduleMetadata.name}`);
|
|
182
186
|
|
|
183
187
|
// Sms templates
|
|
184
|
-
this.logger.
|
|
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.
|
|
191
|
+
this.logger.debug(`[End] Processing sms templates for ${moduleMetadata.name}`);
|
|
188
192
|
|
|
189
193
|
// Sms templates
|
|
190
|
-
this.logger.
|
|
194
|
+
this.logger.debug(`[Start] Processing settings for ${moduleMetadata.name}`);
|
|
191
195
|
await this.seedSettings(settingsSeederData);
|
|
192
|
-
this.logger.
|
|
196
|
+
this.logger.debug(`[End] Processing settings for ${moduleMetadata.name}`);
|
|
193
197
|
|
|
194
|
-
this.logger.
|
|
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.
|
|
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
|
|
|
@@ -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,
|
|
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
|
-
|
|
201
|
-
|
|
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:
|
|
53
|
-
displayName:
|
|
54
|
-
description:
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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:
|
|
88
|
-
displayName:
|
|
89
|
-
description:
|
|
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:
|
|
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
|
-
|
|
132
|
-
|
|
131
|
+
|
|
132
|
+
private isModule(provider: InstanceWrapper): boolean {
|
|
133
133
|
const metatype = provider.metatype;
|
|
134
|
-
|
|
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
|
-
|
|
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"}
|