diff --git a/src/app.module.ts b/src/app.module.ts index 6e7ad97..d91f5f7 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; +import { ConfigModule, ConfigService } from '@nestjs/config'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import configuration from './configuration/configuration'; @@ -15,7 +15,26 @@ import { ExternalApiModule } from './external-api/external-api.module'; ConfigModule.forRoot({ load: [configuration], }), - LoggerModule.forRoot(), + LoggerModule.forRootAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: (configService: ConfigService) => ({ + pinoHttp: { + customSuccessObject: (req, res, loggableObject) => { + return { + ...loggableObject, + buildNumber: configService.get('buildInfo.buildNumber'), + }; + }, + customErrorObject: (req, res, loggableObject) => { + return { + ...loggableObject, + buildNumber: configService.get('buildInfo.buildNumber'), + }; + }, + }, + }), + }), CacheModule.register({ isGlobal: true }), CommonModule, ControllersModule, diff --git a/src/common/constants/upstream-constants.ts b/src/common/constants/upstream-constants.ts new file mode 100644 index 0000000..fa6b755 --- /dev/null +++ b/src/common/constants/upstream-constants.ts @@ -0,0 +1,9 @@ +const baseUrlEnvVarName = 'UPSTREAM_BASE_URL'; +const supportNetworkEndpointEnvVarName = 'SUPPORT_NETWORK_ENDPOINT'; +const inPersonVisitsEndpointEnvVarName = 'IN_PERSON_VISITS_ENDPOINT'; + +export { + baseUrlEnvVarName, + supportNetworkEndpointEnvVarName, + inPersonVisitsEndpointEnvVarName, +}; diff --git a/src/common/guards/auth/auth.service.ts b/src/common/guards/auth/auth.service.ts index 602f6c2..bd3109f 100644 --- a/src/common/guards/auth/auth.service.ts +++ b/src/common/guards/auth/auth.service.ts @@ -15,11 +15,13 @@ import { import { firstValueFrom } from 'rxjs'; import { AxiosError } from 'axios'; import { TokenRefresherService } from '../../../external-api/token-refresher/token-refresher.service'; +import { baseUrlEnvVarName } from '../../../common/constants/upstream-constants'; @Injectable() export class AuthService { cacheTime: number; baseUrl: string; + buildNumber: string; private readonly logger = new Logger(AuthService.name); constructor( @@ -30,7 +32,8 @@ export class AuthService { private readonly tokenRefresherService: TokenRefresherService, ) { this.cacheTime = this.configService.get('recordCache.cacheTtlMs'); - this.baseUrl = this.configService.get('UPSTREAM_BASE_URL'); + this.baseUrl = this.configService.get(baseUrlEnvVarName); + this.buildNumber = this.configService.get('buildInfo.buildNumber'); } async getRecordAndValidate(req: Request): Promise { @@ -45,8 +48,6 @@ export class AuthService { const key = `${id}|${recordType}`; let upstreamResult: string | null | undefined = await this.cacheManager.get(key); - // TODO: Remove this console log once guard is verified working - this.logger.log(`Cache result: ${upstreamResult}`); if (upstreamResult === undefined) { upstreamResult = await this.getAssignedIdirUpstream(id, recordType); @@ -114,9 +115,14 @@ export class AuthService { return idir; } catch (error) { if (error instanceof AxiosError) { - this.logger.error(error.message, error.stack, error.cause); + this.logger.error({ + msg: error.message, + stack: error.stack, + cause: error.cause, + buildNumber: this.buildNumber, + }); } else { - this.logger.error(error); + this.logger.error({ error, buildNumber: this.buildNumber }); } } return null; diff --git a/src/configuration/configuration.ts b/src/configuration/configuration.ts index 9583d3e..36311b1 100644 --- a/src/configuration/configuration.ts +++ b/src/configuration/configuration.ts @@ -36,4 +36,10 @@ export default () => ({ inPersonVisits: undefined, }, skipAuthGuard: process.env.SKIP_AUTH_GUARD === 'true', + buildInfo: { + buildNumber: + process.env.VPI_APP_LABEL === undefined + ? 'localBuild' + : process.env.VPI_APP_LABEL, + }, }); diff --git a/src/external-api/request-preparer/request-preparer.service.ts b/src/external-api/request-preparer/request-preparer.service.ts index ba59b58..8200f41 100644 --- a/src/external-api/request-preparer/request-preparer.service.ts +++ b/src/external-api/request-preparer/request-preparer.service.ts @@ -11,15 +11,20 @@ import { TokenRefresherService } from '../token-refresher/token-refresher.servic import { HttpService } from '@nestjs/axios'; import { firstValueFrom } from 'rxjs'; import { AxiosError } from 'axios'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class RequestPreparerService { + buildNumber: string; private readonly logger = new Logger(RequestPreparerService.name); constructor( private readonly utilitiesService: UtilitiesService, private readonly tokenRefresherService: TokenRefresherService, private readonly httpService: HttpService, - ) {} + private readonly configService: ConfigService, + ) { + this.buildNumber = this.configService.get('buildInfo.buildNumber'); + } prepareHeadersAndParams( baseSearchSpec: string, @@ -71,12 +76,17 @@ export class RequestPreparerService { ); } catch (error) { if (error instanceof AxiosError) { - this.logger.error(error.message, error.stack, error.cause); + this.logger.error({ + msg: error.message, + stack: error.stack, + cause: error.cause, + buildNumber: this.buildNumber, + }); if (error.status === 404) { throw new HttpException({}, HttpStatus.NO_CONTENT, { cause: error }); } } else { - this.logger.error(error); + this.logger.error({ error, buildNumber: this.buildNumber }); } throw new HttpException( { diff --git a/src/external-api/token-refresher/token-refresher.service.ts b/src/external-api/token-refresher/token-refresher.service.ts index 925007b..332a79c 100644 --- a/src/external-api/token-refresher/token-refresher.service.ts +++ b/src/external-api/token-refresher/token-refresher.service.ts @@ -16,6 +16,7 @@ export class TokenRefresherService { accessTokenUrl: string; clientId: string; clientSecret: string; + buildNumber: string; private readonly logger = new Logger(TokenRefresherService.name); constructor( @@ -26,6 +27,7 @@ export class TokenRefresherService { this.accessTokenUrl = this.configService.get('oauth.accessTokenUrl'); this.clientId = this.configService.get('oauth.clientId'); this.clientSecret = this.configService.get('oauth.clientSecret'); + this.buildNumber = this.configService.get('buildInfo.buildNumber'); } async refreshUpstreamBearerToken(): Promise { @@ -78,7 +80,12 @@ export class TokenRefresherService { return [bearer_token, expiryMs]; } catch (error) { if (error instanceof AxiosError) { - this.logger.error(error.message, error.stack, error.cause); + this.logger.error({ + msg: error.message, + stack: error.stack, + cause: error.cause, + buildNumber: this.buildNumber, + }); } return [undefined, undefined]; } diff --git a/src/helpers/in-person-visits/in-person-visits.service.ts b/src/helpers/in-person-visits/in-person-visits.service.ts index 46a47b8..1266124 100644 --- a/src/helpers/in-person-visits/in-person-visits.service.ts +++ b/src/helpers/in-person-visits/in-person-visits.service.ts @@ -8,6 +8,10 @@ import { NestedInPersonVisitsEntity, InPersonVisitsEntity, } from '../../entities/in-person-visits.entity'; +import { + baseUrlEnvVarName, + inPersonVisitsEndpointEnvVarName, +} from '../../common/constants/upstream-constants'; @Injectable() export class InPersonVisitsService { @@ -19,8 +23,8 @@ export class InPersonVisitsService { private readonly requestPreparerService: RequestPreparerService, ) { this.url = ( - this.configService.get('UPSTREAM_BASE_URL') + - this.configService.get('IN_PERSON_VISITS_ENDPOINT') + this.configService.get(baseUrlEnvVarName) + + this.configService.get(inPersonVisitsEndpointEnvVarName) ).replace(/\s/g, '%20'); this.workspace = this.configService.get('workspaces.inPersonVisits'); this.sinceFieldName = this.configService.get( diff --git a/src/helpers/support-network/support-network.service.ts b/src/helpers/support-network/support-network.service.ts index 3723300..71eb45c 100644 --- a/src/helpers/support-network/support-network.service.ts +++ b/src/helpers/support-network/support-network.service.ts @@ -11,6 +11,10 @@ import { import { IdPathParams } from '../../dto/id-path-params.dto'; import { SinceQueryParams } from '../../dto/since-query-params.dto'; import { RequestPreparerService } from '../../external-api/request-preparer/request-preparer.service'; +import { + baseUrlEnvVarName, + supportNetworkEndpointEnvVarName, +} from '../../common/constants/upstream-constants'; @Injectable() export class SupportNetworkService { @@ -22,8 +26,8 @@ export class SupportNetworkService { private readonly requestPreparerService: RequestPreparerService, ) { this.url = ( - this.configService.get('UPSTREAM_BASE_URL') + - this.configService.get('SUPPORT_NETWORK_ENDPOINT') + this.configService.get(baseUrlEnvVarName) + + this.configService.get(supportNetworkEndpointEnvVarName) ).replace(/\s/g, '%20'); this.workspace = this.configService.get('workspaces.supportNetwork'); this.sinceFieldName = this.configService.get(