@solidstarters/solid-core 1.2.158 → 1.2.159
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/factories/whatsapp.factory.d.ts.map +1 -1
- package/dist/factories/whatsapp.factory.js +1 -1
- package/dist/factories/whatsapp.factory.js.map +1 -1
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +13 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/model-metadata-helper.service.d.ts +5 -1
- package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/model-metadata-helper.service.js +32 -2
- package/dist/helpers/model-metadata-helper.service.js.map +1 -1
- package/dist/helpers/string.helper.d.ts +2 -0
- package/dist/helpers/string.helper.d.ts.map +1 -0
- package/dist/helpers/string.helper.js +10 -0
- package/dist/helpers/string.helper.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/repository/security-rule.repository.d.ts.map +1 -1
- package/dist/repository/security-rule.repository.js +16 -9
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/repository/user.repository.d.ts +12 -0
- package/dist/repository/user.repository.d.ts.map +1 -0
- package/dist/repository/user.repository.js +34 -0
- package/dist/repository/user.repository.js.map +1 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts +12 -12
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +31 -13
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +40 -6
- package/dist/services/chatter-message.service.d.ts +8 -2
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +155 -30
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud-helper.service.d.ts +7 -3
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +17 -5
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/user.service.d.ts +3 -2
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +2 -2
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +3 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +5 -2
- package/dist/services/view-metadata.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/audit.subscriber.d.ts +3 -1
- package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
- package/dist/subscribers/audit.subscriber.js +10 -5
- package/dist/subscribers/audit.subscriber.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/factories/whatsapp.factory.ts +2 -1
- package/src/helpers/index.ts +9 -0
- package/src/helpers/model-metadata-helper.service.ts +30 -2
- package/src/helpers/string.helper.ts +4 -0
- package/src/index.ts +1 -0
- package/src/repository/security-rule.repository.ts +25 -12
- package/src/repository/user.repository.ts +17 -0
- package/src/seeders/module-metadata-seeder.service.ts +34 -15
- package/src/seeders/seed-data/solid-core-metadata.json +40 -6
- package/src/services/chatter-message.service.ts +185 -35
- package/src/services/crud-helper.service.ts +24 -6
- package/src/services/user.service.ts +3 -2
- package/src/services/view-metadata.service.ts +3 -1
- package/src/solid-core.module.ts +3 -0
- package/src/subscribers/audit.subscriber.ts +9 -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.159",
|
|
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",
|
|
@@ -22,11 +22,12 @@ export class WhatsAppFactory {
|
|
|
22
22
|
|
|
23
23
|
getWhatsappService(name: string = null): IWhatsAppTransport {
|
|
24
24
|
// This is the default provider
|
|
25
|
-
const whatsappServiceName = this.commonConfiguration.whatsappProvider
|
|
25
|
+
const whatsappServiceName = name || this.commonConfiguration.whatsappProvider;
|
|
26
26
|
if (!whatsappServiceName) {
|
|
27
27
|
throw new Error("Unable to resolve whatsapp provider")
|
|
28
28
|
}
|
|
29
29
|
const whatsappProviders = this.solidRegistry.getWhatsappProviders();
|
|
30
|
+
|
|
30
31
|
// Return the instance which matches the whatsappServiceName
|
|
31
32
|
if (!whatsappProviders.length) {
|
|
32
33
|
// throw new Error("No mail providers are registered.");
|
|
@@ -2,13 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
import { Injectable, Logger } from "@nestjs/common";
|
|
4
4
|
import { SolidRegistry } from "./solid-registry";
|
|
5
|
-
import { In } from "typeorm";
|
|
5
|
+
import { In, Repository } from "typeorm";
|
|
6
|
+
import { InjectRepository } from "@nestjs/typeorm";
|
|
7
|
+
import { ModelMetadata } from "src/entities/model-metadata.entity";
|
|
6
8
|
|
|
7
9
|
@Injectable()
|
|
8
10
|
export class ModelMetadataHelperService {
|
|
9
11
|
private readonly logger = new Logger(ModelMetadataHelperService.name);
|
|
10
12
|
|
|
11
|
-
constructor(private readonly registry: SolidRegistry
|
|
13
|
+
constructor(private readonly registry: SolidRegistry,
|
|
14
|
+
@InjectRepository(ModelMetadata)
|
|
15
|
+
private readonly modelMetadataRepo: Repository<ModelMetadata>,
|
|
16
|
+
) {
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
getSystemFieldsMetadata(): any[] {
|
|
@@ -105,5 +110,28 @@ export class ModelMetadataHelperService {
|
|
|
105
110
|
return systemFieldsMetadata;
|
|
106
111
|
}
|
|
107
112
|
|
|
113
|
+
async loadFieldHierarchy(modelName: any) {
|
|
114
|
+
const model = await this.modelMetadataRepo.findOne({
|
|
115
|
+
where: {
|
|
116
|
+
singularName: modelName,
|
|
117
|
+
},
|
|
118
|
+
relations: {
|
|
119
|
+
fields: true,
|
|
120
|
+
parentModel: {
|
|
121
|
+
fields: true,
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
const fields = [];
|
|
126
|
+
if (model) {
|
|
127
|
+
// Add the fields of the current model
|
|
128
|
+
fields.push(...model.fields);
|
|
108
129
|
|
|
130
|
+
// Add the fields of the parent model
|
|
131
|
+
if (model.parentModel) {
|
|
132
|
+
fields.push(...model.parentModel.fields);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return fields;
|
|
136
|
+
}
|
|
109
137
|
}
|
package/src/index.ts
CHANGED
|
@@ -279,6 +279,7 @@ export * from './factories/mail.factory'
|
|
|
279
279
|
export * from './repository/solid-base.repository'
|
|
280
280
|
export * from './repository/security-rule.repository'
|
|
281
281
|
export * from './repository/field.repository'
|
|
282
|
+
export * from './repository/chatter-message.repository'
|
|
282
283
|
|
|
283
284
|
|
|
284
285
|
//softDeleteAwareEventSubscriber.subscriber.ts
|
|
@@ -8,8 +8,8 @@ import { RoleMetadata } from 'src/entities/role-metadata.entity';
|
|
|
8
8
|
import { SecurityRule } from 'src/entities/security-rule.entity';
|
|
9
9
|
import { SolidRegistry } from 'src/helpers/solid-registry';
|
|
10
10
|
import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
|
|
11
|
-
import { CrudHelperService } from 'src/services/crud-helper.service';
|
|
12
|
-
import { DataSource, Repository, SelectQueryBuilder } from 'typeorm';
|
|
11
|
+
import { CrudHelperService, FilterCombinator } from 'src/services/crud-helper.service';
|
|
12
|
+
import { Brackets, DataSource, Repository, SelectQueryBuilder } from 'typeorm';
|
|
13
13
|
|
|
14
14
|
@Injectable()
|
|
15
15
|
export class SecurityRuleRepository extends Repository<SecurityRule> {
|
|
@@ -26,18 +26,31 @@ export class SecurityRuleRepository extends Repository<SecurityRule> {
|
|
|
26
26
|
// Fetch the security rules for the model and roles
|
|
27
27
|
const securityRules = this.solidRegistry.getSecurityRules(modelSingularName, activeUser.roles);
|
|
28
28
|
|
|
29
|
-
//
|
|
30
|
-
securityRules.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
// If no security rules, return the original query builder
|
|
30
|
+
if (!securityRules.length) {
|
|
31
|
+
return qb;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Apply each security rule to the query builder. The rules are combined with OR logic at the top level.
|
|
35
|
+
qb.andWhere(new Brackets((outerQb) => {
|
|
36
|
+
for (const rule of securityRules) {
|
|
37
|
+
try {
|
|
38
|
+
const parsedRule = JSON.parse(
|
|
39
|
+
this.resolveSecurityRuleConfig(rule.securityRuleConfig, activeUser)
|
|
40
|
+
) as SecurityRuleConfig;
|
|
41
|
+
|
|
34
42
|
if (parsedRule && parsedRule.filters) {
|
|
35
|
-
|
|
43
|
+
outerQb.orWhere( // combine each rule-group with OR at the outer level
|
|
44
|
+
new Brackets((innerQb) => {
|
|
45
|
+
this.crudHelperService.applyFilters(innerQb, parsedRule.filters, securityRuleAlias, qb); // AND within a rule
|
|
46
|
+
})
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
} catch (error) {
|
|
50
|
+
this.logger.warn(`Error parsing security rule: ${rule.securityRuleConfig}`, error);
|
|
36
51
|
}
|
|
37
|
-
} catch (error) {
|
|
38
|
-
this.logger.warn(`Error parsing security rule: ${rule.securityRuleConfig}`, error);
|
|
39
52
|
}
|
|
40
|
-
});
|
|
53
|
+
}));
|
|
41
54
|
|
|
42
55
|
return qb;
|
|
43
56
|
}
|
|
@@ -85,7 +98,7 @@ export class SecurityRuleRepository extends Repository<SecurityRule> {
|
|
|
85
98
|
},
|
|
86
99
|
});
|
|
87
100
|
createDto['role'] = role;
|
|
88
|
-
}
|
|
101
|
+
}
|
|
89
102
|
|
|
90
103
|
if (createDto.roleUserKey) {
|
|
91
104
|
const role = await roleRepository.findOne({
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Injectable } from "@nestjs/common";
|
|
2
|
+
import { User } from "src/entities/user.entity";
|
|
3
|
+
import { RequestContextService } from "src/services/request-context.service";
|
|
4
|
+
import { DataSource } from "typeorm";
|
|
5
|
+
import { SecurityRuleRepository } from "./security-rule.repository";
|
|
6
|
+
import { SolidBaseRepository } from "./solid-base.repository";
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
export class UserRepository extends SolidBaseRepository<User> {
|
|
10
|
+
constructor(
|
|
11
|
+
readonly dataSource: DataSource,
|
|
12
|
+
readonly requestContextService: RequestContextService,
|
|
13
|
+
readonly securityRuleRepository: SecurityRuleRepository,
|
|
14
|
+
) {
|
|
15
|
+
super(User, dataSource, requestContextService, securityRuleRepository);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -41,7 +41,8 @@ import { CreateDashboardDto } from 'src/dtos/create-dashboard.dto';
|
|
|
41
41
|
import { DashboardRepository } from 'src/repository/dashboard.repository';
|
|
42
42
|
// import { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto';
|
|
43
43
|
import { ScheduledJobRepository } from 'src/repository/scheduled-job.repository';
|
|
44
|
-
import { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto'
|
|
44
|
+
import { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto'
|
|
45
|
+
import { deepFreeze } from 'src/helpers';
|
|
45
46
|
|
|
46
47
|
@Injectable()
|
|
47
48
|
export class ModuleMetadataSeederService {
|
|
@@ -128,7 +129,8 @@ export class ModuleMetadataSeederService {
|
|
|
128
129
|
for (let i = 0; i < seedDataFiles.length; i++) {
|
|
129
130
|
|
|
130
131
|
// Module, model & field handling.
|
|
131
|
-
const overallMetadata = seedDataFiles[i];
|
|
132
|
+
const overallMetadata = deepFreeze(seedDataFiles[i]);
|
|
133
|
+
|
|
132
134
|
// const fullPath = path.join(process.cwd(), seedDataFile);
|
|
133
135
|
|
|
134
136
|
// For each module metadata seed file provided, read contents, parse & convert to a variable.
|
|
@@ -317,14 +319,20 @@ export class ModuleMetadataSeederService {
|
|
|
317
319
|
}
|
|
318
320
|
}
|
|
319
321
|
|
|
320
|
-
async seedMediaStorageProviders(
|
|
322
|
+
async seedMediaStorageProviders(_mediaStorageProviders: any) {
|
|
323
|
+
const mediaStorageProviders = structuredClone(_mediaStorageProviders);
|
|
324
|
+
if (!mediaStorageProviders) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
321
327
|
for (let i = 0; i < mediaStorageProviders.length; i++) {
|
|
322
328
|
const mediaStorageProivder = mediaStorageProviders[i];
|
|
323
329
|
await this.mediaStorageProviderMetadataService.upsert(mediaStorageProivder);
|
|
324
330
|
}
|
|
325
331
|
}
|
|
326
332
|
|
|
327
|
-
async seedEmailTemplates(
|
|
333
|
+
async seedEmailTemplates(_emailTemplates: CreateEmailTemplateDto[], _moduleMetadata: CreateModuleMetadataDto) {
|
|
334
|
+
const emailTemplates = structuredClone(_emailTemplates);
|
|
335
|
+
const moduleMetadata = structuredClone(_moduleMetadata);
|
|
328
336
|
if (!emailTemplates) {
|
|
329
337
|
return;
|
|
330
338
|
}
|
|
@@ -360,7 +368,9 @@ export class ModuleMetadataSeederService {
|
|
|
360
368
|
|
|
361
369
|
}
|
|
362
370
|
|
|
363
|
-
async seedSmsTemplates(
|
|
371
|
+
async seedSmsTemplates(_smsTemplates: CreateSmsTemplateDto[], _moduleMetadata: CreateModuleMetadataDto) {
|
|
372
|
+
const smsTemplates = structuredClone(_smsTemplates);
|
|
373
|
+
const moduleMetadata = structuredClone(_moduleMetadata);
|
|
364
374
|
if (!smsTemplates) {
|
|
365
375
|
return;
|
|
366
376
|
}
|
|
@@ -397,6 +407,7 @@ export class ModuleMetadataSeederService {
|
|
|
397
407
|
}
|
|
398
408
|
|
|
399
409
|
async seedMenus(menus: any) {
|
|
410
|
+
// const menus = structuredClone(_menus);
|
|
400
411
|
if (!menus) {
|
|
401
412
|
return;
|
|
402
413
|
}
|
|
@@ -434,7 +445,8 @@ export class ModuleMetadataSeederService {
|
|
|
434
445
|
}
|
|
435
446
|
}
|
|
436
447
|
|
|
437
|
-
async seedActions(
|
|
448
|
+
async seedActions(_actions: any) {
|
|
449
|
+
const actions = structuredClone(_actions);
|
|
438
450
|
if (!actions) {
|
|
439
451
|
return;
|
|
440
452
|
}
|
|
@@ -455,7 +467,8 @@ export class ModuleMetadataSeederService {
|
|
|
455
467
|
}
|
|
456
468
|
}
|
|
457
469
|
|
|
458
|
-
async seedViews(
|
|
470
|
+
async seedViews(_views: any) {
|
|
471
|
+
const views = structuredClone(_views);
|
|
459
472
|
if (!views) {
|
|
460
473
|
return;
|
|
461
474
|
}
|
|
@@ -478,7 +491,8 @@ export class ModuleMetadataSeederService {
|
|
|
478
491
|
}
|
|
479
492
|
}
|
|
480
493
|
|
|
481
|
-
async seedUsers(
|
|
494
|
+
async seedUsers(_users) {
|
|
495
|
+
const users = structuredClone(_users);
|
|
482
496
|
if (!users) {
|
|
483
497
|
return;
|
|
484
498
|
}
|
|
@@ -499,8 +513,8 @@ export class ModuleMetadataSeederService {
|
|
|
499
513
|
}
|
|
500
514
|
}
|
|
501
515
|
|
|
502
|
-
async seedModuleModelFields(
|
|
503
|
-
|
|
516
|
+
async seedModuleModelFields(_moduleMetadata: CreateModuleMetadataDto) {
|
|
517
|
+
const moduleMetadata = structuredClone(_moduleMetadata);
|
|
504
518
|
// First we create the module.
|
|
505
519
|
// await this.moduleMetadataService.removeByName(moduleMetadata.name);
|
|
506
520
|
// const module = await this.moduleMetadataService.create(moduleMetadata);
|
|
@@ -561,14 +575,16 @@ export class ModuleMetadataSeederService {
|
|
|
561
575
|
}
|
|
562
576
|
}
|
|
563
577
|
|
|
564
|
-
async seedSettings(
|
|
578
|
+
async seedSettings(_createDto: CreateSettingDto) {
|
|
579
|
+
const createDto = structuredClone(_createDto);
|
|
565
580
|
const settingsArray: any[] = await this.settingsRepo.find();
|
|
566
581
|
if (!settingsArray || settingsArray.length === 0) {
|
|
567
582
|
this.seetingService.create(createDto);
|
|
568
583
|
}
|
|
569
584
|
}
|
|
570
585
|
|
|
571
|
-
async seedSecurityRules(
|
|
586
|
+
async seedSecurityRules(_rulesDto: CreateSecurityRuleDto[]) {
|
|
587
|
+
const rulesDto = structuredClone(_rulesDto);
|
|
572
588
|
if (!rulesDto || rulesDto.length === 0) {
|
|
573
589
|
this.logger.debug(`No security rules found to seed`);
|
|
574
590
|
return;
|
|
@@ -578,7 +594,8 @@ export class ModuleMetadataSeederService {
|
|
|
578
594
|
}
|
|
579
595
|
}
|
|
580
596
|
|
|
581
|
-
async seedListOfValues(
|
|
597
|
+
async seedListOfValues(_listOfValuesDto: CreateListOfValuesDto[]) {
|
|
598
|
+
const listOfValuesDto = structuredClone(_listOfValuesDto);
|
|
582
599
|
if (!listOfValuesDto || listOfValuesDto.length === 0) {
|
|
583
600
|
this.logger.debug(`No List Of Values found to seed`);
|
|
584
601
|
return;
|
|
@@ -590,7 +607,8 @@ export class ModuleMetadataSeederService {
|
|
|
590
607
|
}
|
|
591
608
|
}
|
|
592
609
|
|
|
593
|
-
async seedDashboards(
|
|
610
|
+
async seedDashboards(_dashboardDtos: CreateDashboardDto[]) {
|
|
611
|
+
const dashboardDtos = structuredClone(_dashboardDtos);
|
|
594
612
|
if (!dashboardDtos || dashboardDtos.length === 0) {
|
|
595
613
|
this.logger.debug(`No dashboards found to seed`);
|
|
596
614
|
return;
|
|
@@ -600,7 +618,8 @@ export class ModuleMetadataSeederService {
|
|
|
600
618
|
}
|
|
601
619
|
}
|
|
602
620
|
|
|
603
|
-
async seedScheduledJobs(
|
|
621
|
+
async seedScheduledJobs(_createScheduledJobDto: CreateScheduledJobDto[]) {
|
|
622
|
+
const createScheduledJobDto = structuredClone(_createScheduledJobDto);
|
|
604
623
|
if (!createScheduledJobDto || createScheduledJobDto.length === 0) {
|
|
605
624
|
this.logger.debug(`No scheduled jobs found to seed`);
|
|
606
625
|
return;
|
|
@@ -1697,6 +1697,7 @@
|
|
|
1697
1697
|
"dataSourceType": "postgres",
|
|
1698
1698
|
"userKeyFieldUserKey": "username",
|
|
1699
1699
|
"isSystem": true,
|
|
1700
|
+
"enableAuditTracking": true,
|
|
1700
1701
|
"fields": [
|
|
1701
1702
|
{
|
|
1702
1703
|
"name": "fullName",
|
|
@@ -1709,7 +1710,8 @@
|
|
|
1709
1710
|
"index": false,
|
|
1710
1711
|
"private": false,
|
|
1711
1712
|
"encrypt": false,
|
|
1712
|
-
"isSystem": true
|
|
1713
|
+
"isSystem": true,
|
|
1714
|
+
"enableAuditTracking": true
|
|
1713
1715
|
},
|
|
1714
1716
|
{
|
|
1715
1717
|
"name": "username",
|
|
@@ -1722,7 +1724,8 @@
|
|
|
1722
1724
|
"index": true,
|
|
1723
1725
|
"private": false,
|
|
1724
1726
|
"encrypt": false,
|
|
1725
|
-
"isSystem": true
|
|
1727
|
+
"isSystem": true,
|
|
1728
|
+
"enableAuditTracking": true
|
|
1726
1729
|
},
|
|
1727
1730
|
{
|
|
1728
1731
|
"name": "email",
|
|
@@ -1735,7 +1738,8 @@
|
|
|
1735
1738
|
"index": true,
|
|
1736
1739
|
"private": false,
|
|
1737
1740
|
"encrypt": false,
|
|
1738
|
-
"isSystem": true
|
|
1741
|
+
"isSystem": true,
|
|
1742
|
+
"enableAuditTracking": true
|
|
1739
1743
|
},
|
|
1740
1744
|
{
|
|
1741
1745
|
"name": "mobile",
|
|
@@ -1748,7 +1752,8 @@
|
|
|
1748
1752
|
"index": true,
|
|
1749
1753
|
"private": false,
|
|
1750
1754
|
"encrypt": false,
|
|
1751
|
-
"isSystem": true
|
|
1755
|
+
"isSystem": true,
|
|
1756
|
+
"enableAuditTracking": true
|
|
1752
1757
|
},
|
|
1753
1758
|
{
|
|
1754
1759
|
"name": "password",
|
|
@@ -1884,7 +1889,8 @@
|
|
|
1884
1889
|
"relationCascade": "cascade",
|
|
1885
1890
|
"relationModelModuleName": "solid-core",
|
|
1886
1891
|
"isSystem": true,
|
|
1887
|
-
"isRelationManyToManyOwner": true
|
|
1892
|
+
"isRelationManyToManyOwner": true,
|
|
1893
|
+
"enableAuditTracking": true
|
|
1888
1894
|
},
|
|
1889
1895
|
{
|
|
1890
1896
|
"name": "forgotPasswordConfirmedAt",
|
|
@@ -12256,5 +12262,33 @@
|
|
|
12256
12262
|
],
|
|
12257
12263
|
"checksums": [],
|
|
12258
12264
|
"listOfValues": [],
|
|
12259
|
-
"scheduledJobs": []
|
|
12265
|
+
"scheduledJobs": [],
|
|
12266
|
+
"securityRules": [
|
|
12267
|
+
{
|
|
12268
|
+
"name": "model:User-role:Internal User",
|
|
12269
|
+
"description": "Show User record for the current user only",
|
|
12270
|
+
"roleUserKey": "Internal User",
|
|
12271
|
+
"modelMetadataUserKey": "user",
|
|
12272
|
+
"securityRuleConfig": {
|
|
12273
|
+
"filters": {
|
|
12274
|
+
"id": {
|
|
12275
|
+
"$eq": "$activeUserId"
|
|
12276
|
+
}
|
|
12277
|
+
}
|
|
12278
|
+
}
|
|
12279
|
+
},
|
|
12280
|
+
{
|
|
12281
|
+
"name": "model:User-role:Admin",
|
|
12282
|
+
"description": "Show All User records",
|
|
12283
|
+
"roleUserKey": "Admin",
|
|
12284
|
+
"modelMetadataUserKey": "user",
|
|
12285
|
+
"securityRuleConfig": {
|
|
12286
|
+
"filters": {
|
|
12287
|
+
"id": {
|
|
12288
|
+
"$ne": "0"
|
|
12289
|
+
}
|
|
12290
|
+
}
|
|
12291
|
+
}
|
|
12292
|
+
}
|
|
12293
|
+
]
|
|
12260
12294
|
}
|