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