@solidstarters/solid-core 1.2.20 → 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-field-metadata.dto.d.ts +3 -1
- package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-field-metadata.dto.js +7 -1
- package/dist/dtos/create-field-metadata.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/entities/field-metadata.entity.d.ts +1 -0
- package/dist/entities/field-metadata.entity.d.ts.map +1 -1
- package/dist/entities/field-metadata.entity.js +5 -1
- package/dist/entities/field-metadata.entity.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.d.ts +5 -0
- package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -0
- package/dist/helpers/module-metadata-helper.service.js +61 -0
- package/dist/helpers/module-metadata-helper.service.js.map +1 -0
- 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/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +26 -35
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/field-metadata.service.d.ts +17 -6
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js +253 -34
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +9 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +74 -35
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts +3 -3
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +12 -18
- 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/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +2 -0
- package/dist/solid-core.module.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-field-metadata.dto.ts +5 -0
- package/src/dtos/create-user.dto.ts +1 -1
- package/src/entities/field-metadata.entity.ts +3 -0
- package/src/helpers/module-metadata-helper.service.ts +25 -0
- 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/crud.service.ts +14 -22
- package/src/services/field-metadata.service.ts +229 -10
- package/src/services/model-metadata.service.ts +98 -44
- package/src/services/module-metadata.service.ts +13 -18
- package/src/services/solid-introspect.service.ts +17 -15
- package/src/solid-core.module.ts +2 -0
- 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" })
|
|
@@ -142,6 +142,7 @@ export enum MediaType {
|
|
|
142
142
|
export enum RelationType {
|
|
143
143
|
manyToOne = 'many-to-one',
|
|
144
144
|
manyTomany = 'many-to-many',
|
|
145
|
+
oneToMany = 'one-to-many',
|
|
145
146
|
}
|
|
146
147
|
|
|
147
148
|
export enum CascadeType {
|
|
@@ -320,6 +321,10 @@ export class CreateFieldMetadataDto {
|
|
|
320
321
|
@IsOptional()
|
|
321
322
|
relationModelFieldName: string;
|
|
322
323
|
|
|
324
|
+
@ApiProperty({description: 'Only for type=relation, many-to-many. This field is used to set the owner of the many-to-many relation'})
|
|
325
|
+
@IsOptional()
|
|
326
|
+
isRelationManyToManyOwner: boolean;
|
|
327
|
+
|
|
323
328
|
@ApiProperty({
|
|
324
329
|
description:
|
|
325
330
|
'Dynamic provider for selection. Only for type=selectionDynamic',
|
|
@@ -99,6 +99,9 @@ export class FieldMetadata extends CommonEntity {
|
|
|
99
99
|
@Column({ name: 'relation_model_field_name', nullable: true })
|
|
100
100
|
relationModelFieldName: string;
|
|
101
101
|
|
|
102
|
+
@Column({ name: 'is_relation_many_to_many_owner', nullable: true })
|
|
103
|
+
isRelationManyToManyOwner: boolean;
|
|
104
|
+
|
|
102
105
|
@Column({ name: 'selection_dynamic_provider', nullable: true })
|
|
103
106
|
selectionDynamicProvider: string;
|
|
104
107
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Injectable, ModuleMetadata } from "@nestjs/common";
|
|
2
|
+
import * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await
|
|
3
|
+
import * as path from 'path'; // To handle file paths
|
|
4
|
+
import { ModuleMetadataConfiguration } from "src/interfaces";
|
|
5
|
+
|
|
6
|
+
@Injectable()
|
|
7
|
+
export class ModuleMetadataHelperService {
|
|
8
|
+
// async getModuleMetadataConfig(moduleName: string): Promise<ModuleMetadata> {
|
|
9
|
+
// const filePath = this.getModuleMetadataFilePath(moduleName);
|
|
10
|
+
// const metadata = await this.getModuleMetadata(filePath);
|
|
11
|
+
// return metadata;
|
|
12
|
+
// }
|
|
13
|
+
|
|
14
|
+
async getModuleMetadataConfiguration(configFilePath: string): Promise<any> {
|
|
15
|
+
const fileContent = await fs.readFile(configFilePath, 'utf8');
|
|
16
|
+
return JSON.parse(fileContent);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
getModuleMetadataFilePath(moduleName: string): string {
|
|
20
|
+
const folderPath = path.resolve(process.cwd(), 'module-metadata', moduleName);
|
|
21
|
+
const filePath = path.join(folderPath, `${moduleName}-metadata.json`);
|
|
22
|
+
return filePath;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
}
|
|
@@ -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);
|
|
@@ -66,8 +66,8 @@ export class CRUDService<T> { //Add two generic value i.e Person,CreatePersonDto
|
|
|
66
66
|
let hasMediaFields = false;
|
|
67
67
|
|
|
68
68
|
const model = await this.loadModel();
|
|
69
|
-
const inverseRelationFields = await this.loadInverseRelationFields();
|
|
70
|
-
const fieldsToProcess = [...model.fields
|
|
69
|
+
// const inverseRelationFields = await this.loadInverseRelationFields();
|
|
70
|
+
const fieldsToProcess = [...model.fields];
|
|
71
71
|
|
|
72
72
|
// 2. Loop through the fields with a switch statement
|
|
73
73
|
// 3. Handle the fields based on field type
|
|
@@ -185,8 +185,7 @@ export class CRUDService<T> { //Add two generic value i.e Person,CreatePersonDto
|
|
|
185
185
|
let hasMediaFields = false;
|
|
186
186
|
|
|
187
187
|
const model = await this.loadModel();
|
|
188
|
-
const
|
|
189
|
-
const fieldsToProcess = [...model.fields, ...inverseRelationFields];
|
|
188
|
+
const fieldsToProcess = [...model.fields];
|
|
190
189
|
|
|
191
190
|
// 2. Loop through the fields with a switch statement
|
|
192
191
|
// 3. Handle the fields based on field type
|
|
@@ -305,9 +304,7 @@ export class CRUDService<T> { //Add two generic value i.e Person,CreatePersonDto
|
|
|
305
304
|
}
|
|
306
305
|
case SolidFieldType.relation: {
|
|
307
306
|
// Identify if the field is for the inverse side or not
|
|
308
|
-
const inverseSide = (fieldMetadata.model.singularName !== this.modelName) ? true : false;
|
|
309
307
|
if (fieldMetadata.relationType === RelationType.manyToOne) {
|
|
310
|
-
if (!inverseSide) {
|
|
311
308
|
const manyToOneOptions: ManyToOneRelationFieldOptions = {
|
|
312
309
|
...commonOptions,
|
|
313
310
|
relationModelSingularName: fieldMetadata.relationModelSingularName,
|
|
@@ -316,23 +313,20 @@ export class CRUDService<T> { //Add two generic value i.e Person,CreatePersonDto
|
|
|
316
313
|
entityManager,
|
|
317
314
|
}
|
|
318
315
|
return new ManyToOneRelationFieldCrudManager(manyToOneOptions);
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
const inverseFieldMetadata = fieldMetadata; //Setting an alias for clarity purpose
|
|
316
|
+
}
|
|
317
|
+
else if (fieldMetadata.relationType === RelationType.oneToMany) {
|
|
322
318
|
const oneToManyOptions: OneToManyRelationFieldOptions = {
|
|
323
319
|
...commonOptions,
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
modelSingularName: inverseFieldMetadata.relationModelSingularName,
|
|
320
|
+
relationModelSingularName: fieldMetadata.relationModelSingularName,
|
|
321
|
+
modelSingularName: fieldMetadata.model.singularName,
|
|
327
322
|
entityManager,
|
|
328
|
-
inverseFieldName:
|
|
329
|
-
inverseRelationModelFieldName:
|
|
323
|
+
inverseFieldName: fieldMetadata.relationModelFieldName,
|
|
324
|
+
inverseRelationModelFieldName: fieldMetadata.name,
|
|
330
325
|
}
|
|
331
326
|
return new OneToManyRelationFieldCrudManager(oneToManyOptions);
|
|
332
|
-
}
|
|
333
327
|
}
|
|
334
328
|
else if (fieldMetadata.relationType === RelationType.manyTomany) {
|
|
335
|
-
if (
|
|
329
|
+
if (fieldMetadata.isRelationManyToManyOwner) {
|
|
336
330
|
const manyToManyOptions: ManyToManyRelationFieldOptions = {
|
|
337
331
|
...commonOptions,
|
|
338
332
|
relationModelSingularName: fieldMetadata.relationModelSingularName,
|
|
@@ -344,16 +338,14 @@ export class CRUDService<T> { //Add two generic value i.e Person,CreatePersonDto
|
|
|
344
338
|
return new ManyToManyRelationFieldCrudManager(manyToManyOptions);
|
|
345
339
|
}
|
|
346
340
|
else {
|
|
347
|
-
const inverseFieldMetadata = fieldMetadata; //Setting an alias for clarity purpose
|
|
348
341
|
const inverseManyToManyOptions: ManyToManyRelationFieldOptions = {
|
|
349
342
|
...commonOptions,
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
modelSingularName: inverseFieldMetadata.relationModelSingularName,
|
|
343
|
+
relationModelSingularName: fieldMetadata.relationModelSingularName,
|
|
344
|
+
modelSingularName: fieldMetadata.model.singularName,
|
|
353
345
|
isInverseSide: true,
|
|
354
346
|
entityManager,
|
|
355
|
-
fieldName:
|
|
356
|
-
relationModelFieldName:
|
|
347
|
+
fieldName: fieldMetadata.relationModelFieldName,
|
|
348
|
+
relationModelFieldName: fieldMetadata.name,
|
|
357
349
|
}
|
|
358
350
|
return new ManyToManyRelationFieldCrudManager(inverseManyToManyOptions);
|
|
359
351
|
}
|