Skip to content

Commit e7f5df1

Browse files
committed
feat(module): adds a forFeatures method to the module
This method will allow for devs to provide an array of classes, functions or strings, mixed with an array of objects that provide the name for the context and the options for that provider. Docs to follow shortly.
1 parent 9ef3d41 commit e7f5df1

File tree

6 files changed

+125
-5
lines changed

6 files changed

+125
-5
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Controller, Get } from '@nestjs/common';
2+
import { OgmaLogger, OgmaService } from '@ogma/nestjs-module';
3+
import { AppService } from './app.service';
4+
5+
@Controller()
6+
export class AppController {
7+
constructor(
8+
private readonly service: AppService,
9+
@OgmaLogger(AppController) private readonly logger: OgmaService,
10+
) {}
11+
12+
@Get()
13+
sayHello() {
14+
this.logger.log('Hello');
15+
return this.service.hello();
16+
}
17+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Module } from '@nestjs/common';
2+
import { OgmaModule } from '@ogma/nestjs-module';
3+
import { AppController } from './app.controller';
4+
import { AppService } from './app.service';
5+
6+
@Module({
7+
imports: [
8+
OgmaModule.forFeatures([AppService, AppController]),
9+
OgmaModule.forRoot({
10+
service: {
11+
application: 'forFeatures',
12+
},
13+
interceptor: false,
14+
}),
15+
],
16+
providers: [AppService],
17+
controllers: [AppController],
18+
})
19+
export class ForFeatsModule {}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { OgmaLogger, OgmaService } from '@ogma/nestjs-module';
3+
4+
@Injectable()
5+
export class AppService {
6+
constructor(@OgmaLogger(AppService) private readonly logger: OgmaService) {}
7+
8+
hello() {
9+
this.logger.log('Hello');
10+
return { hello: 'world' };
11+
}
12+
}

integration/test/for-feats.spec.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { INestApplication } from '@nestjs/common';
2+
import { Test } from '@nestjs/testing';
3+
import { createProviderToken, OgmaService } from '@ogma/nestjs-module';
4+
import { AppController } from '../src/for-feats/app.controller';
5+
import { ForFeatsModule } from '../src/for-feats/app.module';
6+
import { AppService } from '../src/for-feats/app.service';
7+
import { httpPromise } from './utils';
8+
9+
describe('OgmaModule.forFeatures()', () => {
10+
let ogmaAppService: OgmaService;
11+
let ogmaAppController: OgmaService;
12+
let app: INestApplication;
13+
14+
beforeAll(async () => {
15+
const modRef = await Test.createTestingModule({
16+
imports: [ForFeatsModule],
17+
}).compile();
18+
ogmaAppService = modRef.get(createProviderToken(AppService.name));
19+
ogmaAppController = modRef.get(createProviderToken(AppController.name));
20+
app = modRef.createNestApplication();
21+
await app.listen(0);
22+
});
23+
24+
afterAll(async () => {
25+
await app.close();
26+
});
27+
28+
describe('call endpoint', () => {
29+
let appUrl: string;
30+
31+
beforeAll(async () => {
32+
appUrl = await app.getUrl();
33+
});
34+
35+
it('should log with different loggers for service and controller', async () => {
36+
const controllerSpy = jest.spyOn(ogmaAppController, 'log');
37+
const serviceSpy = jest.spyOn(ogmaAppService, 'log');
38+
expect(controllerSpy).toHaveBeenCalledTimes(0);
39+
expect(serviceSpy).toHaveBeenCalledTimes(0);
40+
await httpPromise(appUrl + '/', { method: 'GET' });
41+
expect(controllerSpy).toHaveBeenCalledTimes(1);
42+
expect(controllerSpy).toHaveBeenCalledWith('Hello');
43+
expect(serviceSpy).toHaveBeenCalledTimes(1);
44+
expect(serviceSpy).toHaveBeenCalledWith('Hello');
45+
});
46+
});
47+
});
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export interface OgmaProviederOptions {
1+
export interface OgmaProviderOptions {
22
addRequestId: boolean;
33
}

packages/nestjs-module/src/ogma.module.ts

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
createRequestScopedLoggerProviders,
77
} from './ogma.provider';
88
import { OgmaCoreModule } from './ogma-core.module';
9-
import { OgmaProviederOptions } from './interfaces/ogma-provieder-options.interface';
9+
import { OgmaProviderOptions } from './interfaces/ogma-provieder-options.interface';
1010

1111
@Module({
1212
/* imports: [OgmaCoreModule.Deferred],
@@ -33,7 +33,7 @@ export class OgmaModule {
3333
*/
3434
static forFeature(
3535
context: string | (() => any) | Type<any>,
36-
options: OgmaProviederOptions = { addRequestId: false },
36+
options: OgmaProviderOptions = { addRequestId: false },
3737
): DynamicModule {
3838
const providers: Provider[] = this.createProviders(context, options);
3939
return {
@@ -44,10 +44,35 @@ export class OgmaModule {
4444
};
4545
}
4646

47+
static forFeatures(
48+
contexts: Array<
49+
| {
50+
context: string | (() => any) | Type<any>;
51+
options: OgmaProviderOptions;
52+
}
53+
| string
54+
| (() => any)
55+
| Type<any>
56+
>,
57+
): DynamicModule {
58+
const providers: Provider[] = contexts.map((ctx) => {
59+
if (typeof ctx === 'object') {
60+
return this.createProviders(ctx.context, ctx.options)[0];
61+
}
62+
return this.createProviders(ctx)[0];
63+
});
64+
return {
65+
module: OgmaModule,
66+
imports: [OgmaCoreModule.externallyConfigured(OgmaCoreModule, 0)],
67+
providers,
68+
exports: providers,
69+
};
70+
}
71+
4772
private static createProviders(
4873
context: string | (() => any) | Type<any>,
49-
options: OgmaProviederOptions = { addRequestId: false },
50-
) {
74+
options: OgmaProviderOptions = { addRequestId: false },
75+
): Provider[] {
5176
if (options.addRequestId) {
5277
return createRequestScopedLoggerProviders(context);
5378
}

0 commit comments

Comments
 (0)