@solidstarters/solid-core 1.2.97 → 1.2.99
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.d.ts +1 -1
- package/dist/controllers/setting.controller.d.ts.map +1 -1
- package/dist/controllers/setting.controller.js +6 -4
- 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/dtos/update-settings.dto.d.ts.map +1 -1
- package/dist/dtos/update-settings.dto.js +1 -2
- package/dist/dtos/update-settings.dto.js.map +1 -1
- package/dist/entities/common.entity.d.ts +3 -0
- package/dist/entities/common.entity.d.ts.map +1 -1
- package/dist/entities/common.entity.js +9 -1
- package/dist/entities/common.entity.js.map +1 -1
- package/dist/entities/menu-item-metadata.entity.js +1 -1
- package/dist/entities/menu-item-metadata.entity.js.map +1 -1
- package/dist/helpers/field-crud-managers/PasswordFieldCrudManager.d.ts +1 -0
- package/dist/helpers/field-crud-managers/PasswordFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/PasswordFieldCrudManager.js +3 -1
- package/dist/helpers/field-crud-managers/PasswordFieldCrudManager.js.map +1 -1
- package/dist/helpers/model-metadata-helper.service.d.ts +8 -0
- package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -0
- package/dist/helpers/model-metadata-helper.service.js +118 -0
- package/dist/helpers/model-metadata-helper.service.js.map +1 -0
- package/dist/helpers/schematic.service.d.ts +4 -1
- package/dist/helpers/schematic.service.d.ts.map +1 -1
- package/dist/helpers/schematic.service.js +8 -10
- package/dist/helpers/schematic.service.js.map +1 -1
- package/dist/helpers/solid-registry.d.ts +3 -1
- package/dist/helpers/solid-registry.d.ts.map +1 -1
- package/dist/helpers/solid-registry.js +4 -0
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.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/seeders/system-fields-seeder.service.d.ts +13 -0
- package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -0
- package/dist/seeders/system-fields-seeder.service.js +56 -0
- package/dist/seeders/system-fields-seeder.service.js.map +1 -0
- package/dist/services/authentication.service.js +4 -4
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/computed-fields/concat-computed-field-provider.service.d.ts.map +1 -1
- package/dist/services/computed-fields/concat-computed-field-provider.service.js +3 -0
- package/dist/services/computed-fields/concat-computed-field-provider.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +1 -1
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +7 -6
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +3 -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/services/setting.service.d.ts +1 -1
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +27 -1
- package/dist/services/setting.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +8 -2
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/audit.subscriber.d.ts +4 -5
- package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
- package/dist/subscribers/audit.subscriber.js +12 -12
- package/dist/subscribers/audit.subscriber.js.map +1 -1
- package/dist/subscribers/created-by-updated-by.subscriber.d.ts +12 -0
- package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -0
- package/dist/subscribers/created-by-updated-by.subscriber.js +67 -0
- package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -0
- package/dist/subscribers/model.subscriber.d.ts +4 -1
- package/dist/subscribers/model.subscriber.d.ts.map +1 -1
- package/dist/subscribers/model.subscriber.js +20 -67
- package/dist/subscribers/model.subscriber.js.map +1 -1
- package/dist/subscribers/{softDeleteAwareEventSubscriber.subscriber.d.ts → soft-delete-aware-event.subscriber.d.ts} +1 -1
- package/dist/subscribers/soft-delete-aware-event.subscriber.d.ts.map +1 -0
- package/dist/subscribers/{softDeleteAwareEventSubscriber.subscriber.js → soft-delete-aware-event.subscriber.js} +1 -1
- package/dist/subscribers/soft-delete-aware-event.subscriber.js.map +1 -0
- 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 +4 -3
- 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/dtos/update-settings.dto.ts +2 -3
- package/src/entities/common.entity.ts +8 -2
- package/src/entities/menu-item-metadata.entity.ts +1 -1
- package/src/helpers/field-crud-managers/PasswordFieldCrudManager.ts +5 -1
- package/src/helpers/model-metadata-helper.service.ts +109 -0
- package/src/helpers/schematic.service.ts +10 -11
- package/src/helpers/solid-registry.ts +6 -1
- package/src/index.ts +2 -2
- package/src/interfaces.ts +3 -3
- package/src/seeders/module-metadata-seeder.service.ts +3 -1
- package/src/seeders/system-fields-seeder.service.ts +53 -0
- package/src/services/authentication.service.ts +4 -4
- package/src/services/computed-fields/concat-computed-field-provider.service.ts +3 -0
- package/src/services/crud.service.ts +7 -6
- package/src/services/model-metadata.service.ts +17 -15
- package/src/services/module-metadata.service.ts +28 -4
- package/src/services/setting.service.ts +30 -1
- package/src/solid-core.module.ts +8 -1
- package/src/subscribers/audit.subscriber.ts +10 -11
- package/src/subscribers/created-by-updated-by.subscriber.ts +54 -0
- package/src/subscribers/model.subscriber.ts +16 -70
- package/src/subscribers/view-metadata.subscriber.ts +19 -15
- package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.d.ts.map +0 -1
- package/dist/subscribers/softDeleteAwareEventSubscriber.subscriber.js.map +0 -1
- package/src/services/pending_import_issues +0 -3
- /package/src/subscribers/{softDeleteAwareEventSubscriber.subscriber.ts → soft-delete-aware-event.subscriber.ts} +0 -0
|
@@ -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);
|
|
@@ -926,7 +928,7 @@ export class ModelMetadataService {
|
|
|
926
928
|
modelEnableSoftDelete: model.enableSoftDelete,
|
|
927
929
|
parentModel: model.parentModel?.singularName,
|
|
928
930
|
parentModule: model.parentModel?.module?.name,
|
|
929
|
-
|
|
931
|
+
draftPublishWorkflowEnabled: model.draftPublishWorkflow,
|
|
930
932
|
},
|
|
931
933
|
dryRun
|
|
932
934
|
);
|
|
@@ -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);
|
|
@@ -48,6 +48,7 @@ export class SettingService extends CRUDService<Setting> {
|
|
|
48
48
|
authPagesLayout: "center",
|
|
49
49
|
authPagesTheme: "light",
|
|
50
50
|
appLogo: "",
|
|
51
|
+
companylogo: "",
|
|
51
52
|
appLogoPosition: "in_form_view",
|
|
52
53
|
showAuthContent: false,
|
|
53
54
|
appTitle: process.env.SOLID_APP_NAME || "Solid App",
|
|
@@ -130,6 +131,7 @@ export class SettingService extends CRUDService<Setting> {
|
|
|
130
131
|
authPagesLayout: "center",
|
|
131
132
|
authPagesTheme: "light",
|
|
132
133
|
appLogo: "",
|
|
134
|
+
companylogo: "",
|
|
133
135
|
appLogoPosition: "in_form_view", //in_form_view | in_image_view
|
|
134
136
|
showAuthContent: false,
|
|
135
137
|
appTitle: process.env.SOLID_APP_NAME || "Solid App",
|
|
@@ -176,14 +178,41 @@ export class SettingService extends CRUDService<Setting> {
|
|
|
176
178
|
}
|
|
177
179
|
}
|
|
178
180
|
|
|
179
|
-
async updateSettings(settings: Record<string, any>): Promise<Setting[]> {
|
|
181
|
+
async updateSettings(settings: Record<string, any> = {}, files: Array<Express.Multer.File> = []): Promise<Setting[]> {
|
|
180
182
|
const existingSettings = await this.repo.find();
|
|
181
183
|
const existingKeys = new Set(existingSettings.map(s => s.key));
|
|
182
184
|
|
|
183
185
|
const settingsToUpdate: Setting[] = [];
|
|
184
186
|
const settingsToCreate: Setting[] = [];
|
|
185
187
|
|
|
188
|
+
if (files && files.length > 0) {
|
|
189
|
+
for (const file of files) {
|
|
190
|
+
const key = file.fieldname;
|
|
191
|
+
const fileStoragePath = `${this.configService.get('app-builder.fileStorageDir')}/${file.filename}-${file.originalname}`;
|
|
192
|
+
|
|
193
|
+
await this.fileService.copyFile(file.path, fileStoragePath);
|
|
194
|
+
await this.fileService.deleteFile(file.path);
|
|
195
|
+
|
|
196
|
+
if (existingKeys.has(key)) {
|
|
197
|
+
const existingSetting = existingSettings.find(s => s.key === key);
|
|
198
|
+
if (existingSetting) {
|
|
199
|
+
existingSetting.value = fileStoragePath;
|
|
200
|
+
settingsToUpdate.push(existingSetting);
|
|
201
|
+
}
|
|
202
|
+
} else {
|
|
203
|
+
const newSetting = new Setting();
|
|
204
|
+
newSetting.key = key;
|
|
205
|
+
newSetting.value = fileStoragePath;
|
|
206
|
+
settingsToCreate.push(newSetting);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
186
211
|
for (const [key, value] of Object.entries(settings)) {
|
|
212
|
+
if (files && files.some(f => f.fieldname === key)) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
|
|
187
216
|
const stringValue = typeof value === 'boolean' ? value.toString() :
|
|
188
217
|
Array.isArray(value) ? value.join(',') :
|
|
189
218
|
value === null || value === undefined ? '' : String(value);
|
package/src/solid-core.module.ts
CHANGED
|
@@ -119,7 +119,7 @@ import { Msg91OTPService } from './services/sms/Msg91OTPService';
|
|
|
119
119
|
import { Msg91SMSService } from './services/sms/Msg91SMSService';
|
|
120
120
|
// import { UserService } from './services/user.service';
|
|
121
121
|
import { Msg91WhatsappService } from './services/whatsapp/Msg91WhatsappService';
|
|
122
|
-
import { SoftDeleteAwareEventSubscriber } from './subscribers/
|
|
122
|
+
import { SoftDeleteAwareEventSubscriber } from './subscribers/soft-delete-aware-event.subscriber';
|
|
123
123
|
|
|
124
124
|
import { PermissionMetadataController } from './controllers/permission-metadata.controller';
|
|
125
125
|
import { PermissionMetadata } from './entities/permission-metadata.entity';
|
|
@@ -181,6 +181,9 @@ import { ImportTransactionErrorLog } from './entities/import-transaction-error-l
|
|
|
181
181
|
import { ImportTransactionErrorLogService } from './services/import-transaction-error-log.service';
|
|
182
182
|
import { ImportTransactionErrorLogController } from './controllers/import-transaction-error-log.controller';
|
|
183
183
|
import { LocaleListSelectionProvider } from './services/selection-providers/locale-list-selection-provider.service';
|
|
184
|
+
import { CreatedByUpdatedBySubscriber } from './subscribers/created-by-updated-by.subscriber';
|
|
185
|
+
import { SystemFieldsSeederService } from './seeders/system-fields-seeder.service';
|
|
186
|
+
import { ModelMetadataHelperService } from './helpers/model-metadata-helper.service';
|
|
184
187
|
|
|
185
188
|
|
|
186
189
|
@Global()
|
|
@@ -299,6 +302,7 @@ import { LocaleListSelectionProvider } from './services/selection-providers/loca
|
|
|
299
302
|
ModuleMetadataService,
|
|
300
303
|
ModuleMetadataHelperService,
|
|
301
304
|
ModelMetadataService,
|
|
305
|
+
ModelMetadataHelperService,
|
|
302
306
|
FieldMetadataService,
|
|
303
307
|
RemoveFieldsCommand,
|
|
304
308
|
RefreshModelCommand,
|
|
@@ -391,6 +395,9 @@ import { LocaleListSelectionProvider } from './services/selection-providers/loca
|
|
|
391
395
|
FieldRepository,
|
|
392
396
|
ImportTransactionService,
|
|
393
397
|
ImportTransactionErrorLogService,
|
|
398
|
+
CreatedByUpdatedBySubscriber,
|
|
399
|
+
SystemFieldsSeederService,
|
|
400
|
+
|
|
394
401
|
],
|
|
395
402
|
exports: [
|
|
396
403
|
ModuleMetadataService,
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import { Connection, EntitySubscriberInterface, EventSubscriber, InsertEvent, RemoveEvent, UpdateEvent } from 'typeorm';
|
|
2
|
-
import { ChatterMessageService } from '../services/chatter-message.service';
|
|
3
|
-
import { EntityMetadata } from 'typeorm';
|
|
4
|
-
import { InjectRepository } from '@nestjs/typeorm';
|
|
5
|
-
import { ModelMetadata } from '../entities/model-metadata.entity';
|
|
6
|
-
import { Repository } from 'typeorm';
|
|
7
1
|
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
|
|
3
|
+
import { DataSource, EntityMetadata, EntitySubscriberInterface, EventSubscriber, InsertEvent, RemoveEvent, Repository, UpdateEvent } from 'typeorm';
|
|
4
|
+
import { ModelMetadata } from '../entities/model-metadata.entity';
|
|
5
|
+
import { ChatterMessageService } from '../services/chatter-message.service';
|
|
8
6
|
@Injectable()
|
|
9
7
|
@EventSubscriber()
|
|
10
8
|
export class AuditSubscriber implements EntitySubscriberInterface {
|
|
11
|
-
|
|
9
|
+
|
|
12
10
|
constructor(
|
|
13
|
-
|
|
11
|
+
@InjectDataSource()
|
|
12
|
+
private readonly dataSource: DataSource,
|
|
14
13
|
private readonly chatterMessageService: ChatterMessageService,
|
|
15
14
|
@InjectRepository(ModelMetadata)
|
|
16
15
|
private readonly modelMetadataRepo: Repository<ModelMetadata>,
|
|
17
16
|
) {
|
|
18
|
-
|
|
17
|
+
this.dataSource.subscribers.push(this);
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
private async shouldTrackAudit(entity: any, metadata: EntityMetadata): Promise<boolean> {
|
|
@@ -33,8 +32,8 @@ export class AuditSubscriber implements EntitySubscriberInterface {
|
|
|
33
32
|
return false;
|
|
34
33
|
}
|
|
35
34
|
|
|
36
|
-
const auditFields = model.fields.filter(field =>
|
|
37
|
-
field.enableAuditTracking &&
|
|
35
|
+
const auditFields = model.fields.filter(field =>
|
|
36
|
+
field.enableAuditTracking &&
|
|
38
37
|
!['mediaSingle', 'mediaMultiple', 'computed', 'richText', 'json'].includes(field.type) &&
|
|
39
38
|
!(field.type === 'relation' && field.relationType === 'one-to-many')
|
|
40
39
|
);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Injectable } from "@nestjs/common";
|
|
2
|
+
import { InjectDataSource } from "@nestjs/typeorm";
|
|
3
|
+
import { User } from "src/entities/user.entity";
|
|
4
|
+
import { ActiveUserData } from "src/interfaces/active-user-data.interface";
|
|
5
|
+
import { RequestContextService } from "src/services/request-context.service";
|
|
6
|
+
import { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent, UpdateEvent } from "typeorm";
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
@EventSubscriber()
|
|
10
|
+
export class CreatedByUpdatedBySubscriber implements EntitySubscriberInterface {
|
|
11
|
+
constructor(
|
|
12
|
+
@InjectDataSource()
|
|
13
|
+
private readonly dataSource: DataSource,
|
|
14
|
+
private readonly requestContextService: RequestContextService,
|
|
15
|
+
) {
|
|
16
|
+
this.dataSource.subscribers.push(this);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async beforeInsert(event: InsertEvent<any>) {
|
|
20
|
+
await this.stampUserField(event, true);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async beforeUpdate(event: UpdateEvent<any>) {
|
|
24
|
+
await this.stampUserField(event, false);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private async stampUserField(event: InsertEvent<any> | UpdateEvent<any>, isInsert: boolean){
|
|
28
|
+
if (!event.entity) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Get the current active user details from the request context
|
|
32
|
+
const activeUserOrUndefined = this.requestContextService.getActiveUser;
|
|
33
|
+
if (!activeUserOrUndefined) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const loadedUser = await this.loadUser(activeUserOrUndefined as unknown as ActiveUserData);
|
|
38
|
+
if (isInsert) {
|
|
39
|
+
event.entity.createdBy = loadedUser;
|
|
40
|
+
event.entity.updatedBy = loadedUser; // For insert, we set both createdBy and updatedBy to the same user
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
event.entity.updatedBy = loadedUser;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private async loadUser(activeUser: ActiveUserData): Promise<User> {
|
|
48
|
+
const userRepo = this.dataSource.getRepository(User); // Assuming 'User' is the entity name for users in your application
|
|
49
|
+
const loadedUser = await userRepo.findOne({
|
|
50
|
+
where: { id: activeUser.sub }, // Assuming 'sub' is the user ID in the JWT token
|
|
51
|
+
});
|
|
52
|
+
return loadedUser;;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent, UpdateEvent } from 'typeorm';
|
|
2
|
-
import { ModelMetadata } from '../entities/model-metadata.entity';
|
|
3
|
-
import { FieldMetadata } from '../entities/field-metadata.entity';
|
|
4
1
|
import { Injectable, Logger, NotFoundException } from '@nestjs/common';
|
|
5
2
|
import { InjectDataSource } from '@nestjs/typeorm';
|
|
6
|
-
import {
|
|
3
|
+
import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
|
|
4
|
+
import { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent } from 'typeorm';
|
|
5
|
+
import { FieldMetadata } from '../entities/field-metadata.entity';
|
|
6
|
+
import { ModelMetadata } from '../entities/model-metadata.entity';
|
|
7
7
|
|
|
8
8
|
@EventSubscriber()
|
|
9
9
|
@Injectable()
|
|
@@ -13,7 +13,7 @@ export class ModelSubscriber implements EntitySubscriberInterface<ModelMetadata>
|
|
|
13
13
|
constructor(
|
|
14
14
|
@InjectDataSource()
|
|
15
15
|
private readonly dataSource: DataSource,
|
|
16
|
-
|
|
16
|
+
private readonly modelHelperService: ModelMetadataHelperService,
|
|
17
17
|
) {
|
|
18
18
|
this.dataSource.subscribers.push(this);
|
|
19
19
|
}
|
|
@@ -25,76 +25,22 @@ export class ModelSubscriber implements EntitySubscriberInterface<ModelMetadata>
|
|
|
25
25
|
async afterInsert(event: InsertEvent<ModelMetadata>): Promise<void> {
|
|
26
26
|
this.logger.debug(`[ModelSubscriber] getting invoked for insert on model: ${event.entity.singularName}`);
|
|
27
27
|
|
|
28
|
-
// const fieldMetadataRepo = event.manager.getRepository(FieldMetadata);
|
|
29
|
-
// const fieldMetadataRepo = this.dataSource.getRepository(FieldMetadata);
|
|
30
28
|
const transactionManager = event.queryRunner?.manager;
|
|
31
29
|
if (!transactionManager) {
|
|
32
30
|
throw new NotFoundException(`Trnasaction Manager not found`);
|
|
33
|
-
|
|
34
31
|
}
|
|
35
32
|
|
|
36
|
-
|
|
37
|
-
{
|
|
38
|
-
name: "id",
|
|
39
|
-
displayName: "Id",
|
|
40
|
-
type: "int",
|
|
41
|
-
ormType: "bigint",
|
|
42
|
-
isSystem: true,
|
|
43
|
-
model: event.entity,
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: "createdAt",
|
|
47
|
-
displayName: "Created At",
|
|
48
|
-
type: "datetime",
|
|
49
|
-
ormType: "timestamp",
|
|
50
|
-
isSystem: true,
|
|
51
|
-
model: event.entity,
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
name: "updatedAt",
|
|
55
|
-
displayName: "Updated At",
|
|
56
|
-
type: "datetime",
|
|
57
|
-
ormType: "timestamp",
|
|
58
|
-
isSystem: true,
|
|
59
|
-
model: event.entity,
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
name: "deletedAt",
|
|
63
|
-
displayName: "Deleted At",
|
|
64
|
-
type: "datetime",
|
|
65
|
-
ormType: "timestamp",
|
|
66
|
-
isSystem: true,
|
|
67
|
-
model: event.entity,
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
name: "publishedAt",
|
|
71
|
-
displayName: "Published At",
|
|
72
|
-
type: "datetime",
|
|
73
|
-
ormType: "timestamp",
|
|
74
|
-
isSystem: true,
|
|
75
|
-
model: event.entity,
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
name: "localeName",
|
|
79
|
-
displayName: "Locale",
|
|
80
|
-
type: "shortText",
|
|
81
|
-
ormType: "varchar",
|
|
82
|
-
isSystem: true,
|
|
83
|
-
model: event.entity,
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
name: "defaultEntityLocaleId",
|
|
87
|
-
displayName: "Default Entity Locale Id",
|
|
88
|
-
type: "int",
|
|
89
|
-
ormType: "integer",
|
|
90
|
-
isSystem: true,
|
|
91
|
-
model: event.entity,
|
|
92
|
-
}
|
|
93
|
-
];
|
|
94
|
-
await transactionManager.save(FieldMetadata, systemFieldsMetadata);
|
|
95
|
-
// Save to the database.
|
|
96
|
-
// fieldMetadataRepo.save(systemFieldsMetadata);
|
|
97
|
-
|
|
33
|
+
await transactionManager.save(FieldMetadata, this.systemFieldMetadataToBeAdded(event));
|
|
98
34
|
}
|
|
99
35
|
|
|
36
|
+
|
|
37
|
+
private systemFieldMetadataToBeAdded(event: InsertEvent<ModelMetadata>) {
|
|
38
|
+
const systemFieldsDefaultMetadata = this.modelHelperService.getSystemFieldsMetadata();
|
|
39
|
+
// map and add the model as event.entity for the above metadata
|
|
40
|
+
const systemFieldsMetadata = systemFieldsDefaultMetadata.map(field => ({
|
|
41
|
+
...field,
|
|
42
|
+
model: event.entity,
|
|
43
|
+
}));
|
|
44
|
+
return systemFieldsMetadata;
|
|
45
|
+
}
|
|
100
46
|
}
|
|
@@ -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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"softDeleteAwareEventSubscriber.subscriber.d.ts","sourceRoot":"","sources":["../../src/subscribers/softDeleteAwareEventSubscriber.subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,yBAAyB,EAAmB,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGhH,qBAEa,8BAA+B,YAAW,yBAAyB;IAIxE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAH/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;gBAGrD,UAAU,EAAE,UAAU;IAK3C,gBAAgB,CAAC,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI;IAclE,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI;CAM/D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"softDeleteAwareEventSubscriber.subscriber.js","sourceRoot":"","sources":["../../src/subscribers/softDeleteAwareEventSubscriber.subscriber.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAuE;AACvE,6CAAmD;AACnD,qCAAgH;AAKzG,IAAM,8BAA8B,sCAApC,MAAM,8BAA8B;IAEvC,YAEI,UAAuC;QAAtB,eAAU,GAAV,UAAU,CAAY;QAH1B,WAAM,GAAG,IAAI,eAAM,CAAC,gCAA8B,CAAC,IAAI,CAAC,CAAC;QAKtE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,KAA2B;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,CAAC,cAAc,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5C,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,cAAc,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAEpE,CAAC;IAED,aAAa,CAAC,KAAwB;QAClC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,MAAM,CAAC,cAAc,GAAG,aAAa,CAAC;IAC1C,CAAC;CAEJ,CAAA;AA7BY,wEAA8B;yCAA9B,8BAA8B;IAF1C,IAAA,yBAAe,GAAE;IACjB,IAAA,mBAAU,GAAE;IAIJ,WAAA,IAAA,0BAAgB,GAAE,CAAA;qCACU,oBAAU;GAJlC,8BAA8B,CA6B1C"}
|
|
File without changes
|