Skip to content

Commit 1bcc3f8

Browse files
committed
refactor(json-api-server): restructure modules for better ORM type separation and enhance ACL support
1 parent 2161cdb commit 1bcc3f8

31 files changed

+320
-69
lines changed
Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,64 @@
11
import { Module } from '@nestjs/common';
2-
import { LoggerModule } from 'nestjs-pino';
2+
import { LoggerErrorInterceptor, LoggerModule } from 'nestjs-pino';
3+
import { ClsModule, ClsServiceManager } from 'nestjs-cls';
34

4-
import { TypeOrmDatabaseModule } from '@nestjs-json-api/typeorm-database';
5-
import { MicroOrmDatabaseModule } from '@nestjs-json-api/microorm-database';
6-
import { ResourcesTypeModule } from './resources/type-orm/resources-type.module';
7-
import { ResourcesMicroModule } from './resources/micro-orm/resources-micro.module';
5+
import { APP_INTERCEPTOR } from '@nestjs/core';
86
import { RpcModule } from './rpc/rpc.module';
97

10-
const ormModule =
11-
process.env['ORM_TYPE'] === 'typeorm'
12-
? TypeOrmDatabaseModule
13-
: MicroOrmDatabaseModule;
8+
import {JsonApiTypeOrm, JsonApiMicroOrm} from './json-api'
149

15-
const resourceModule =
10+
const jsonAPiModule =
1611
process.env['ORM_TYPE'] === 'typeorm'
17-
? ResourcesTypeModule
18-
: ResourcesMicroModule;
12+
? JsonApiTypeOrm
13+
: JsonApiMicroOrm;
14+
1915

2016
@Module({
2117
imports: [
22-
ormModule,
23-
resourceModule,
18+
jsonAPiModule,
19+
ClsModule.forRoot({
20+
global: true,
21+
middleware: { mount: true, generateId: true },
22+
}),
2423
RpcModule,
2524
LoggerModule.forRoot({
2625
pinoHttp: {
2726
level: process.env['NODE_ENV'] === 'test' ? 'silent' : 'debug',
27+
transport: {
28+
target: 'pino-pretty',
29+
options: {
30+
translateTime: 'UTC:mm/dd/yyyy, h:MM:ss TT Z',
31+
levelFirst: true,
32+
colorize: true,
33+
messageFormat: `{service} - {if context}[{context}]{end} {msg} {if requestId}({requestId}){end}`,
34+
ignore: `hostname,service,context,message,requestId`,
35+
},
36+
},
37+
genReqId: function (req, res) {
38+
const cls = ClsServiceManager.getClsService();
39+
const existingID = cls.getId()
40+
res.setHeader('X-Request-Id', existingID)
41+
return existingID
42+
},
43+
customProps: () => {
44+
const cls = ClsServiceManager.getClsService();
45+
const contextId = cls.getId();
46+
if (!contextId) {
47+
return {};
48+
}
49+
return {
50+
['requestId']: contextId,
51+
};
52+
}
2853
},
2954
}),
3055
],
3156
controllers: [],
32-
providers: [],
57+
providers: [
58+
{
59+
provide: APP_INTERCEPTOR,
60+
useClass: LoggerErrorInterceptor,
61+
},
62+
],
3363
})
3464
export class AppModule {}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { JsonApiTypeOrm } from './type-orm/json-api-type-orm';
2+
export { JsonApiMicroOrm } from './micro-orm/json-api-micro-orm';
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Global, Module, OnModuleInit } from '@nestjs/common';
2+
import { AclPermissionsModule } from '@klerick/acl-json-api-nestjs';
3+
import { ClsService } from 'nestjs-cls';
4+
import { RulesLoaderService } from './rules-loader.service';
5+
6+
import {
7+
ContextTestAcl,
8+
MicroOrmDatabaseModule,
9+
} from '@nestjs-json-api/microorm-database';
10+
11+
@Module({
12+
imports: [
13+
AclPermissionsModule.forRoot({
14+
rulesLoader: RulesLoaderService,
15+
contextStore: ClsService,
16+
onNoRules: 'allow',
17+
}),
18+
MicroOrmDatabaseModule.forFeature([ContextTestAcl], 'default'),
19+
],
20+
providers: [RulesLoaderService],
21+
})
22+
export class AclModule {}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import {
2+
AclAction,
3+
AclRule,
4+
AclRulesLoader,
5+
AclSubject,
6+
} from '@klerick/acl-json-api-nestjs';
7+
import {
8+
ContextTestAcl,
9+
} from '@nestjs-json-api/microorm-database';
10+
import { AnyEntity, EntityRepository } from '@mikro-orm/core';
11+
import { Injectable } from '@nestjs/common';
12+
import { InjectRepository } from '@mikro-orm/nestjs';
13+
14+
@Injectable()
15+
export class RulesLoaderService implements AclRulesLoader {
16+
@InjectRepository(ContextTestAcl, 'default')
17+
private readonly contextTestAcl!: EntityRepository<ContextTestAcl>;
18+
19+
async getContext(): Promise<{ [x: string]: any }> {
20+
const contexts = await this.contextTestAcl.findAll();
21+
const context = contexts.at(0);
22+
if (!context) return {}
23+
return context.context;
24+
}
25+
async getHelpers(): Promise<{ [x: string]: (...arg: any[]) => any }> {
26+
return {
27+
removeMyselfOnly: (oldArray: number[], userId: number): number[] => {
28+
return oldArray.filter(id => id !== userId);
29+
}
30+
};
31+
}
32+
async loadRules<E extends AnyEntity>(
33+
entity: AclSubject<E>,
34+
action: AclAction
35+
): Promise<AclRule<E>[]> {
36+
const contexts = await this.contextTestAcl.findAll();
37+
const context = contexts.at(0);
38+
if (!context) return []
39+
40+
const rules = context.aclRules.rules as unknown as AclRule<E>[]
41+
42+
return rules.filter(r => r.action === action && (entity as any)['name'] === r.subject)
43+
44+
}
45+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Module } from '@nestjs/common';
2+
import { MicroOrmDatabaseModule } from '@nestjs-json-api/microorm-database';
3+
4+
import { AclModule } from './acl/acl.module';
5+
import { ResourcesMicroModule } from './micro-orm/resources-micro.module';
6+
7+
@Module({
8+
imports: [MicroOrmDatabaseModule.forRoot(), AclModule, ResourcesMicroModule],
9+
})
10+
export class JsonApiMicroOrm {}

