@solidstarters/solid-core 1.2.97 → 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/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/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/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/interfaces.ts +3 -3
- package/src/seeders/module-metadata-seeder.service.ts +3 -1
- 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/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) { }
|
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
|
|
|
@@ -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
|
}
|