apps/json-api-server/src/app/resources/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts renamed to apps/json-api-server/src/app/json-api/micro-orm/micro-orm/controllers/extend-book-list/extend-book-list.controller.ts

File renamed without changes.

apps/json-api-server/src/app/resources/micro-orm/controllers/extend-user/extend-user.controller.ts renamed to apps/json-api-server/src/app/json-api/micro-orm/micro-orm/controllers/extend-user/extend-user.controller.ts

File renamed without changes.

apps/json-api-server/src/app/resources/micro-orm/resources-micro.module.ts renamed to apps/json-api-server/src/app/json-api/micro-orm/micro-orm/resources-micro.module.ts

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Module } from '@nestjs/common';
1+
import { Module, Type } from '@nestjs/common';
22
import { JsonApiModule } from '@klerick/json-api-nestjs';
33
import { MicroOrmJsonApiModule } from '@klerick/json-api-nestjs-microorm';
44
import {
@@ -9,6 +9,37 @@ import {
99
BookList,
1010
} from '@nestjs-json-api/microorm-database';
1111

12+
import {
13+
UsersAcl,
14+
ArticleAcl,
15+
CategoryAcl,
16+
TagAcl,
17+
PostAcl,
18+
CommentAcl,
19+
DocumentAcl,
20+
UserProfileAcl,
21+
ContextTestAcl,
22+
} from '@nestjs-json-api/microorm-database';
23+
24+
const GeneraleResource = [
25+
Users,
26+
Addresses,
27+
Comments,
28+
Roles,
29+
BookList,
30+
ContextTestAcl,
31+
];
32+
const AclResource = [
33+
UsersAcl,
34+
ArticleAcl,
35+
CategoryAcl,
36+
TagAcl,
37+
PostAcl,
38+
CommentAcl,
39+
DocumentAcl,
40+
UserProfileAcl,
41+
];
42+
1243
import { ExtendBookListController } from './controllers/extend-book-list/extend-book-list.controller';
1344
import { ExtendUserController } from './controllers/extend-user/extend-user.controller';
1445
import { ExampleService } from './service/example.service';
@@ -18,17 +49,24 @@ import { wrapperJsonApiController } from '@klerick/acl-json-api-nestjs';
1849
@Module({
1950
imports: [
2051
JsonApiModule.forRoot(MicroOrmJsonApiModule, {
21-
entities: [Users, Addresses, Comments, Roles, BookList],
52+
entities: [...GeneraleResource, ...AclResource] as any,
2253
controllers: [ExtendBookListController, ExtendUserController],
2354
providers: [ExampleService],
2455
options: {
2556
debug: true,
2657
requiredSelectField: false,
2758
operationUrl: 'operation',
2859
},
29-
// hooks: {
30-
// afterCreateController: wrapperJsonApiController,
31-
// },
60+
hooks: {
61+
afterCreateController: (controllerClass: Type<any>) => {
62+
if (
63+
!controllerClass.name.startsWith('ContextTestAcl') &&
64+
controllerClass.name.indexOf('Acl') > -1
65+
) {
66+
wrapperJsonApiController(controllerClass);
67+
}
68+
},
69+
},
3270
}),
3371
],
3472
})

apps/json-api-server/src/app/resources/micro-orm/service/atomic.interceptor.ts renamed to apps/json-api-server/src/app/json-api/micro-orm/micro-orm/service/atomic.interceptor.ts

File renamed without changes.

apps/json-api-server/src/app/resources/micro-orm/service/controller.interceptor.ts renamed to apps/json-api-server/src/app/json-api/micro-orm/micro-orm/service/controller.interceptor.ts

File renamed without changes.

0 commit comments

Comments
 (0)