From f1583cf7831fdc58b717decbf8e8573ef70aa79c Mon Sep 17 00:00:00 2001 From: "saito.k" Date: Tue, 12 Dec 2023 04:11:36 +0000 Subject: [PATCH] =?UTF-8?q?Merged=20PR=20611:=20=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E3=82=92=E7=89=B9=E5=AE=9A=E3=81=A7=E3=81=8D=E3=82=8B=E6=96=87?= =?UTF-8?q?=E5=AD=97=E5=88=97=E3=82=92=E8=BF=BD=E8=B7=A1=E7=94=A8=E3=81=AE?= =?UTF-8?q?ID=E3=81=AB=E8=BF=BD=E5=8A=A0=E3=81=99=E3=82=8B=EF=BC=88IP?= =?UTF-8?q?=E3=82=A2=E3=83=89=E3=83=AC=E3=82=B9=E3=82=82=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=81=AB=E5=87=BA=E5=8A=9B=E3=81=99=E3=82=8B=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task3265: IPアドレスを追跡用のIDに追加する](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3265) - MiddlewareでUUIDを発行しリクエストのヘッダに追加する - 各コントローラーではヘッダからUUIDとIPアドレスを取得する - 取得したUUIDとADB2Cの外部IDでトラッキングIDを作成する - 作成したトラッキングIDとIPアドレスの繋がりをログに出力する。 ## レビューポイント - ADB2Cの外部IDがない場合にUnauthorized Userという文字列を入れているがほかの表現のほうが良いか - 外部IDもオプショナルにして入れなくてもよくする? - ## UIの変更 - Before/Afterのスクショなど - スクショ置き場 ## 動作確認状況 - ローカルで確認 ## 補足 - 相談、参考資料などがあれば --- dictation_server/src/common/error/code.ts | 2 + dictation_server/src/common/error/message.ts | 2 + dictation_server/src/common/log/context.ts | 26 +- dictation_server/src/common/log/index.ts | 4 +- dictation_server/src/common/log/types.ts | 15 +- .../src/common/loggerMiddleware.ts | 13 +- .../features/accounts/accounts.controller.ts | 530 +++++++++++++++++- .../accounts/accounts.service.spec.ts | 498 ++++++++++++---- .../src/features/accounts/accounts.service.ts | 6 +- .../src/features/auth/auth.controller.ts | 94 +++- .../src/features/auth/auth.service.spec.ts | 78 ++- .../src/features/files/files.controller.ts | 118 +++- .../src/features/files/files.service.spec.ts | 128 +++-- .../features/licenses/licenses.controller.ts | 102 +++- .../licenses/licenses.service.spec.ts | 96 +++- .../notification/notification.controller.ts | 23 +- .../notification/notification.service.spec.ts | 6 +- .../src/features/tasks/tasks.controller.ts | 166 +++++- .../src/features/tasks/tasks.service.spec.ts | 212 ++++--- .../templates/templates.controller.ts | 24 +- .../templates/templates.service.spec.ts | 18 +- .../src/features/terms/terms.controller.ts | 36 +- .../src/features/terms/terms.service.spec.ts | 10 +- .../src/features/users/users.controller.ts | 249 +++++++- .../src/features/users/users.service.spec.ts | 115 ++-- .../src/features/users/users.service.ts | 7 +- .../workflows/workflows.controller.ts | 76 ++- .../workflows/workflows.service.spec.ts | 222 ++++++-- 28 files changed, 2372 insertions(+), 504 deletions(-) diff --git a/dictation_server/src/common/error/code.ts b/dictation_server/src/common/error/code.ts index f8f7225..8f9dc2f 100644 --- a/dictation_server/src/common/error/code.ts +++ b/dictation_server/src/common/error/code.ts @@ -23,6 +23,8 @@ export const ErrorCodes = [ 'E000107', // トークン不足エラー 'E000108', // トークン権限エラー 'E000301', // ADB2Cへのリクエスト上限超過エラー + 'E000401', // IPアドレス未設定エラー + 'E000501', // リクエストID未設定エラー 'E010001', // パラメータ形式不正エラー 'E010201', // 未認証ユーザエラー 'E010202', // 認証済ユーザエラー diff --git a/dictation_server/src/common/error/message.ts b/dictation_server/src/common/error/message.ts index 4786a64..0a27cc5 100644 --- a/dictation_server/src/common/error/message.ts +++ b/dictation_server/src/common/error/message.ts @@ -12,6 +12,8 @@ export const errors: Errors = { E000107: 'Token is not exist Error.', E000108: 'Token authority failed Error.', E000301: 'ADB2C request limit exceeded Error', + E000401: 'IP address not found Error.', + E000501: 'Request ID not found Error.', E010001: 'Param invalid format Error.', E010201: 'Email not verified user Error.', E010202: 'Email already verified user Error.', diff --git a/dictation_server/src/common/log/context.ts b/dictation_server/src/common/log/context.ts index 2c8bbe3..1b887c6 100644 --- a/dictation_server/src/common/log/context.ts +++ b/dictation_server/src/common/log/context.ts @@ -1,8 +1,32 @@ +import { Request } from 'express'; import { Context } from './types'; export const makeContext = ( externalId: string, + requestId: string, delegationId?: string, ): Context => { - return new Context(externalId, delegationId); + return new Context(externalId, requestId, delegationId); +}; + +// リクエストヘッダーからrequestIdを取得する +export const retrieveRequestId = (req: Request): string | undefined => { + return req.header('x-request-id'); +}; + +/** + * リクエストのIPアドレスを取得します + * @param {Request} + * @return {string | undefined} + */ +export const retrieveIp = (req: Request): string | undefined => { + // ローカル環境では直近の送信元IPを取得する + if (process.env.STAGE === 'local') { + return req.ip; + } + const ip = req.header('x-forwarded-for'); + if (typeof ip === 'string') { + return ip; + } + return undefined; }; diff --git a/dictation_server/src/common/log/index.ts b/dictation_server/src/common/log/index.ts index d42adad..7b0bf35 100644 --- a/dictation_server/src/common/log/index.ts +++ b/dictation_server/src/common/log/index.ts @@ -1,4 +1,4 @@ import { Context } from './types'; -import { makeContext } from './context'; +import { makeContext, retrieveRequestId, retrieveIp } from './context'; -export { Context, makeContext }; +export { Context, makeContext, retrieveRequestId, retrieveIp }; diff --git a/dictation_server/src/common/log/types.ts b/dictation_server/src/common/log/types.ts index 7ed3855..6f56bc1 100644 --- a/dictation_server/src/common/log/types.ts +++ b/dictation_server/src/common/log/types.ts @@ -3,23 +3,32 @@ export class Context { * APIの操作ユーザーを追跡するためのID */ trackingId: string; + /** + * APIの操作ユーザーのIPアドレス + */ + ip: string; + /** + * ユーザーの操作を一意に識別するためのID + */ + requestId: string; /** * APIの代行操作ユーザーを追跡するためのID */ delegationId?: string | undefined; - constructor(externalId: string, delegationId?: string) { + constructor(externalId: string, requestId: string, delegationId?: string) { this.trackingId = externalId; this.delegationId = delegationId; + this.requestId = requestId; } /** * ログにユーザーを特定する情報を出力する */ getTrackingId(): string { if (this.delegationId) { - return `${this.trackingId} by ${this.delegationId}`; + return `${this.requestId}_${this.trackingId} by ${this.delegationId}`; } else { - return this.trackingId; + return `${this.requestId}_${this.trackingId}`; } } } diff --git a/dictation_server/src/common/loggerMiddleware.ts b/dictation_server/src/common/loggerMiddleware.ts index a892c02..18b995c 100644 --- a/dictation_server/src/common/loggerMiddleware.ts +++ b/dictation_server/src/common/loggerMiddleware.ts @@ -1,11 +1,16 @@ import { Injectable, Logger, NestMiddleware } from '@nestjs/common'; import { Request, Response } from 'express'; +import { v4 as uuidv4 } from 'uuid'; @Injectable() export class LoggerMiddleware implements NestMiddleware { private readonly logger = new Logger(LoggerMiddleware.name); use(req: Request, res: Response, next: () => void): void { + // ここで一意のリクエストIDを生成して、リクエストヘッダーに設定する + const requestId = uuidv4(); + req.headers['x-request-id'] = requestId; + this.logger.log(this.createReqMsg(req)); res.on('close', () => { @@ -15,13 +20,17 @@ export class LoggerMiddleware implements NestMiddleware { } private createReqMsg(req: Request): string { - const message = `Request [url=${req.url}, method=${req.method}]`; + const message = `[${req.header('x-request-id')}] Request [url=${ + req.url + }, method=${req.method}]`; return message; } private createResMsg(res: Response): string { - const message = `Response [statusCode=${res.statusCode}, message=${res.statusMessage}]`; + const message = `[${res.req.header('x-request-id')}] Response [statusCode=${ + res.statusCode + }, message=${res.statusMessage}]`; return message; } diff --git a/dictation_server/src/features/accounts/accounts.controller.ts b/dictation_server/src/features/accounts/accounts.controller.ts index 619aa2b..5750071 100644 --- a/dictation_server/src/features/accounts/accounts.controller.ts +++ b/dictation_server/src/features/accounts/accounts.controller.ts @@ -9,6 +9,7 @@ import { Param, Query, HttpException, + Logger, } from '@nestjs/common'; import { ApiOperation, @@ -77,14 +78,14 @@ import { RoleGuard } from '../../common/guards/role/roleguards'; import { retrieveAuthorizationToken } from '../../common/http/helper'; import { AccessToken } from '../../common/token'; import jwt from 'jsonwebtoken'; -import { makeContext } from '../../common/log'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { AuthService } from '../auth/auth.service'; import { makeErrorResponse } from '../../common/error/makeErrorResponse'; -import { v4 as uuidv4 } from 'uuid'; @ApiTags('accounts') @Controller('accounts') export class AccountsController { + private readonly logger = new Logger(AccountsController.name); constructor( private readonly accountService: AccountsService, //private readonly cryptoService: CryptoService, private readonly authService: AuthService, @@ -109,6 +110,7 @@ export class AccountsController { @ApiOperation({ operationId: 'createAccount' }) async createAccount( @Body() body: CreateAccountRequest, + @Req() req: Request, ): Promise { const { companyName, @@ -123,7 +125,24 @@ export class AccountsController { } = body; const role = USER_ROLES.NONE; - const context = makeContext(uuidv4()); + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.createAccount( context, @@ -178,6 +197,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -186,7 +221,9 @@ export class AccountsController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const response = await this.accountService.getLicenseSummary( context, body.accountId, @@ -232,6 +269,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -240,7 +293,9 @@ export class AccountsController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); //アカウントID取得処理 const accountInfo = await this.accountService.getAccountInfo( context, @@ -283,6 +338,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -291,7 +362,9 @@ export class AccountsController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const authors = await this.accountService.getAuthors(context, userId); @@ -330,6 +403,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -338,7 +427,9 @@ export class AccountsController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const typists = await this.accountService.getTypists(context, userId); @@ -377,6 +468,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -385,7 +492,9 @@ export class AccountsController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const typistGroups = await this.accountService.getTypistGroups( context, @@ -441,6 +550,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -450,7 +575,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const typistGroup = await this.accountService.getTypistGroup( context, @@ -506,6 +632,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -514,7 +656,9 @@ export class AccountsController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.createTypistGroup( context, userId, @@ -572,6 +716,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -581,7 +741,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.updateTypistGroup( context, @@ -637,6 +798,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -646,7 +823,8 @@ export class AccountsController { } const { userId, tier } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.createPartnerAccount( context, @@ -699,6 +877,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -708,7 +902,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const getPartnerLicensesResponse = await this.accountService.getPartnerLicenses( @@ -759,6 +954,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -768,7 +979,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const getOrderHistoriesResponse = await this.accountService.getOrderHistories( @@ -825,6 +1037,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -834,7 +1062,8 @@ export class AccountsController { } const { userId, tier } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.issueLicense( context, orderedAccountId, @@ -857,8 +1086,25 @@ export class AccountsController { type: ErrorResponse, }) @ApiOperation({ operationId: 'getDealers' }) - async getDealers(): Promise { - const context = makeContext(uuidv4()); + async getDealers(@Req() req: Request): Promise { + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); + return await this.accountService.getDealers(context); } @@ -907,6 +1153,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -916,7 +1178,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.cancelIssue( context, @@ -957,6 +1220,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -966,7 +1245,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const worktypes = await this.accountService.getWorktypes(context, userId); return worktypes; @@ -1012,6 +1292,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1021,7 +1317,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.createWorktype( context, userId, @@ -1074,6 +1371,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1083,7 +1396,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.updateWorktype( context, @@ -1136,6 +1450,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1145,7 +1475,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.deleteWorktype(context, userId, id); return {}; @@ -1191,6 +1522,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1200,7 +1547,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const optionItems = await this.accountService.getOptionItems( context, @@ -1253,6 +1601,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1262,7 +1626,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.updateOptionItems( context, @@ -1314,6 +1679,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1323,7 +1704,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.updateActiveWorktype(context, userId, id); return {}; @@ -1372,6 +1754,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1381,7 +1779,8 @@ export class AccountsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const response = await this.accountService.getPartners( context, userId, @@ -1439,6 +1838,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1447,7 +1862,9 @@ export class AccountsController { ); } const { userId, tier } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.updateAccountInfo( context, @@ -1499,6 +1916,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1507,7 +1940,9 @@ export class AccountsController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.accountService.deleteAccountAndData(context, userId, accountId); return {}; @@ -1532,8 +1967,25 @@ export class AccountsController { @ApiOperation({ operationId: 'getAccountInfoMinimalAccess' }) async getAccountInfoMinimalAccess( @Body() body: GetAccountInfoMinimalAccessRequest, + @Req() req: Request, ): Promise { - const context = makeContext(uuidv4()); + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); // IDトークンの検証 const idToken = await this.authService.getVerifiedIdToken( @@ -1591,6 +2043,22 @@ export class AccountsController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -1599,7 +2067,9 @@ export class AccountsController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const companyName = await this.accountService.getCompanyName( context, body.accountId, diff --git a/dictation_server/src/features/accounts/accounts.service.spec.ts b/dictation_server/src/features/accounts/accounts.service.spec.ts index 27c3715..92479ec 100644 --- a/dictation_server/src/features/accounts/accounts.service.spec.ts +++ b/dictation_server/src/features/accounts/accounts.service.spec.ts @@ -136,7 +136,7 @@ describe('createAccount', () => { }); const { accountId, externalUserId, userId } = await service.createAccount( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), companyName, country, dealerAccountId, @@ -213,7 +213,7 @@ describe('createAccount', () => { try { await service.createAccount( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), companyName, country, dealerAccountId, @@ -285,7 +285,7 @@ describe('createAccount', () => { try { await service.createAccount( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), companyName, country, dealerAccountId, @@ -346,7 +346,7 @@ describe('createAccount', () => { try { await service.createAccount( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), companyName, country, dealerAccountId, @@ -377,7 +377,7 @@ describe('createAccount', () => { // ADB2Cユーザー削除メソッドが呼ばれているか確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), ); }); it('アカウントを作成がDBへの通信失敗によって500エラーが発生した場合、リカバリ処理が実行されるが、ADB2Cユーザー削除で失敗した場合、500エラーが返却される', async () => { @@ -414,7 +414,7 @@ describe('createAccount', () => { try { await service.createAccount( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), companyName, country, dealerAccountId, @@ -445,7 +445,7 @@ describe('createAccount', () => { // ADB2Cユーザー削除メソッドが呼ばれているか確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), ); }); @@ -485,7 +485,7 @@ describe('createAccount', () => { try { await service.createAccount( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), companyName, country, dealerAccountId, @@ -516,7 +516,7 @@ describe('createAccount', () => { // ADB2Cユーザー削除メソッドが呼ばれているか確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), ); }); @@ -558,7 +558,7 @@ describe('createAccount', () => { try { await service.createAccount( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), companyName, country, dealerAccountId, @@ -589,7 +589,7 @@ describe('createAccount', () => { // ADB2Cユーザー削除メソッドが呼ばれているか確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), ); }); @@ -650,7 +650,7 @@ describe('createAccount', () => { try { await service.createAccount( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), companyName, country, dealerAccountId, @@ -681,11 +681,11 @@ describe('createAccount', () => { // ADB2Cユーザー削除メソッドが呼ばれているか確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), ); // Blobストレージのコンテナ削除メソッドが呼ばれているか確認 expect(blobstorageService.deleteContainer).toBeCalledWith( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), 1, //新規作成したアカウントのID country, ); @@ -745,7 +745,7 @@ describe('createAccount', () => { try { await service.createAccount( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), companyName, country, dealerAccountId, @@ -776,11 +776,11 @@ describe('createAccount', () => { // ADB2Cユーザー削除メソッドが呼ばれているか確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), ); // Blobストレージのコンテナ削除メソッドが呼ばれているか確認 expect(blobstorageService.deleteContainer).toBeCalledWith( - makeContext('uuid'), + makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'), 1, //新規作成したアカウントのID country, ); @@ -820,7 +820,7 @@ describe('createPartnerAccount', () => { { external_id: adminExternalId }, ); - const context = makeContext('uuid'); + const context = makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'); const companyName = 'test_company_name'; const country = 'US'; const email = 'partner@example.com'; @@ -897,7 +897,7 @@ describe('createPartnerAccount', () => { { external_id: adminExternalId }, ); - const context = makeContext('uuid'); + const context = makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'); const companyName = 'test_company_name'; const country = 'US'; const email = 'partner@example.com'; @@ -975,7 +975,7 @@ describe('createPartnerAccount', () => { { external_id: adminExternalId }, ); - const context = makeContext('uuid'); + const context = makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'); const companyName = 'test_company_name'; const country = 'US'; const email = 'partner@example.com'; @@ -1064,7 +1064,7 @@ describe('createPartnerAccount', () => { { external_id: adminExternalId }, ); - const context = makeContext('uuid'); + const context = makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'); const companyName = 'test_company_name'; const country = 'US'; const email = 'partner@example.com'; @@ -1154,7 +1154,11 @@ describe('createPartnerAccount', () => { { external_id: parentExternalId }, ); - const context = makeContext(parentExternalId); + const context = makeContext( + parentExternalId, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const partnerExternalId = 'partner_external_id'; const companyName = 'partner_company_name'; const country = 'US'; @@ -1236,7 +1240,11 @@ describe('createPartnerAccount', () => { { external_id: parentExternalId }, ); - const context = makeContext(parentExternalId); + const context = makeContext( + parentExternalId, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const partnerExternalId = 'partner_external_id'; const companyName = 'partner_company_name'; const country = 'US'; @@ -1328,7 +1336,11 @@ describe('createPartnerAccount', () => { { external_id: parentExternalId }, ); - const context = makeContext(parentExternalId); + const context = makeContext( + parentExternalId, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const partnerExternalId = 'partner_external_id'; const companyName = 'partner_company_name'; const country = 'US'; @@ -1420,7 +1432,11 @@ describe('createPartnerAccount', () => { { external_id: parentExternalId }, ); - const context = makeContext(parentExternalId); + const context = makeContext( + parentExternalId, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const partnerExternalId = 'partner_external_id'; const companyName = 'partner_company_name'; const country = 'US'; @@ -1515,7 +1531,7 @@ describe('createPartnerAccount', () => { { external_id: adminExternalId }, ); - const context = makeContext('uuid'); + const context = makeContext('uuid', 'xxx.xxx.xxx.xxx', 'requestId'); const companyName = 'test_company_name'; const country = 'US'; const email = 'partner@example.com'; @@ -1608,7 +1624,7 @@ describe('AccountsService', () => { licensesRepositoryMockValue, worktypesRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect(await service.getLicenseSummary(context, accountId)).toEqual( expectedAccountLisenceCounts, ); @@ -1641,7 +1657,7 @@ describe('AccountsService', () => { licensesRepositoryMockValue, worktypesRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getLicenseSummary(context, accountId)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -1676,7 +1692,7 @@ describe('AccountsService', () => { licensesRepositoryMockValue, worktypesRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect(await service.getTypists(context, externalId)).toEqual([ { id: 1, name: 'Typist1' }, { id: 2, name: 'Typist2' }, @@ -1710,7 +1726,7 @@ describe('AccountsService', () => { licensesRepositoryMockValue, worktypesRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getTypists(context, externalId)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -1745,7 +1761,7 @@ describe('AccountsService', () => { licensesRepositoryMockValue, worktypesRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getTypists(context, externalId)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -1781,7 +1797,7 @@ describe('AccountsService', () => { worktypesRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect(await service.getTypistGroups(context, externalId)).toEqual([ { id: 1, name: 'GroupA' }, { id: 2, name: 'GroupB' }, @@ -1815,7 +1831,7 @@ describe('AccountsService', () => { worktypesRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getTypistGroups(context, externalId)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -1851,7 +1867,7 @@ describe('AccountsService', () => { worktypesRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getTypistGroups(context, externalId)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -2034,7 +2050,7 @@ describe('getPartnerAccount', () => { const offset = 0; const limit = 20; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); const response = await service.getPartnerLicenses( context, limit, @@ -2181,7 +2197,7 @@ describe('getPartnerAccount', () => { const offset = 0; const limit = 20; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); const response = await service.getPartnerLicenses( context, limit, @@ -2280,7 +2296,7 @@ describe('getOrderHistories', () => { const offset = 1; const limit = 2; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); const response = await service.getOrderHistories( context, limit, @@ -2325,7 +2341,7 @@ describe('getOrderHistories', () => { licensesRepositoryMockValue, worktypesRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.getOrderHistories(context, limit, offset, accountId), ).rejects.toEqual( @@ -2431,7 +2447,11 @@ describe('issueLicense', () => { new Date(now.getTime() + 60 * 60 * 1000), ); - const context = makeContext('userId-parent'); + const context = makeContext( + 'userId-parent', + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 注文を発行済みにする await service.issueLicense( @@ -2525,7 +2545,11 @@ describe('issueLicense', () => { new Date(now.getTime() + 60 * 60 * 1000), ); - const context = makeContext('userId-parent'); + const context = makeContext( + 'userId-parent', + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 注文を発行済みにする await service.issueLicense( @@ -2624,7 +2648,11 @@ describe('issueLicense', () => { new Date(now.getTime() + 60 * 60 * 1000), ); - const context = makeContext('userId-parent'); + const context = makeContext( + 'userId-parent', + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 注文を発行済みにする await expect( @@ -2688,7 +2716,7 @@ describe('getDealers', () => { }) ).account; const service = module.get(AccountsService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect(await service.getDealers(context)).toEqual({ dealers: [ @@ -2717,7 +2745,7 @@ describe('getDealers', () => { const service = module.get(AccountsService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect(await service.getDealers(context)).toEqual({ dealers: [], }); @@ -2781,7 +2809,11 @@ describe('createTypistGroup', () => { const service = module.get(AccountsService); const typistGroupName = 'typist-group-name'; const typistUserIds = userIds; - const context = makeContext(adminExternalId); + const context = makeContext( + adminExternalId, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createTypistGroup( context, adminExternalId, @@ -2845,7 +2877,11 @@ describe('createTypistGroup', () => { const service = module.get(AccountsService); const typistGroupName = 'typist-group-name'; const typistUserIds = userIds; - const context = makeContext(adminExternalId); + const context = makeContext( + adminExternalId, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await expect( service.createTypistGroup( context, @@ -2896,7 +2932,11 @@ describe('createTypistGroup', () => { const service = module.get(AccountsService); const typistGroupName = 'typist-group-name'; const typistUserIds = [...userIds, 9999]; //存在しないユーザーIDを追加 - const context = makeContext(adminExternalId); + const context = makeContext( + adminExternalId, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await expect( service.createTypistGroup( context, @@ -2948,7 +2988,11 @@ describe('createTypistGroup', () => { const service = module.get(AccountsService); const typistGroupName = 'typist-group-name'; const typistUserIds = [...userIds]; - const context = makeContext(adminExternalId); + const context = makeContext( + adminExternalId, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await expect( service.createTypistGroup( context, @@ -2999,7 +3043,11 @@ describe('createTypistGroup', () => { const service = module.get(AccountsService); const typistGroupName = 'typist-group-name'; const typistUserIds = userIds; - const context = makeContext(adminExternalId); + const context = makeContext( + adminExternalId, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //DBアクセスに失敗するようにする const typistGroupService = module.get( UserGroupsRepositoryService, @@ -3069,7 +3117,11 @@ describe('getTypistGroup', () => { const typistGroupName = 'typist-group-name'; const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createTypistGroup( context, @@ -3129,7 +3181,11 @@ describe('getTypistGroup', () => { // アカウントにタイピストグループを作成する const typistGroupName = 'typist-group-name'; const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createTypistGroup( context, admin.external_id, @@ -3184,7 +3240,11 @@ describe('getTypistGroup', () => { // アカウントにタイピストグループを作成する const typistGroupName = 'typist-group-name'; const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createTypistGroup( context, @@ -3266,7 +3326,11 @@ describe('updateTypistGroup', () => { const service = module.get(AccountsService); const typistUserIds = [userIds[1]]; - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const typistGroupName = 'typist-group-name'; await service.createTypistGroup( context, @@ -3338,7 +3402,11 @@ describe('updateTypistGroup', () => { const typistGroupName = 'typist-group-name'; const service = module.get(AccountsService); const typistUserIds = [userIds[2]]; - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createTypistGroup( context, @@ -3402,7 +3470,11 @@ describe('updateTypistGroup', () => { const typistGroupName = 'typist-group-name'; const service = module.get(AccountsService); const typistUserIds = [999]; - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createTypistGroup( context, admin.external_id, @@ -3465,7 +3537,11 @@ describe('updateTypistGroup', () => { const typistGroupName = 'typist-group-name'; const service = module.get(AccountsService); const typistUserIds = [...userIds]; - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createTypistGroup( context, admin.external_id, @@ -3528,7 +3604,11 @@ describe('updateTypistGroup', () => { const typistGroupName = 'typist-group-name'; const service = module.get(AccountsService); const typistUserIds = [userIds[1]]; - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createTypistGroup( context, admin.external_id, @@ -3591,7 +3671,11 @@ describe('updateTypistGroup', () => { const typistGroupName = 'typist-group-name'; const service = module.get(AccountsService); const typistUserIds = [userIds[1]]; - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createTypistGroup( context, admin.external_id, @@ -3667,7 +3751,11 @@ describe('getWorktypes', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await createWorktype(source, account.id, 'worktype1', 'description1', true); await createWorktype(source, account.id, 'worktype2'); @@ -3708,7 +3796,11 @@ describe('getWorktypes', () => { const { admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const resWorktypes = await service.getWorktypes(context, admin.external_id); @@ -3726,7 +3818,11 @@ describe('getWorktypes', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await createWorktype(source, account.id, 'worktype1', 'description1'); await createWorktype(source, account.id, 'worktype2'); @@ -3787,7 +3883,11 @@ describe('createWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // Worktypeが未登録であることを確認 { @@ -3828,7 +3928,11 @@ describe('createWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktypeId = 'worktype1'; await createWorktype(source, account.id, worktypeId); @@ -3859,7 +3963,11 @@ describe('createWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // あらかじめ最大登録数分のWorktypeを登録する for (let i = 0; i < WORKTYPE_MAX_COUNT; i++) { @@ -3892,7 +4000,11 @@ describe('createWorktype', () => { const { admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //DBアクセスに失敗するようにする const worktypeService = module.get( @@ -3940,7 +4052,11 @@ describe('updateWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = new Worktype(); worktype.custom_worktype_id = 'worktypeID1'; @@ -3989,7 +4105,11 @@ describe('updateWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = new Worktype(); worktype.custom_worktype_id = 'worktypeID1'; @@ -4036,7 +4156,11 @@ describe('updateWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype1 = new Worktype(); worktype1.custom_worktype_id = 'worktypeID1'; worktype1.description = 'description1'; @@ -4098,7 +4222,11 @@ describe('updateWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = new Worktype(); worktype.custom_worktype_id = 'worktypeID1'; @@ -4146,7 +4274,11 @@ describe('updateWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = new Worktype(); worktype.custom_worktype_id = 'worktypeID1'; @@ -4219,7 +4351,11 @@ describe('deleteWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const { id: worktypeId1 } = await createWorktype( source, @@ -4267,7 +4403,11 @@ describe('deleteWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const { id: worktypeId1 } = await createWorktype( source, @@ -4314,7 +4454,11 @@ describe('deleteWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const { id: worktypeId1 } = await createWorktype( source, @@ -4358,7 +4502,11 @@ describe('deleteWorktype', () => { }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const { id: worktypeId1 } = await createWorktype( source, @@ -4402,7 +4550,11 @@ describe('deleteWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const { id: worktypeId1 } = await createWorktype( source, @@ -4467,7 +4619,11 @@ describe('getOptionItems', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = await createWorktype(source, account.id, 'worktype1'); const optionItems = await createOptionItems(source, worktype.id); @@ -4510,7 +4666,11 @@ describe('getOptionItems', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = await createWorktype(source, account.id, 'worktype1'); const optionItems = await createOptionItems(source, worktype.id); @@ -4545,7 +4705,11 @@ describe('getOptionItems', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = await createWorktype(source, account.id, 'worktype1'); const optionItems = await createOptionItems(source, worktype.id); @@ -4606,7 +4770,11 @@ describe('updateOptionItems', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = await createWorktype(source, account.id, 'worktype1'); const optionItems = await createOptionItems(source, worktype.id); @@ -4732,7 +4900,11 @@ describe('updateOptionItems', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = await createWorktype(source, account.id, 'worktype1'); const optionItems = await createOptionItems(source, worktype.id); @@ -4818,7 +4990,11 @@ describe('updateOptionItems', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = await createWorktype(source, account.id, 'worktype1'); const optionItems = await createOptionItems(source, worktype.id); @@ -4932,7 +5108,11 @@ describe('updateActiveWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype = await createWorktype(source, account.id, 'worktype1'); @@ -4959,7 +5139,11 @@ describe('updateActiveWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype1 = await createWorktype( source, @@ -4997,7 +5181,11 @@ describe('updateActiveWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const worktype1 = await createWorktype( source, @@ -5030,7 +5218,11 @@ describe('updateActiveWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await createWorktype(source, account.id, 'worktype1'); @@ -5063,7 +5255,11 @@ describe('updateActiveWorktype', () => { }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await createWorktype(source, account.id, 'worktype1'); await createWorktype(source, otherAccount.id, 'worktype2'); @@ -5102,7 +5298,11 @@ describe('updateActiveWorktype', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await createWorktype(source, account.id, 'worktype1'); @@ -5190,7 +5390,7 @@ describe('ライセンス発行キャンセル', () => { const service = module.get(AccountsService); await service.cancelIssue( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier1Accounts[0].users[0].external_id, poNumber, tier5Accounts.account.id, @@ -5253,7 +5453,7 @@ describe('ライセンス発行キャンセル', () => { const service = module.get(AccountsService); await service.cancelIssue( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier2Accounts[0].users[0].external_id, poNumber, tier5Accounts.account.id, @@ -5291,7 +5491,7 @@ describe('ライセンス発行キャンセル', () => { const service = module.get(AccountsService); await expect( service.cancelIssue( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier1Accounts[0].users[0].external_id, poNumber, tier5Accounts.account.id, @@ -5337,7 +5537,7 @@ describe('ライセンス発行キャンセル', () => { const service = module.get(AccountsService); await expect( service.cancelIssue( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier1Accounts[0].users[0].external_id, poNumber, tier5Accounts.account.id, @@ -5383,7 +5583,7 @@ describe('ライセンス発行キャンセル', () => { const service = module.get(AccountsService); await expect( service.cancelIssue( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier1Accounts[0].users[0].external_id, poNumber, tier5Accounts.account.id, @@ -5430,7 +5630,7 @@ describe('ライセンス発行キャンセル', () => { const service = module.get(AccountsService); await expect( service.cancelIssue( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier1Accounts[0].users[0].external_id, poNumber, tier5Accounts.account.id, @@ -5549,7 +5749,7 @@ describe('パートナー一覧取得', () => { }); const partners = await service.getPartners( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier1Accounts[0].users[0].external_id, 15, 0, @@ -5598,7 +5798,7 @@ describe('パートナー一覧取得', () => { }); const partners = await service.getPartners( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), account.admin.external_id, 15, 0, @@ -5640,7 +5840,7 @@ describe('アカウント情報更新', () => { tier: 5, }); await service.updateAccountInfo( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier5Accounts.admin.external_id, tier5Accounts.account.tier, true, @@ -5669,7 +5869,7 @@ describe('アカウント情報更新', () => { role: 'typist', }); await service.updateAccountInfo( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier4Accounts[0].users[0].external_id, tier4Accounts[0].account.tier, false, @@ -5699,7 +5899,7 @@ describe('アカウント情報更新', () => { role: 'typist', }); await service.updateAccountInfo( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier4Accounts[0].users[0].external_id, tier4Accounts[0].account.tier, false, @@ -5730,7 +5930,7 @@ describe('アカウント情報更新', () => { }); await expect( service.updateAccountInfo( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier4Accounts[0].users[0].external_id, tier4Accounts[0].account.tier, false, @@ -5756,7 +5956,7 @@ describe('アカウント情報更新', () => { }); await expect( service.updateAccountInfo( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier5Accounts.admin.external_id, tier5Accounts.account.tier, true, @@ -5782,7 +5982,7 @@ describe('アカウント情報更新', () => { }); await expect( service.updateAccountInfo( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier5Accounts.admin.external_id, tier5Accounts.account.tier, true, @@ -5827,7 +6027,11 @@ describe('getAccountInfo', () => { }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const accountResponse = await service.getAccountInfo( context, @@ -5906,7 +6110,11 @@ describe('getAuthors', () => { } const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const authors = await service.getAuthors(context, admin.external_id); //実行結果を確認 @@ -5946,7 +6154,11 @@ describe('getAuthors', () => { } const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const authors = await service.getAuthors(context, admin.external_id); //実行結果を確認 @@ -5970,7 +6182,11 @@ describe('getAuthors', () => { } const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const authors = await service.getAuthors(context, admin.external_id); //実行結果を確認 @@ -5986,7 +6202,11 @@ describe('getAuthors', () => { const { admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(AccountsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //DBアクセスに失敗するようにする const usersService = module.get( @@ -6069,7 +6289,7 @@ describe('getTypists', () => { ], }); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); const typists = await service.getTypists(context, admin.external_id); //実行結果を確認 @@ -6097,7 +6317,7 @@ describe('getTypists', () => { overrideAdB2cService(service, { getUsers: async () => [{ id: admin.external_id, displayName: '' }], }); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); const typists = await service.getTypists(context, admin.external_id); //実行結果を確認 @@ -6146,7 +6366,7 @@ describe('getTypists', () => { ], }); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); const typists = await service.getTypists(context, admin.external_id); //実行結果を確認 @@ -6173,7 +6393,7 @@ describe('getTypists', () => { UsersRepositoryService, ); usersService.findTypistUsers = jest.fn().mockRejectedValue('DB failed'); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); //実行結果を確認 try { @@ -6240,7 +6460,11 @@ describe('deleteAccountAndData', () => { account_id: tier5AccountsB.account.id, }); - const context = makeContext(tier5AccountsA.admin.external_id); + const context = makeContext( + tier5AccountsA.admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 第一階層~第五階層までのライセンス注文を作成 await createLicenseOrder( source, @@ -6421,7 +6645,11 @@ describe('deleteAccountAndData', () => { }); const account = account1; const admin = admin1; - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 第五階層のアカウント作成 const tier5Accounts = await makeTestAccount(source, { parent_account_id: account.id, @@ -6485,7 +6713,11 @@ describe('deleteAccountAndData', () => { }); const account = account1; const admin = admin1; - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 第五階層のアカウント作成 const tier5Accounts = await makeTestAccount(source, { parent_account_id: account.id, @@ -6540,7 +6772,11 @@ describe('deleteAccountAndData', () => { }); const account = account1; const admin = admin1; - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 第五階層のアカウント作成 const tier5Accounts = await makeTestAccount(source, { parent_account_id: account.id, @@ -6609,7 +6845,11 @@ describe('getAccountInfoMinimalAccess', () => { const { account, admin } = await makeTestAccount(source, { tier: 5, }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 作成したデータを確認 { @@ -6634,7 +6874,11 @@ describe('getAccountInfoMinimalAccess', () => { const { account, admin } = await makeTestAccount(source, { tier: 4, }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 作成したデータを確認 { @@ -6659,7 +6903,11 @@ describe('getAccountInfoMinimalAccess', () => { const { account, admin } = await makeTestAccount(source, { tier: 4, }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 作成したデータを確認 { @@ -6687,7 +6935,11 @@ describe('getAccountInfoMinimalAccess', () => { const { account, admin } = await makeTestAccount(source, { tier: 4, }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 作成したデータを確認 { @@ -6744,7 +6996,11 @@ describe('getCompanyName', () => { tier: 5, company_name: 'testCompany', }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const response = await service.getCompanyName(context, account.id); expect({ companyName: 'testCompany' }).toEqual(response); }); @@ -6759,7 +7015,11 @@ describe('getCompanyName', () => { tier: 5, company_name: 'testCompany', }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); try { await service.getCompanyName(context, 123); } catch (e) { diff --git a/dictation_server/src/features/accounts/accounts.service.ts b/dictation_server/src/features/accounts/accounts.service.ts index 668f815..7de2682 100644 --- a/dictation_server/src/features/accounts/accounts.service.ts +++ b/dictation_server/src/features/accounts/accounts.service.ts @@ -607,11 +607,7 @@ export class AccountsService { const externalIds = typistUsers.map((x) => x.external_id); // B2Cからユーザー名を取得する - const trackingId = new Context(context.trackingId); - const adb2cUsers = await this.adB2cService.getUsers( - trackingId, - externalIds, - ); + const adb2cUsers = await this.adB2cService.getUsers(context, externalIds); const typists = typistUsers.map((x) => { const user = adb2cUsers.find((adb2c) => adb2c.id === x.external_id); diff --git a/dictation_server/src/features/auth/auth.controller.ts b/dictation_server/src/features/auth/auth.controller.ts index dbec612..a243192 100644 --- a/dictation_server/src/features/auth/auth.controller.ts +++ b/dictation_server/src/features/auth/auth.controller.ts @@ -3,6 +3,7 @@ import { Controller, HttpException, HttpStatus, + Logger, Post, Req, UseGuards, @@ -25,8 +26,7 @@ import { DelegationAccessTokenResponse, } from './types/types'; import { retrieveAuthorizationToken } from '../../common/http/helper'; -import { makeContext } from '../../common/log'; -import { v4 as uuidv4 } from 'uuid'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { Request } from 'express'; import { AuthGuard } from '../../common/guards/auth/authguards'; import { RoleGuard } from '../../common/guards/role/roleguards'; @@ -39,6 +39,7 @@ import { RedisService } from '../../gateways/redis/redis.service'; @ApiTags('auth') @Controller('auth') export class AuthController { + private readonly logger = new Logger(AuthController.name); constructor( private readonly authService: AuthService, private readonly redisService: RedisService, @@ -65,8 +66,29 @@ export class AuthController { 'AzureADB2Cでのサインイン後に払いだされるIDトークンを元に認証用のアクセストークンとリフレッシュトークンを生成します', operationId: 'token', }) - async token(@Body() body: TokenRequest): Promise { - const context = makeContext(uuidv4()); + async token( + @Body() body: TokenRequest, + @Req() req: Request, + ): Promise { + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); + const idToken = await this.authService.getVerifiedIdToken( context, body.idToken, @@ -145,7 +167,6 @@ export class AuthController { }) async accessToken(@Req() req: Request): Promise { const refreshToken = retrieveAuthorizationToken(req); - if (!refreshToken) { throw new HttpException( makeErrorResponse('E000107'), @@ -153,7 +174,24 @@ export class AuthController { ); } - const context = makeContext(uuidv4()); + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const accessToken = await this.authService.generateAccessToken( context, @@ -202,13 +240,29 @@ export class AuthController { ): Promise { const { delegatedAccountId } = body; const token = retrieveAuthorizationToken(req); - if (!token) { throw new HttpException( makeErrorResponse('E000107'), HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(token, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -218,7 +272,9 @@ export class AuthController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); + const refreshToken = await this.authService.generateDelegationRefreshToken( context, userId, @@ -257,13 +313,29 @@ export class AuthController { @Req() req: Request, ): Promise { const refreshToken = retrieveAuthorizationToken(req); - if (!refreshToken) { throw new HttpException( makeErrorResponse('E000107'), HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedRefreshToken = jwt.decode(refreshToken, { json: true }); if (!decodedRefreshToken) { throw new HttpException( @@ -273,7 +345,9 @@ export class AuthController { } const { userId, delegateUserId } = decodedRefreshToken as RefreshToken; - const context = makeContext(userId); + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); + const accessToken = await this.authService.updateDelegationAccessToken( context, delegateUserId, diff --git a/dictation_server/src/features/auth/auth.service.spec.ts b/dictation_server/src/features/auth/auth.service.spec.ts index f978889..5862140 100644 --- a/dictation_server/src/features/auth/auth.service.spec.ts +++ b/dictation_server/src/features/auth/auth.service.spec.ts @@ -31,7 +31,7 @@ describe('AuthService', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtpZCJ9.eyJleHAiOjkwMDAwMDAwMDAsIm5iZiI6MTAwMDAwMDAwMCwidmVyIjoiMS4wIiwiaXNzIjoiaXNzdWVyIiwic3ViIjoic3ViIiwiYXVkIjoiYXVkIiwibm9uY2UiOiJkZWZhdWx0Tm9uY2UiLCJpYXQiOjEwMDAwMDAwMDAsImF1dGhfdGltZSI6MTAwMDAwMDAwMCwiZW1haWxzIjpbInh4eEB4eC5jb20iXSwidGZwIjoic2lnbmluX3VzZXJmbG93In0.RyieW-VHsHPQOjXbbhRc307AYJOc1sq2hrcu4SW1-K0pvLlkplepxvx02a3vCwQrnBYrIP5w6HExG-S_JgW5nYyWr6DeY11mA484n9KA8GeAcAXV37StH1gfWUJvfGb4C8BaMbMM9Ix4Z9NGwKA9vjNwevfmBZnz9lQUePgv6BJNmyvCt8ElJ01O-1WODbZuojJ4xXymA1OqluzfbphPOsqWTSNmTn0emkLjjnlMQf1iwM4C_kvvr8dUCFg0_UGDfQVJnzPEKB38UqnhLnC5WacrddDwQ0kBuGKZgZ_63Q_7fOvqAZivqLK7BPmbPxi6mx3R1S9Eq2ugzpY1LfJOjA'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect(await service.getVerifiedIdToken(context, token)).toEqual( idTokenPayload, ); @@ -43,7 +43,7 @@ describe('AuthService', () => { const service = await makeAuthServiceMock(adb2cParam, configMockValue); const token = 'invalid.id.token'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getVerifiedIdToken(context, token)).rejects.toEqual( new HttpException(makeErrorResponse('E000101'), HttpStatus.UNAUTHORIZED), ); @@ -58,7 +58,7 @@ describe('AuthService', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtpZCJ9.eyJleHAiOjEwMDAwMDAwMDAsIm5iZiI6MTAwMDAwMDAwMCwidmVyIjoiMS4wIiwiaXNzIjoiaXNzdWVyIiwic3ViIjoic3ViIiwiYXVkIjoiYXVkIiwibm9uY2UiOiJkZWZhdWx0Tm9uY2UiLCJpYXQiOjEwMDAwMDAwMDAsImF1dGhfdGltZSI6MTAwMDAwMDAwMCwiZW1haWxzIjpbInh4eEB4eC5jb20iXSwidGZwIjoic2lnbmluX3VzZXJmbG93In0.r9x61Mf1S2qFgU_QDKB6tRFBmTQXyOEtpoacOlL_bQzFz1t3GsxMy6SJIvQQ-LtDgylQ1UCdMFiRuy4V8nyLuME0fR-9IkKsboGvwllHB_Isai3XFoja0jpDHMVby1m0B3Z9xOTb7YsaQGyEH-qs1TtnRm6Ny98h4Po80nK8HGefQZHBOlfQN_B1LiHwI3nLXV18NL-4olKXj2NloNRYtnWM0PaqDQcGvZFaSNvtrSYpo9ddD906QWDGVOQ7WvGSUgdNCoxX8Lb3r2-VSj6n84jpb-Y1Fz-GhLluNglAsBhasnJfUIvCIO3iG5pRyTYjHFAVHmzjr8xMOmhS3s41Jw'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getVerifiedIdToken(context, token)).rejects.toEqual( new HttpException(makeErrorResponse('E000102'), HttpStatus.UNAUTHORIZED), ); @@ -73,7 +73,7 @@ describe('AuthService', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtpZCJ9.eyJleHAiOjkwMDAwMDAwMDAsIm5iZiI6OTAwMDAwMDAwMCwidmVyIjoiMS4wIiwiaXNzIjoiaXNzdWVyIiwic3ViIjoic3ViIiwiYXVkIjoiYXVkIiwibm9uY2UiOiJkZWZhdWx0Tm9uY2UiLCJpYXQiOjEwMDAwMDAwMDAsImF1dGhfdGltZSI6MTAwMDAwMDAwMCwiZW1haWxzIjpbInh4eEB4eC5jb20iXSwidGZwIjoic2lnbmluX3VzZXJmbG93In0.fX2Gbd7fDPNE3Lw-xbum_5CVqQYqEmMhv_v5u8A-U81pmPD2P5rsJEJx66ns1taFLVaE3j9_OzotxrqjqqQqbACkagGcN5wvA3_ZIxyqmhrKYFJc53ZcO7d0pFWiQlluNBI_pnFNDlSMB2Ut8Th5aiPy2uamBM9wC99bcjo7HkHvTKBf6ljU6rPKoD51qGDWqNxjoH-hdSJ29wprvyxyk_yX6dp-cxXUj5DIgXYQuIZF71rdiPtGlAiyTBns8rS2QlEEXapZVlvYrK4mkpUXVDA7ifD8q6gAC2BStqHeys7CGp2MbV4ZwKCVbAUbMs6Tboh8rADZvQhuTEq7qlhZ-w'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getVerifiedIdToken(context, token)).rejects.toEqual( new HttpException(makeErrorResponse('E000103'), HttpStatus.UNAUTHORIZED), ); @@ -86,7 +86,7 @@ describe('AuthService', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtpZCJ9.eyJleHAiOjkwMDAwMDAwMDAsIm5iZiI6MTAwMDAwMDAwMCwidmVyIjoiMS4wIiwiaXNzIjoiaXNzdXNlciIsInN1YiI6InN1YiIsImF1ZCI6ImF1ZCIsIm5vbmNlIjoiZGVmYXVsdE5vbmNlIiwiaWF0IjoxMDAwMDAwMDAwLCJhdXRoX3RpbWUiOjEwMDAwMDAwMDAsImVtYWlscyI6WyJ4eHhAeHguY29tIl0sInRmcCI6InNpZ25pbl91c2VyZmxvdyJ9.sign'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getVerifiedIdToken(context, token)).rejects.toEqual( new HttpException(makeErrorResponse('E000104'), HttpStatus.UNAUTHORIZED), ); @@ -101,7 +101,7 @@ describe('AuthService', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtpZCJ9.eyJleHAiOjkwMDAwMDAwMDAsIm5iZiI6MTAwMDAwMDAwMCwidmVyIjoiMS4wIiwiaXNzIjoiaW52bGlkX2lzc3VlciIsInN1YiI6InN1YiIsImF1ZCI6ImF1ZCIsIm5vbmNlIjoiZGVmYXVsdE5vbmNlIiwiaWF0IjoxMDAwMDAwMDAwLCJhdXRoX3RpbWUiOjEwMDAwMDAwMDAsImVtYWlscyI6WyJ4eHhAeHguY29tIl0sInRmcCI6InNpZ25pbl91c2VyZmxvdyJ9.0bp3e1mDG78PX3lo8zgOLXGenIqG_Vi6kw7CbwauAQM-cnUZ_aVCoJ_dAv_QmPElOQKcCkRrAvAZ91FwuHDlBGuuDqx8OwqN0VaD-4NPouoAswj-9HNvBm8gUn-pGaXkvWt_72UdCJavZJjDj_RHur8y8kFt5Qeab3mUP2x-uNcV2Q2x3M_IIfcRiIZkRZm_azKfiVIy7tzoUFLDss97y938aR8imMVxazoSQvj7RWIWylgeRr9yVt7qYl18cnEVL0IGtslFbqhfNsiEmRCMsttm5kXs7E9B0bhhUe_xbJW9VumQ6G7dgMrswevp_jRgbpWJoZsgErtqIRl9Tc9ikA'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getVerifiedIdToken(context, token)).rejects.toEqual( new HttpException(makeErrorResponse('E000105'), HttpStatus.UNAUTHORIZED), ); @@ -115,7 +115,7 @@ describe('AuthService', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtpZCJ9.eyJleHAiOjkwMDAwMDAwMDAsIm5iZiI6MTAwMDAwMDAwMCwidmVyIjoiMS4wIiwiaXNzIjoiaXNzdWVyIiwic3ViIjoic3ViIiwiYXVkIjoiYXVkIiwibm9uY2UiOiJkZWZhdWx0Tm9uY2UiLCJpYXQiOjEwMDAwMDAwMDAsImF1dGhfdGltZSI6MTAwMDAwMDAwMCwiZW1haWxzIjpbInh4eEB4eC5jb20iXSwidGZwIjoic2lnbmluX3VzZXJmbG93In0.RyieW-VHsHPQOjXbbhRc307AYJOc1sq2hrcu4SW1-K0pvLlkplepxvx02a3vCwQrnBYrIP5w6HExG-S_JgW5nYyWr6DeY11mA484n9KA8GeAcAXV37StH1gfWUJvfGb4C8BaMbMM9Ix4Z9NGwKA9vjNwevfmBZnz9lQUePgv6BJNmyvCt8ElJ01O-1WODbZuojJ4xXymA1OqluzfbphPOsqWTSNmTn0emkLjjnlMQf1iwM4C_kvvr8dUCFg0_UGDfQVJnzPEKB38UqnhLnC5WacrddDwQ0kBuGKZgZ_63Q_7fOvqAZivqLK7BPmbPxi6mx3R1S9Eq2ugzpY1LfJOjA'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getVerifiedIdToken(context, token)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -131,7 +131,7 @@ describe('AuthService', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtpZCJ9.eyJleHAiOjkwMDAwMDAwMDAsIm5iZiI6MTAwMDAwMDAwMCwidmVyIjoiMS4wIiwiaXNzIjoiaXNzdWVyIiwic3ViIjoic3ViIiwiYXVkIjoiYXVkIiwibm9uY2UiOiJkZWZhdWx0Tm9uY2UiLCJpYXQiOjEwMDAwMDAwMDAsImF1dGhfdGltZSI6MTAwMDAwMDAwMCwiZW1haWxzIjpbInh4eEB4eC5jb20iXSwidGZwIjoic2lnbmluX3VzZXJmbG93In0.RyieW-VHsHPQOjXbbhRc307AYJOc1sq2hrcu4SW1-K0pvLlkplepxvx02a3vCwQrnBYrIP5w6HExG-S_JgW5nYyWr6DeY11mA484n9KA8GeAcAXV37StH1gfWUJvfGb4C8BaMbMM9Ix4Z9NGwKA9vjNwevfmBZnz9lQUePgv6BJNmyvCt8ElJ01O-1WODbZuojJ4xXymA1OqluzfbphPOsqWTSNmTn0emkLjjnlMQf1iwM4C_kvvr8dUCFg0_UGDfQVJnzPEKB38UqnhLnC5WacrddDwQ0kBuGKZgZ_63Q_7fOvqAZivqLK7BPmbPxi6mx3R1S9Eq2ugzpY1LfJOjA'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getVerifiedIdToken(context, token)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -150,7 +150,7 @@ describe('AuthService', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtpZCJ9.eyJleHAiOjkwMDAwMDAwMDAsIm5iZiI6MTAwMDAwMDAwMCwidmVyIjoiMS4wIiwiaXNzIjoiaXNzdWVyIiwic3ViIjoic3ViIiwiYXVkIjoiYXVkIiwibm9uY2UiOiJkZWZhdWx0Tm9uY2UiLCJpYXQiOjEwMDAwMDAwMDAsImF1dGhfdGltZSI6MTAwMDAwMDAwMCwiZW1haWxzIjpbInh4eEB4eC5jb20iXSwidGZwIjoic2lnbmluX3VzZXJmbG93In0.RyieW-VHsHPQOjXbbhRc307AYJOc1sq2hrcu4SW1-K0pvLlkplepxvx02a3vCwQrnBYrIP5w6HExG-S_JgW5nYyWr6DeY11mA484n9KA8GeAcAXV37StH1gfWUJvfGb4C8BaMbMM9Ix4Z9NGwKA9vjNwevfmBZnz9lQUePgv6BJNmyvCt8ElJ01O-1WODbZuojJ4xXymA1OqluzfbphPOsqWTSNmTn0emkLjjnlMQf1iwM4C_kvvr8dUCFg0_UGDfQVJnzPEKB38UqnhLnC5WacrddDwQ0kBuGKZgZ_63Q_7fOvqAZivqLK7BPmbPxi6mx3R1S9Eq2ugzpY1LfJOjA'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getVerifiedIdToken(context, token)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -186,7 +186,7 @@ describe('checkIsAcceptedLatestVersion', () => { const { admin } = await makeTestAccount(source, { tier: 5, }); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const idToken = { emails: [], @@ -210,7 +210,7 @@ describe('checkIsAcceptedLatestVersion', () => { const { admin } = await makeTestAccount(source, { tier: 4, }); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const idToken = { emails: [], @@ -234,7 +234,7 @@ describe('checkIsAcceptedLatestVersion', () => { const { admin } = await makeTestAccount(source, { tier: 5, }); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const idToken = { emails: [], @@ -258,7 +258,7 @@ describe('checkIsAcceptedLatestVersion', () => { const { admin } = await makeTestAccount(source, { tier: 4, }); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const idToken = { emails: [], @@ -282,7 +282,7 @@ describe('checkIsAcceptedLatestVersion', () => { const { admin } = await makeTestAccount(source, { tier: 4, }); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const idToken = { emails: [], @@ -306,7 +306,7 @@ describe('checkIsAcceptedLatestVersion', () => { const { admin } = await makeTestAccount(source, { tier: 4, }); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const idToken = { emails: [], @@ -361,7 +361,11 @@ describe('generateDelegationRefreshToken', () => { { role: USER_ROLES.NONE }, ); - const context = makeContext(parentAdmin.external_id); + const context = makeContext( + parentAdmin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const delegationRefreshToken = await service.generateDelegationRefreshToken( context, @@ -399,7 +403,11 @@ describe('generateDelegationRefreshToken', () => { { role: USER_ROLES.NONE }, ); - const context = makeContext(parentAdmin.external_id); + const context = makeContext( + parentAdmin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); try { await service.generateDelegationRefreshToken( @@ -437,7 +445,11 @@ describe('generateDelegationRefreshToken', () => { { role: USER_ROLES.NONE }, ); - const context = makeContext(parentAdmin.external_id); + const context = makeContext( + parentAdmin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); try { await service.generateDelegationRefreshToken( @@ -495,7 +507,11 @@ describe('generateDelegationAccessToken', () => { { role: USER_ROLES.NONE }, ); - const context = makeContext(parentAdmin.external_id); + const context = makeContext( + parentAdmin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const delegationRefreshToken = await service.generateDelegationRefreshToken( context, @@ -540,7 +556,11 @@ describe('generateDelegationAccessToken', () => { tier: 4, }); - const context = makeContext(parentAdmin.external_id); + const context = makeContext( + parentAdmin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); try { await service.generateDelegationAccessToken(context, 'invalid token'); @@ -595,7 +615,11 @@ describe('updateDelegationAccessToken', () => { { role: USER_ROLES.NONE }, ); - const context = makeContext(parentAdmin.external_id); + const context = makeContext( + parentAdmin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const delegationRefreshToken = await service.generateDelegationRefreshToken( context, @@ -653,7 +677,11 @@ describe('updateDelegationAccessToken', () => { { role: USER_ROLES.NONE }, ); - const context = makeContext(parentAdmin.external_id); + const context = makeContext( + parentAdmin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const delegationRefreshToken = await service.generateDelegationRefreshToken( context, @@ -719,7 +747,11 @@ describe('updateDelegationAccessToken', () => { { role: USER_ROLES.NONE }, ); - const context = makeContext(parentAdmin.external_id); + const context = makeContext( + parentAdmin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const delegationRefreshToken = await service.generateDelegationRefreshToken( context, diff --git a/dictation_server/src/features/files/files.controller.ts b/dictation_server/src/features/files/files.controller.ts index 05e941f..af41275 100644 --- a/dictation_server/src/features/files/files.controller.ts +++ b/dictation_server/src/features/files/files.controller.ts @@ -4,6 +4,7 @@ import { Get, HttpException, HttpStatus, + Logger, Post, Query, Req, @@ -37,12 +38,13 @@ import { RoleGuard } from '../../common/guards/role/roleguards'; import { ADMIN_ROLES, USER_ROLES } from '../../constants'; import { retrieveAuthorizationToken } from '../../common/http/helper'; import { Request } from 'express'; -import { makeContext } from '../../common/log'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { makeErrorResponse } from '../../common/error/makeErrorResponse'; @ApiTags('files') @Controller('files') export class FilesController { + private readonly logger = new Logger(FilesController.name); constructor(private readonly filesService: FilesService) {} @ApiResponse({ @@ -84,6 +86,22 @@ export class FilesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -93,7 +111,8 @@ export class FilesController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const { url, @@ -176,6 +195,22 @@ export class FilesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -185,7 +220,8 @@ export class FilesController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const url = await this.filesService.publishUploadSas(context, userId); return { url }; @@ -237,6 +273,22 @@ export class FilesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -246,7 +298,8 @@ export class FilesController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const url = await this.filesService.publishAudioFileDownloadSas( context, @@ -301,6 +354,22 @@ export class FilesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -310,7 +379,8 @@ export class FilesController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const url = await this.filesService.publishTemplateFileDownloadSas( context, @@ -357,6 +427,22 @@ export class FilesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -366,7 +452,8 @@ export class FilesController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const url = await this.filesService.publishTemplateFileUploadSas( context, @@ -418,6 +505,22 @@ export class FilesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -427,7 +530,8 @@ export class FilesController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.filesService.templateUploadFinished(context, userId, url, name); return {}; } diff --git a/dictation_server/src/features/files/files.service.spec.ts b/dictation_server/src/features/files/files.service.spec.ts index 34c6f00..c8e1229 100644 --- a/dictation_server/src/features/files/files.service.spec.ts +++ b/dictation_server/src/features/files/files.service.spec.ts @@ -85,7 +85,7 @@ describe('publishUploadSas', () => { null, null, ); - const context = makeContext(externalId); + const context = makeContext(externalId, 'xxx.xxx.xxx.xxx', 'requestId'); const baseUrl = `https://saodmsusdev.blob.core.windows.net/account-${account.id}/${userId}`; //SASトークンを返却する @@ -107,7 +107,11 @@ describe('publishUploadSas', () => { // 第四階層のアカウント作成 const { admin } = await makeTestAccount(source, { tier: 4 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //Blobコンテナ存在チェックに失敗するようにする overrideBlobstorageService(service, { @@ -135,7 +139,11 @@ describe('publishUploadSas', () => { // 第四階層のアカウント作成 const { admin } = await makeTestAccount(source, { tier: 4 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //BlobのSASトークン生成に失敗するようにする overrideBlobstorageService(service, { @@ -164,7 +172,11 @@ describe('publishUploadSas', () => { // 第五階層のアカウント作成 const { admin } = await makeTestAccount(source, { tier: 5, locked: true }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); try { await service.publishUploadSas(context, admin.external_id); @@ -209,7 +221,10 @@ describe('publishUploadSas', () => { const service = module.get(FilesService); await expect( - service.publishUploadSas(makeContext('trackingId'), externalId), + service.publishUploadSas( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + externalId, + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010812'), HttpStatus.BAD_REQUEST), ); @@ -267,7 +282,10 @@ describe('publishUploadSas', () => { const service = module.get(FilesService); await expect( - service.publishUploadSas(makeContext('trackingId'), externalId), + service.publishUploadSas( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + externalId, + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010805'), HttpStatus.BAD_REQUEST), ); @@ -348,7 +366,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { NotificationhubService, ); const result = await service.uploadFinished( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), authorExternalId, 'http://blob/url/file.zip', authorAuthorId ?? '', @@ -368,7 +386,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { expect(result).toEqual({ jobNumber: '00000001' }); // 通知処理が想定通りの引数で呼ばれているか確認 expect(NotificationHubService.notify).toHaveBeenCalledWith( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), [`user_${typistUserId}`], { authorId: 'AUTHOR_ID', @@ -449,7 +467,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { NotificationhubService, ); const result = await service.uploadFinished( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), authorExternalId, 'http://blob/url/file.zip', authorAuthorId ?? '', @@ -469,7 +487,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { expect(result).toEqual({ jobNumber: '00000002' }); // 通知処理が想定通りの引数で呼ばれているか確認 expect(NotificationHubService.notify).toHaveBeenCalledWith( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), [`user_${typistUserId}`], { authorId: 'AUTHOR_ID', @@ -572,7 +590,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { NotificationhubService, ); const result = await service.uploadFinished( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), myExternalId, // API実行者のユーザーIDを設定 'http://blob/url/file.zip', authorAuthorId ?? '', // 音声ファイルの情報には、録音者のAuthorIDが入る @@ -592,7 +610,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { expect(result).toEqual({ jobNumber: '00000001' }); // 通知処理が想定通りの引数で呼ばれているか確認 expect(NotificationHubService.notify).toHaveBeenCalledWith( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), [`user_${typistUserId}`], { authorId: 'AUTHOR_ID', @@ -694,7 +712,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { NotificationhubService, ); const result = await service.uploadFinished( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), myExternalId, // API実行者のユーザーIDを設定 'http://blob/url/file.zip', 'XXXXXXXXXX', // 音声ファイルの情報には、録音者のAuthorIDが入る @@ -714,7 +732,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { expect(result).toEqual({ jobNumber: '00000001' }); // 通知処理が想定通りの引数で呼ばれているか確認 expect(NotificationHubService.notify).toHaveBeenCalledWith( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), [`user_${typistUserId}`], { authorId: 'XXXXXXXXXX', @@ -763,7 +781,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { const service = module.get(FilesService); const result = await service.uploadFinished( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), authorExternalId, // API実行者のユーザーIDを設定 'http://blob/url/file.zip', authorAuthorId ?? '', // 音声ファイルの情報には、録音者のAuthorIDが入る @@ -819,7 +837,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { await expect( service.uploadFinished( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), authorExternalId, 'http://blob/url/file.zip', authorAuthorId ?? '', @@ -866,7 +884,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { await expect( service.uploadFinished( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), authorExternalId, 'http://blob/url/file.zip', authorAuthorId ?? '', @@ -907,7 +925,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { await expect( service.uploadFinished( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 'authorExternalId', 'http://blob/url/file.zip', 'authorAuthorId', @@ -958,7 +976,7 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { await expect( service.uploadFinished( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), authorExternalId, 'http://blob/url/file.zip', authorAuthorId ?? '', @@ -1043,7 +1061,7 @@ describe('音声ファイルダウンロードURL取得', () => { expect( await service.publishAudioFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1113,7 +1131,7 @@ describe('音声ファイルダウンロードURL取得', () => { expect( await service.publishAudioFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1160,7 +1178,7 @@ describe('音声ファイルダウンロードURL取得', () => { await expect( service.publishAudioFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1214,7 +1232,7 @@ describe('音声ファイルダウンロードURL取得', () => { await expect( service.publishTemplateFileDownloadSas( - makeContext('tracking'), + makeContext('tracking', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1259,7 +1277,7 @@ describe('音声ファイルダウンロードURL取得', () => { await expect( service.publishAudioFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1291,7 +1309,7 @@ describe('音声ファイルダウンロードURL取得', () => { await expect( service.publishAudioFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, 1, ), @@ -1340,7 +1358,7 @@ describe('音声ファイルダウンロードURL取得', () => { await expect( service.publishAudioFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1395,7 +1413,7 @@ describe('音声ファイルダウンロードURL取得', () => { await expect( service.publishAudioFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1467,7 +1485,7 @@ describe('音声ファイルダウンロードURL取得', () => { await expect( service.publishAudioFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1535,7 +1553,7 @@ describe('テンプレートファイルダウンロードURL取得', () => { expect( await service.publishTemplateFileDownloadSas( - makeContext('tracking'), + makeContext('tracking', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1605,7 +1623,7 @@ describe('テンプレートファイルダウンロードURL取得', () => { expect( await service.publishTemplateFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1646,7 +1664,7 @@ describe('テンプレートファイルダウンロードURL取得', () => { await expect( service.publishTemplateFileDownloadSas( - makeContext('tracking'), + makeContext('tracking', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1696,7 +1714,7 @@ describe('テンプレートファイルダウンロードURL取得', () => { await expect( service.publishTemplateFileDownloadSas( - makeContext('tracking'), + makeContext('tracking', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1741,7 +1759,7 @@ describe('テンプレートファイルダウンロードURL取得', () => { await expect( service.publishTemplateFileDownloadSas( - makeContext('tracking'), + makeContext('tracking', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1773,7 +1791,7 @@ describe('テンプレートファイルダウンロードURL取得', () => { await expect( service.publishTemplateFileDownloadSas( - makeContext('tracking'), + makeContext('tracking', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, 1, ), @@ -1821,7 +1839,7 @@ describe('テンプレートファイルダウンロードURL取得', () => { await expect( service.publishTemplateFileDownloadSas( - makeContext('tracking'), + makeContext('tracking', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1876,7 +1894,7 @@ describe('テンプレートファイルダウンロードURL取得', () => { await expect( service.publishTemplateFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1948,7 +1966,7 @@ describe('テンプレートファイルダウンロードURL取得', () => { await expect( service.publishTemplateFileDownloadSas( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, audioFileId, ), @@ -1985,7 +2003,11 @@ describe('publishTemplateFileUploadSas', () => { // 第五階層のアカウント作成 const { account, admin } = await makeTestAccount(source, { tier: 5 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const baseUrl = `https://saodmsusdev.blob.core.windows.net/account-${account.id}/Templates`; //SASトークンを返却する @@ -2010,7 +2032,11 @@ describe('publishTemplateFileUploadSas', () => { // 第五階層のアカウント作成 const { admin } = await makeTestAccount(source, { tier: 5 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //Blobコンテナ存在チェックに失敗するようにする overrideBlobstorageService(service, { @@ -2038,7 +2064,11 @@ describe('publishTemplateFileUploadSas', () => { // 第五階層のアカウント作成 const { admin } = await makeTestAccount(source, { tier: 5 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //BlobのSASトークン生成に失敗するようにする overrideBlobstorageService(service, { @@ -2087,7 +2117,11 @@ describe('templateUploadFinished', () => { const service = module.get(FilesService); // 第五階層のアカウント作成 const { account, admin } = await makeTestAccount(source, { tier: 5 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const fileName = 'test.docs'; const url = `https://blob.url/account-${account.id}/Templates`; @@ -2121,7 +2155,11 @@ describe('templateUploadFinished', () => { const service = module.get(FilesService); // 第五階層のアカウント作成 const { account, admin } = await makeTestAccount(source, { tier: 5 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const fileName = 'test.docs'; const url = `https://blob.url/account-${account.id}/Templates`; @@ -2161,7 +2199,11 @@ describe('templateUploadFinished', () => { const service = module.get(FilesService); // 第五階層のアカウント作成 const { account, admin } = await makeTestAccount(source, { tier: 5 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const fileName = 'test.docs'; const url = `https://blob.url/account-${account.id}/Templates`; diff --git a/dictation_server/src/features/licenses/licenses.controller.ts b/dictation_server/src/features/licenses/licenses.controller.ts index 33fd5e0..9839333 100644 --- a/dictation_server/src/features/licenses/licenses.controller.ts +++ b/dictation_server/src/features/licenses/licenses.controller.ts @@ -4,6 +4,7 @@ import { Get, HttpException, HttpStatus, + Logger, Post, Req, UseGuards, @@ -34,12 +35,13 @@ import { AuthGuard } from '../../common/guards/auth/authguards'; import { RoleGuard } from '../../common/guards/role/roleguards'; import { ADMIN_ROLES, TIERS } from '../../constants'; import jwt from 'jsonwebtoken'; -import { makeContext } from '../../common/log'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { makeErrorResponse } from '../../common/error/makeErrorResponse'; @ApiTags('licenses') @Controller('licenses') export class LicensesController { + private readonly logger = new Logger(LicensesController.name); constructor(private readonly licensesService: LicensesService) {} @ApiResponse({ status: HttpStatus.OK, @@ -83,6 +85,22 @@ export class LicensesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -91,7 +109,9 @@ export class LicensesController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); // ライセンス注文処理 await this.licensesService.licenseOrders( @@ -136,6 +156,22 @@ export class LicensesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -144,7 +180,9 @@ export class LicensesController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const cardLicenseKeys = await this.licensesService.issueCardLicenseKeys( context, @@ -198,6 +236,22 @@ export class LicensesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -206,7 +260,9 @@ export class LicensesController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.licensesService.activateCardLicenseKey( context, @@ -257,6 +313,22 @@ export class LicensesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -266,7 +338,8 @@ export class LicensesController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const allocatableLicenses = await this.licensesService.getAllocatableLicenses(context, userId); @@ -319,6 +392,22 @@ export class LicensesController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -328,7 +417,8 @@ export class LicensesController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.licensesService.cancelOrder(context, userId, body.poNumber); return {}; diff --git a/dictation_server/src/features/licenses/licenses.service.spec.ts b/dictation_server/src/features/licenses/licenses.service.spec.ts index 7804d71..aa4b670 100644 --- a/dictation_server/src/features/licenses/licenses.service.spec.ts +++ b/dictation_server/src/features/licenses/licenses.service.spec.ts @@ -59,7 +59,7 @@ describe('LicensesService', () => { const userId = '0001'; body.orderCount = 1000; body.poNumber = '1'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.licenseOrders( context, @@ -87,7 +87,7 @@ describe('LicensesService', () => { const userId = ''; body.orderCount = 1000; body.poNumber = '1'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.licenseOrders(context, userId, body.poNumber, body.orderCount), ).rejects.toEqual( @@ -115,7 +115,7 @@ describe('LicensesService', () => { const userId = '0001'; body.orderCount = 1000; body.poNumber = '1'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.licenseOrders(context, userId, body.poNumber, body.orderCount), ).rejects.toEqual( @@ -143,7 +143,7 @@ describe('LicensesService', () => { const userId = '0001'; body.orderCount = 1000; body.poNumber = '1'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.licenseOrders(context, userId, body.poNumber, body.orderCount), ).rejects.toEqual( @@ -181,7 +181,7 @@ describe('LicensesService', () => { 'AEJWRFFSWRQYQQJ6WVLV', ], }; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.issueCardLicenseKeys(context, userId, body.createCount), ).toEqual(issueCardLicensesResponse); @@ -201,7 +201,7 @@ describe('LicensesService', () => { const body = new IssueCardLicensesRequest(); const userId = '0001'; body.createCount = 1000; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.issueCardLicenseKeys(context, userId, body.createCount), ).rejects.toEqual( @@ -225,7 +225,7 @@ describe('LicensesService', () => { const body = new ActivateCardLicensesRequest(); const userId = '0001'; body.cardLicenseKey = 'WZCETXC0Z9PQZ9GKRGGY'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.activateCardLicenseKey( context, @@ -249,7 +249,7 @@ describe('LicensesService', () => { const body = new ActivateCardLicensesRequest(); const userId = '0001'; body.cardLicenseKey = 'WZCETXC0Z9PQZ9GKRGGY'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.activateCardLicenseKey(context, userId, body.cardLicenseKey), ).rejects.toEqual( @@ -276,7 +276,7 @@ describe('LicensesService', () => { const body = new ActivateCardLicensesRequest(); const userId = '0001'; body.cardLicenseKey = 'WZCETXC0Z9PQZ9GKRGGY'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.activateCardLicenseKey(context, userId, body.cardLicenseKey), ).rejects.toEqual( @@ -299,7 +299,7 @@ describe('LicensesService', () => { const body = new ActivateCardLicensesRequest(); const userId = '0001'; body.cardLicenseKey = 'WZCETXC0Z9PQZ9GKRGGY'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.activateCardLicenseKey(context, userId, body.cardLicenseKey), ).rejects.toEqual( @@ -342,7 +342,7 @@ describe('DBテスト', () => { const service = module.get(LicensesService); const issueCount = 500; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await service.issueCardLicenseKeys(context, externalId, issueCount); const dbSelectResult = await selectCardLicensesCount(source); expect(dbSelectResult.count).toEqual(issueCount); @@ -382,7 +382,7 @@ describe('DBテスト', () => { await createCardLicenseIssue(source, issueId); const service = module.get(LicensesService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await service.activateCardLicenseKey(context, externalId, cardLicenseKey); const dbSelectResultFromCardLicense = await selectCardLicense( @@ -529,7 +529,7 @@ describe('DBテスト', () => { null, ); const service = module.get(LicensesService); - const context = makeContext('userId'); + const context = makeContext('userId', 'xxx.xxx.xxx.xxx', 'requestId'); const response = await service.getAllocatableLicenses(context, externalId); // 対象外のデータは取得していないことを確認する expect(response.allocatableLicenses.length).toBe(5); @@ -599,7 +599,11 @@ describe('ライセンス割り当て', () => { const expiry_date = new NewAllocatedLicenseExpirationDate(); - await service.allocateLicense(makeContext('trackingId'), userId, 1); + await service.allocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + 1, + ); const resultLicense = await selectLicense(source, 1); expect(resultLicense.license?.allocated_user_id).toBe(userId); expect(resultLicense.license?.status).toBe( @@ -664,7 +668,11 @@ describe('ライセンス割り当て', () => { const service = module.get(UsersService); - await service.allocateLicense(makeContext('trackingId'), userId, 1); + await service.allocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + 1, + ); const result = await selectLicense(source, 1); expect(result.license?.allocated_user_id).toBe(userId); expect(result.license?.status).toBe(LICENSE_ALLOCATED_STATUS.ALLOCATED); @@ -739,7 +747,11 @@ describe('ライセンス割り当て', () => { const expiry_date = new NewAllocatedLicenseExpirationDate(); - await service.allocateLicense(makeContext('trackingId'), userId, 2); + await service.allocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + 2, + ); // もともと割り当てられていたライセンスの状態確認 const result1 = await selectLicense(source, 1); @@ -838,7 +850,11 @@ describe('ライセンス割り当て', () => { ); const service = module.get(UsersService); - await service.allocateLicense(makeContext('trackingId'), userId, 2); + await service.allocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + 2, + ); const licenseAllocationHistory = await selectLicenseAllocationHistory( source, @@ -898,7 +914,11 @@ describe('ライセンス割り当て', () => { ); const service = module.get(UsersService); - await service.allocateLicense(makeContext('trackingId'), userId, 2); + await service.allocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + 2, + ); const licenseAllocationHistory = await selectLicenseAllocationHistory( source, @@ -958,7 +978,11 @@ describe('ライセンス割り当て', () => { ); const service = module.get(UsersService); - await service.allocateLicense(makeContext('trackingId'), userId, 2); + await service.allocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + 2, + ); const licenseAllocationHistory = await selectLicenseAllocationHistory( source, @@ -1000,7 +1024,11 @@ describe('ライセンス割り当て', () => { const service = module.get(UsersService); await expect( - service.allocateLicense(makeContext('trackingId'), userId, 1), + service.allocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + 1, + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010805'), HttpStatus.BAD_REQUEST), ); @@ -1048,12 +1076,20 @@ describe('ライセンス割り当て', () => { const service = module.get(UsersService); await expect( - service.allocateLicense(makeContext('trackingId'), userId, 1), + service.allocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + 1, + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010806'), HttpStatus.BAD_REQUEST), ); await expect( - service.allocateLicense(makeContext('trackingId'), userId, 2), + service.allocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + 2, + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010806'), HttpStatus.BAD_REQUEST), ); @@ -1115,7 +1151,10 @@ describe('ライセンス割り当て解除', () => { ); const service = module.get(UsersService); - await service.deallocateLicense(makeContext('trackingId'), userId); + await service.deallocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + ); // 割り当て解除したライセンスの状態確認 const deallocatedLicense = await selectLicense(source, 1); @@ -1203,7 +1242,10 @@ describe('ライセンス割り当て解除', () => { const service = module.get(UsersService); await expect( - service.deallocateLicense(makeContext('trackingId'), userId), + service.deallocateLicense( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + userId, + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010807'), HttpStatus.BAD_REQUEST), ); @@ -1259,7 +1301,7 @@ describe('ライセンス注文キャンセル', () => { const service = module.get(LicensesService); await service.cancelOrder( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier2Accounts[0].users[0].external_id, poNumber, ); @@ -1295,7 +1337,7 @@ describe('ライセンス注文キャンセル', () => { const service = module.get(LicensesService); await expect( service.cancelOrder( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier2Accounts[0].users[0].external_id, poNumber, ), @@ -1326,7 +1368,7 @@ describe('ライセンス注文キャンセル', () => { const service = module.get(LicensesService); await expect( service.cancelOrder( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), tier2Accounts[0].users[0].external_id, poNumber, ), diff --git a/dictation_server/src/features/notification/notification.controller.ts b/dictation_server/src/features/notification/notification.controller.ts index 0a640be..701d13e 100644 --- a/dictation_server/src/features/notification/notification.controller.ts +++ b/dictation_server/src/features/notification/notification.controller.ts @@ -3,6 +3,7 @@ import { Controller, HttpException, HttpStatus, + Logger, Post, Req, UseGuards, @@ -21,12 +22,13 @@ import { AuthGuard } from '../../common/guards/auth/authguards'; import { retrieveAuthorizationToken } from '../../common/http/helper'; import { AccessToken } from '../../common/token'; import jwt from 'jsonwebtoken'; -import { makeContext } from '../../common/log'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { makeErrorResponse } from '../../common/error/makeErrorResponse'; @ApiTags('notification') @Controller('notification') export class NotificationController { + private readonly logger = new Logger(NotificationController.name); constructor(private readonly notificationService: NotificationService) {} @Post('register') @ApiResponse({ @@ -65,6 +67,22 @@ export class NotificationController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -74,7 +92,8 @@ export class NotificationController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.notificationService.register(context, userId, pns, handler); return {}; diff --git a/dictation_server/src/features/notification/notification.service.spec.ts b/dictation_server/src/features/notification/notification.service.spec.ts index bd714e7..a052fd7 100644 --- a/dictation_server/src/features/notification/notification.service.spec.ts +++ b/dictation_server/src/features/notification/notification.service.spec.ts @@ -19,7 +19,7 @@ describe('NotificationService.register', () => { expect( await service.register( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 'external_id', 'apns', 'handler', @@ -38,7 +38,7 @@ describe('NotificationService.register', () => { await expect( service.register( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 'external_id', 'apns', 'handler', @@ -63,7 +63,7 @@ describe('NotificationService.register', () => { await expect( service.register( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 'external_id', 'apns', 'handler', diff --git a/dictation_server/src/features/tasks/tasks.controller.ts b/dictation_server/src/features/tasks/tasks.controller.ts index 2b976b2..18f3772 100644 --- a/dictation_server/src/features/tasks/tasks.controller.ts +++ b/dictation_server/src/features/tasks/tasks.controller.ts @@ -2,9 +2,9 @@ import { Body, Controller, Get, - Headers, HttpException, HttpStatus, + Logger, Param, ParseIntPipe, Post, @@ -45,12 +45,13 @@ import { AuthGuard } from '../../common/guards/auth/authguards'; import { RoleGuard } from '../../common/guards/role/roleguards'; import { ADMIN_ROLES, USER_ROLES } from '../../constants'; import { Roles } from '../../common/types/role'; -import { makeContext } from '../../common/log'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { makeErrorResponse } from '../../common/error/makeErrorResponse'; @ApiTags('tasks') @Controller('tasks') export class TasksController { + private readonly logger = new Logger(TasksController.name); constructor(private readonly taskService: TasksService) {} @ApiResponse({ @@ -91,6 +92,23 @@ export class TasksController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -102,7 +120,8 @@ export class TasksController { // RoleGuardでroleの文字列に想定外の文字列や重複がないことは担保されているためここでは型変換のみ行う const roles = role.split(' ') as Roles[]; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const { limit, offset, status } = body; const paramName = isTaskListSortableAttribute(body.paramName ?? '') @@ -164,13 +183,29 @@ export class TasksController { ): Promise { const { endedFileId } = param; - const accessToken = retrieveAuthorizationToken(req) as string; + const accessToken = retrieveAuthorizationToken(req); if (!accessToken) { throw new HttpException( makeErrorResponse('E000107'), HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -179,7 +214,8 @@ export class TasksController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const nextFileId = await this.taskService.getNextTask( context, @@ -241,6 +277,23 @@ export class TasksController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -253,7 +306,8 @@ export class TasksController { // RoleGuardでroleの文字列に想定外の文字列や重複がないことは担保されているためここでは型変換のみ行う const roles = role.split(' ') as Roles[]; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.taskService.checkout(context, param.audioFileId, roles, userId); return {}; @@ -311,6 +365,23 @@ export class TasksController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -320,7 +391,8 @@ export class TasksController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.taskService.checkin(context, audioFileId, userId); return {}; @@ -378,6 +450,23 @@ export class TasksController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -389,7 +478,8 @@ export class TasksController { // RoleGuardでroleの文字列に想定外の文字列や重複がないことは担保されているためここでは型変換のみ行う const roles = role.split(' ') as Roles[]; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.taskService.cancel(context, audioFileId, userId, roles); return {}; @@ -447,6 +537,23 @@ export class TasksController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -456,7 +563,8 @@ export class TasksController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.taskService.suspend(context, audioFileId, userId); return {}; @@ -513,6 +621,23 @@ export class TasksController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -522,7 +647,8 @@ export class TasksController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.taskService.backup(context, audioFileId, userId); return {}; @@ -585,6 +711,23 @@ export class TasksController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -596,7 +739,8 @@ export class TasksController { // RoleGuardでroleの文字列に想定外の文字列や重複がないことは担保されているためここでは型変換のみ行う const roles = role.split(' ') as Roles[]; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.taskService.changeCheckoutPermission( context, diff --git a/dictation_server/src/features/tasks/tasks.service.spec.ts b/dictation_server/src/features/tasks/tasks.service.spec.ts index cb8ac34..56287ac 100644 --- a/dictation_server/src/features/tasks/tasks.service.spec.ts +++ b/dictation_server/src/features/tasks/tasks.service.spec.ts @@ -63,7 +63,7 @@ describe('TasksService', () => { const direction = 'ASC'; expect( await service.tasksService.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), userId, [ADMIN_ROLES.ADMIN, USER_ROLES.NONE], offset, @@ -138,7 +138,7 @@ describe('TasksService', () => { const direction = 'ASC'; await expect( service.tasksService.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), userId, [ADMIN_ROLES.ADMIN, USER_ROLES.NONE], offset, @@ -180,7 +180,7 @@ describe('TasksService', () => { const direction = 'ASC'; await expect( service.tasksService.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), userId, [ADMIN_ROLES.ADMIN, USER_ROLES.NONE], offset, @@ -266,7 +266,7 @@ describe('TasksService', () => { const direction = 'ASC'; await expect( service.tasksService.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), userId, [ADMIN_ROLES.ADMIN, USER_ROLES.NONE], offset, @@ -310,7 +310,7 @@ describe('TasksService', () => { const paramName = 'JOB_NUMBER'; const direction = 'ASC'; const result = await service.tasksService.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), userId, [USER_ROLES.AUTHOR], offset, @@ -393,7 +393,7 @@ describe('TasksService', () => { const direction = 'ASC'; await expect( service.tasksService.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), userId, [USER_ROLES.AUTHOR], offset, @@ -438,7 +438,7 @@ describe('TasksService', () => { const paramName = 'JOB_NUMBER'; const direction = 'ASC'; const result = await service.tasksService.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), userId, [USER_ROLES.TYPIST], offset, @@ -521,7 +521,7 @@ describe('TasksService', () => { const direction = 'ASC'; await expect( service.tasksService.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), userId, [USER_ROLES.TYPIST], offset, @@ -563,7 +563,7 @@ describe('TasksService', () => { const direction = 'ASC'; await expect( service.tasksService.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), userId, [ADMIN_ROLES.ADMIN, USER_ROLES.NONE], offset, @@ -623,7 +623,7 @@ describe('TasksService', () => { const direction = 'ASC'; const { tasks, total } = await service.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), externalId, [ADMIN_ROLES.ADMIN, USER_ROLES.NONE], offset, @@ -681,7 +681,7 @@ describe('TasksService', () => { const direction = 'ASC'; const { tasks, total } = await service.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), external_id, [USER_ROLES.AUTHOR], offset, @@ -753,7 +753,7 @@ describe('TasksService', () => { const direction = 'ASC'; const { tasks, total } = await service.getTasks( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), external_id, [USER_ROLES.AUTHOR], offset, @@ -839,7 +839,7 @@ describe('changeCheckoutPermission', () => { NotificationhubService, ); await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [{ typistName: 'typist-user-2', typistUserId: typistUserId_2 }], 'author-user-external-id', @@ -856,7 +856,7 @@ describe('changeCheckoutPermission', () => { const resultTask = await getTask(source, taskId); // 通知処理が想定通りの引数で呼ばれているか確認 expect(NotificationHubService.notify).toHaveBeenCalledWith( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), [`user_${typistUserId_2}`], { authorId: 'MY_AUTHOR_ID', @@ -922,7 +922,7 @@ describe('changeCheckoutPermission', () => { NotificationhubService, ); await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [{ typistName: 'USER_GROUP_B', typistGroupId: userGroupId_2 }], 'author-user-external-id', @@ -940,7 +940,7 @@ describe('changeCheckoutPermission', () => { const resultTask = await getTask(source, taskId); // 通知処理が想定通りの引数で呼ばれているか確認 expect(NotificationHubService.notify).toHaveBeenCalledWith( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), [`user_${typistUserId_2}`], { authorId: 'MY_AUTHOR_ID', @@ -992,7 +992,7 @@ describe('changeCheckoutPermission', () => { await createCheckoutPermissions(source, taskId, undefined, userGroupId); const service = module.get(TasksService); await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [], 'author-user-external-id', @@ -1045,7 +1045,7 @@ describe('changeCheckoutPermission', () => { try { await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [{ typistName: 'not-exist-user', typistUserId: 999 }], 'author-user-external-id', @@ -1111,7 +1111,7 @@ describe('changeCheckoutPermission', () => { try { await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [{ typistName: 'not-verified-user', typistUserId: typistUserId_2 }], 'author-user-external-id', @@ -1171,7 +1171,7 @@ describe('changeCheckoutPermission', () => { try { await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [{ typistName: 'not-exist-user-group', typistGroupId: 999 }], 'author-user-external-id', @@ -1213,7 +1213,7 @@ describe('changeCheckoutPermission', () => { try { await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [{ typistName: 'typist-user', typistUserId: typistUserId }], 'author-user-external-id', @@ -1265,7 +1265,7 @@ describe('changeCheckoutPermission', () => { try { await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [{ typistName: 'typist-user', typistUserId: typistUserId }], 'author-user-external-id', @@ -1317,7 +1317,7 @@ describe('changeCheckoutPermission', () => { try { await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [{ typistName: 'typist-user', typistUserId: typistUserId }], 'author-user-external-id', @@ -1383,7 +1383,7 @@ describe('changeCheckoutPermission', () => { try { await service.changeCheckoutPermission( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, [{ typistName: 'typist-user-2', typistUserId: typistUserId_2 }], 'author-user-external-id', @@ -1460,7 +1460,7 @@ describe('checkout', () => { const initTask = await getTask(source, taskId); await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['typist'], 'typist-user-external-id', @@ -1520,7 +1520,7 @@ describe('checkout', () => { const initTask = await getTask(source, taskId); await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['typist'], 'typist-user-external-id', @@ -1573,7 +1573,7 @@ describe('checkout', () => { const initTask = await getTask(source, taskId); await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['typist'], 'typist-user-external-id', @@ -1625,7 +1625,7 @@ describe('checkout', () => { const service = module.get(TasksService); try { await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['typist'], 'typist-user-external-id', @@ -1672,7 +1672,7 @@ describe('checkout', () => { const service = module.get(TasksService); try { await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['typist'], 'typist-user-external-id', @@ -1733,7 +1733,7 @@ describe('checkout', () => { try { await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), audioFileId, ['typist'], 'typist-user-external-id', @@ -1798,7 +1798,7 @@ describe('checkout', () => { const service = module.get(TasksService); await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 2, ['typist'], 'typist-user-external-id2', @@ -1839,7 +1839,7 @@ describe('checkout', () => { const service = module.get(TasksService); expect( await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['author'], 'author-user-external-id', @@ -1873,7 +1873,7 @@ describe('checkout', () => { expect( await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['author'], 'author-user-external-id', @@ -1896,7 +1896,7 @@ describe('checkout', () => { const service = module.get(TasksService); try { await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['author'], 'author-user-external-id', @@ -1937,7 +1937,7 @@ describe('checkout', () => { const service = module.get(TasksService); try { await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['author'], 'author-user-external-id', @@ -1968,7 +1968,7 @@ describe('checkout', () => { const service = module.get(TasksService); try { await service.checkout( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, ['none'], 'none-user-external-id', @@ -2043,7 +2043,7 @@ describe('checkin', () => { const initTask = await getTask(source, taskId); await service.checkin( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, 'typist-user-external-id', ); @@ -2089,7 +2089,11 @@ describe('checkin', () => { const service = module.get(TasksService); await expect( - service.checkin(makeContext('trackingId'), 1, 'typist-user-external-id'), + service.checkin( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + 1, + 'typist-user-external-id', + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST), ); @@ -2137,7 +2141,11 @@ describe('checkin', () => { const service = module.get(TasksService); await expect( - service.checkin(makeContext('trackingId'), 1, 'typist-user-external-id'), + service.checkin( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + 1, + 'typist-user-external-id', + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST), ); @@ -2169,7 +2177,11 @@ describe('checkin', () => { const service = module.get(TasksService); await expect( - service.checkin(makeContext('trackingId'), 1, 'typist-user-external-id'), + service.checkin( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + 1, + 'typist-user-external-id', + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010603'), HttpStatus.NOT_FOUND), ); @@ -2231,7 +2243,7 @@ describe('suspend', () => { const service = module.get(TasksService); await service.suspend( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, 'typist-user-external-id', ); @@ -2276,7 +2288,11 @@ describe('suspend', () => { const service = module.get(TasksService); await expect( - service.suspend(makeContext('trackingId'), 1, 'typist-user-external-id'), + service.suspend( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + 1, + 'typist-user-external-id', + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST), ); @@ -2324,7 +2340,11 @@ describe('suspend', () => { const service = module.get(TasksService); await expect( - service.checkin(makeContext('trackingId'), 1, 'typist-user-external-id'), + service.checkin( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + 1, + 'typist-user-external-id', + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST), ); @@ -2356,7 +2376,11 @@ describe('suspend', () => { const service = module.get(TasksService); await expect( - service.checkin(makeContext('trackingId'), 1, 'typist-user-external-id'), + service.checkin( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + 1, + 'typist-user-external-id', + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010603'), HttpStatus.NOT_FOUND), ); @@ -2419,7 +2443,7 @@ describe('cancel', () => { const service = module.get(TasksService); await service.cancel( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, 'typist-user-external-id', ['typist', 'standard'], @@ -2468,7 +2492,7 @@ describe('cancel', () => { const service = module.get(TasksService); await service.cancel( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, 'typist-user-external-id', ['typist', 'standard'], @@ -2520,7 +2544,7 @@ describe('cancel', () => { const service = module.get(TasksService); await service.cancel( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, 'typist-user-external-id', ['admin', 'author'], @@ -2571,7 +2595,7 @@ describe('cancel', () => { const service = module.get(TasksService); await service.cancel( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, 'typist-user-external-id', ['admin', 'author'], @@ -2620,10 +2644,12 @@ describe('cancel', () => { const service = module.get(TasksService); await expect( - service.cancel(makeContext('trackingId'), 1, 'typist-user-external-id', [ - 'admin', - 'author', - ]), + service.cancel( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + 1, + 'typist-user-external-id', + ['admin', 'author'], + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST), ); @@ -2671,10 +2697,12 @@ describe('cancel', () => { const service = module.get(TasksService); await expect( - service.cancel(makeContext('trackingId'), 1, 'typist-user-external-id', [ - 'typist', - 'standard', - ]), + service.cancel( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + 1, + 'typist-user-external-id', + ['typist', 'standard'], + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010601'), HttpStatus.BAD_REQUEST), ); @@ -2706,10 +2734,12 @@ describe('cancel', () => { const service = module.get(TasksService); await expect( - service.cancel(makeContext('trackingId'), 1, 'typist-user-external-id', [ - 'typist', - 'standard', - ]), + service.cancel( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + 1, + 'typist-user-external-id', + ['typist', 'standard'], + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010603'), HttpStatus.NOT_FOUND), ); @@ -2774,7 +2804,7 @@ describe('cancel', () => { NotificationhubService, ); await service.cancel( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, 'typist-user-external-id', ['typist', 'standard'], @@ -2791,7 +2821,7 @@ describe('cancel', () => { expect(permisions[0].user_id).toEqual(typistUserId); // 通知処理が想定通りの引数で呼ばれているか確認 expect(NotificationHubService.notify).toHaveBeenCalledWith( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), [`user_${typistUserId}`], { authorId: 'AUTHOR_ID', @@ -2884,7 +2914,7 @@ describe('cancel', () => { NotificationhubService, ); await service.cancel( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, external_id, role.split(' ') as Roles[], @@ -2901,7 +2931,7 @@ describe('cancel', () => { expect(permisions[0].user_id).toEqual(autoRoutingTypistUserId); // 通知処理が想定通りの引数で呼ばれているか確認 expect(NotificationHubService.notify).toHaveBeenCalledWith( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), [`user_${autoRoutingTypistUserId}`], { authorId: 'AUTHOR_ID', @@ -2956,7 +2986,7 @@ describe('cancel', () => { NotificationhubService, ); await service.cancel( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), 1, external_id, role.split(' ') as Roles[], @@ -3030,7 +3060,7 @@ describe('backup', () => { const service = module.get(TasksService); await service.backup( - makeContext(admin.external_id), + makeContext(admin.external_id, 'xxx.xxx.xxx.xxx', 'requestId'), audioFileId, admin.external_id, ); @@ -3082,7 +3112,7 @@ describe('backup', () => { const service = module.get(TasksService); await service.backup( - makeContext(admin.external_id), + makeContext(admin.external_id, 'xxx.xxx.xxx.xxx', 'requestId'), audioFileId, admin.external_id, ); @@ -3135,7 +3165,7 @@ describe('backup', () => { try { await service.backup( - makeContext(admin.external_id), + makeContext(admin.external_id, 'xxx.xxx.xxx.xxx', 'requestId'), audioFileId, admin.external_id, ); @@ -3190,7 +3220,7 @@ describe('backup', () => { try { await service.backup( - makeContext(admin.external_id), + makeContext(admin.external_id, 'xxx.xxx.xxx.xxx', 'requestId'), 9999, // 存在しないタスクID admin.external_id, ); @@ -3251,7 +3281,7 @@ describe('backup', () => { try { await service.backup( - makeContext(admin.external_id), + makeContext(admin.external_id, 'xxx.xxx.xxx.xxx', 'requestId'), audioFileId, admin.external_id, ); @@ -3344,7 +3374,11 @@ describe('getNextTask', () => { await createCheckoutPermissions(source, taskId2, typistUserId); const service = module.get(TasksService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const nextAudioFileId = await service.getNextTask( context, @@ -3416,7 +3450,11 @@ describe('getNextTask', () => { await createCheckoutPermissions(source, taskId2, typistUserId); const service = module.get(TasksService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const nextAudioFileId = await service.getNextTask( context, @@ -3488,7 +3526,11 @@ describe('getNextTask', () => { await createCheckoutPermissions(source, taskId2, typistUserId); const service = module.get(TasksService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const nextAudioFileId = await service.getNextTask( context, @@ -3560,7 +3602,11 @@ describe('getNextTask', () => { await createCheckoutPermissions(source, taskId2, typistUserId); const service = module.get(TasksService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const nextAudioFileId = await service.getNextTask( context, @@ -3632,7 +3678,11 @@ describe('getNextTask', () => { await createCheckoutPermissions(source, taskId2, typistUserId); const service = module.get(TasksService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const nextAudioFileId = await service.getNextTask( context, @@ -3680,7 +3730,11 @@ describe('getNextTask', () => { await createCheckoutPermissions(source, taskId1, typistUserId); const service = module.get(TasksService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const nextAudioFileId = await service.getNextTask( context, @@ -3727,7 +3781,11 @@ describe('getNextTask', () => { await createCheckoutPermissions(source, taskId1, typistUserId); const service = module.get(TasksService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 実行結果が正しいか確認 try { diff --git a/dictation_server/src/features/templates/templates.controller.ts b/dictation_server/src/features/templates/templates.controller.ts index 08a77d4..d07db64 100644 --- a/dictation_server/src/features/templates/templates.controller.ts +++ b/dictation_server/src/features/templates/templates.controller.ts @@ -3,6 +3,7 @@ import { Get, HttpException, HttpStatus, + Logger, Req, UseGuards, } from '@nestjs/common'; @@ -21,13 +22,14 @@ import { RoleGuard } from '../../common/guards/role/roleguards'; import { ADMIN_ROLES } from '../../constants'; import { retrieveAuthorizationToken } from '../../common/http/helper'; import { Request } from 'express'; -import { makeContext } from '../../common/log'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { TemplatesService } from './templates.service'; import { makeErrorResponse } from '../../common/error/makeErrorResponse'; @ApiTags('templates') @Controller('templates') export class TemplatesController { + private readonly logger = new Logger(TemplatesController.name); constructor(private readonly templatesService: TemplatesService) {} @ApiResponse({ @@ -63,6 +65,22 @@ export class TemplatesController { HttpStatus.UNAUTHORIZED, ); } + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -72,7 +90,9 @@ export class TemplatesController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); + const templates = await this.templatesService.getTemplates(context, userId); return { templates }; diff --git a/dictation_server/src/features/templates/templates.service.spec.ts b/dictation_server/src/features/templates/templates.service.spec.ts index d3b0160..21abe24 100644 --- a/dictation_server/src/features/templates/templates.service.spec.ts +++ b/dictation_server/src/features/templates/templates.service.spec.ts @@ -35,7 +35,11 @@ describe('getTemplates', () => { const service = module.get(TemplatesService); // 第五階層のアカウント作成 const { account, admin } = await makeTestAccount(source, { tier: 5 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const template1 = await createTemplateFile( source, @@ -76,7 +80,11 @@ describe('getTemplates', () => { const service = module.get(TemplatesService); // 第五階層のアカウント作成 const { admin } = await makeTestAccount(source, { tier: 5 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); const templates = await service.getTemplates(context, admin.external_id); @@ -94,7 +102,11 @@ describe('getTemplates', () => { const service = module.get(TemplatesService); // 第五階層のアカウント作成 const { admin } = await makeTestAccount(source, { tier: 5 }); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //DBアクセスに失敗するようにする const typistGroupService = module.get( diff --git a/dictation_server/src/features/terms/terms.controller.ts b/dictation_server/src/features/terms/terms.controller.ts index 459ce27..6c9e8ac 100644 --- a/dictation_server/src/features/terms/terms.controller.ts +++ b/dictation_server/src/features/terms/terms.controller.ts @@ -1,14 +1,24 @@ -import { Controller, HttpStatus, Get } from '@nestjs/common'; +import { + Controller, + HttpStatus, + Get, + Logger, + HttpException, + Req, +} from '@nestjs/common'; import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { TermsService } from '../terms/terms.service'; import { ErrorResponse } from '../../common/error/types/types'; -import { makeContext } from '../../common/log'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { GetTermsInfoResponse } from './types/types'; -import { v4 as uuidv4 } from 'uuid'; +import { makeErrorResponse } from '../../common/error/makeErrorResponse'; + +import { Request } from 'express'; @ApiTags('terms') @Controller('terms') export class TermsController { + private readonly logger = new Logger(TermsController.name); constructor( private readonly termsService: TermsService, //private readonly cryptoService: CryptoService, ) {} @@ -25,8 +35,24 @@ export class TermsController { type: ErrorResponse, }) @ApiOperation({ operationId: 'getTermsInfo' }) - async getTermsInfo(): Promise { - const context = makeContext(uuidv4()); + async getTermsInfo(@Req() req: Request): Promise { + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const termsInfo = await this.termsService.getTermsInfo(context); diff --git a/dictation_server/src/features/terms/terms.service.spec.ts b/dictation_server/src/features/terms/terms.service.spec.ts index 6ff1176..a41af4b 100644 --- a/dictation_server/src/features/terms/terms.service.spec.ts +++ b/dictation_server/src/features/terms/terms.service.spec.ts @@ -39,7 +39,7 @@ describe('利用規約取得', () => { await createTermInfo(source, 'DPA', 'v1.0'); await createTermInfo(source, 'DPA', 'v1.2'); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const result = await service.getTermsInfo(context); expect(result[0].documentType).toBe('EULA'); @@ -55,7 +55,7 @@ describe('利用規約取得', () => { const module = await makeTestingModule(source); if (!module) fail(); const service = module.get(TermsService); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getTermsInfo(context)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -70,7 +70,7 @@ describe('利用規約取得', () => { if (!module) fail(); const service = module.get(TermsService); await createTermInfo(source, 'DPA', 'v1.0'); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getTermsInfo(context)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -85,7 +85,7 @@ describe('利用規約取得', () => { if (!module) fail(); const service = module.get(TermsService); await createTermInfo(source, 'PrivacyNotice', 'v1.0'); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getTermsInfo(context)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -100,7 +100,7 @@ describe('利用規約取得', () => { if (!module) fail(); const service = module.get(TermsService); await createTermInfo(source, 'EULA', 'v1.0'); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.getTermsInfo(context)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), diff --git a/dictation_server/src/features/users/users.controller.ts b/dictation_server/src/features/users/users.controller.ts index c8cdafc..3efa943 100644 --- a/dictation_server/src/features/users/users.controller.ts +++ b/dictation_server/src/features/users/users.controller.ts @@ -5,6 +5,7 @@ import { HttpException, HttpStatus, Ip, + Logger, Post, Query, Req, @@ -52,13 +53,13 @@ import { } from '../../common/types/sort'; import { ADMIN_ROLES, TIERS } from '../../constants'; import { RoleGuard } from '../../common/guards/role/roleguards'; -import { makeContext } from '../../common/log'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { UserRoles } from '../../common/types/role'; -import { v4 as uuidv4 } from 'uuid'; @ApiTags('users') @Controller('users') export class UsersController { + private readonly logger = new Logger(UsersController.name); constructor( private readonly usersService: UsersService, private readonly authService: AuthService, @@ -81,8 +82,27 @@ export class UsersController { }) @ApiOperation({ operationId: 'confirmUser' }) @Post('confirm') - async confirmUser(@Body() body: ConfirmRequest): Promise { - const context = makeContext(uuidv4()); + async confirmUser( + @Body() body: ConfirmRequest, + @Req() req: Request, + ): Promise { + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.usersService.confirmUser(context, body.token); return {}; @@ -107,8 +127,25 @@ export class UsersController { @Post('confirm/initpassword') async confirmUserAndInitPassword( @Body() body: ConfirmRequest, + @Req() req: Request, ): Promise { - const context = makeContext(uuidv4()); + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.usersService.confirmUserAndInitPassword(context, body.token); return {}; } @@ -137,13 +174,29 @@ export class UsersController { @Get() async getUsers(@Req() req: Request): Promise { const accessToken = retrieveAuthorizationToken(req); - if (!accessToken) { throw new HttpException( makeErrorResponse('E000107'), HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -152,7 +205,8 @@ export class UsersController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const users = await this.usersService.getUsers(context, userId); return { users }; @@ -209,6 +263,23 @@ export class UsersController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -218,7 +289,8 @@ export class UsersController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); //ユーザ作成処理 await this.usersService.createUser( @@ -268,6 +340,23 @@ export class UsersController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -277,7 +366,8 @@ export class UsersController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); return await this.usersService.getRelations(context, userId); } @@ -322,6 +412,23 @@ export class UsersController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -330,7 +437,8 @@ export class UsersController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); //型チェック if ( @@ -386,6 +494,23 @@ export class UsersController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -394,7 +519,8 @@ export class UsersController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const { direction, paramName } = await this.usersService.getSortCriteria( context, @@ -456,6 +582,23 @@ export class UsersController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -465,7 +608,8 @@ export class UsersController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.usersService.updateUser( context, @@ -528,6 +672,23 @@ export class UsersController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -537,7 +698,8 @@ export class UsersController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.usersService.allocateLicense( context, body.userId, @@ -591,6 +753,23 @@ export class UsersController { HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -600,7 +779,8 @@ export class UsersController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.usersService.deallocateLicense(context, body.userId); return {}; @@ -628,6 +808,7 @@ export class UsersController { @Post('/accepted-version') async updateAcceptedVersion( @Body() body: UpdateAcceptedVersionRequest, + @Req() req: Request, ): Promise { const { idToken, @@ -636,7 +817,23 @@ export class UsersController { acceptedDPAVersion, } = body; - const context = makeContext(uuidv4()); + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const context = makeContext('anonymous', ip, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const verifiedIdToken = await this.authService.getVerifiedIdToken( context, @@ -685,13 +882,30 @@ export class UsersController { @UseGuards(AuthGuard) @Get('me') async getMyUser(@Req() req: Request): Promise { - const accessToken = retrieveAuthorizationToken(req) as string; + const accessToken = retrieveAuthorizationToken(req); if (!accessToken) { throw new HttpException( makeErrorResponse('E000107'), HttpStatus.UNAUTHORIZED, ); } + + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -700,7 +914,8 @@ export class UsersController { ); } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const userName = await this.usersService.getUserName(context, userId); return { userName }; } diff --git a/dictation_server/src/features/users/users.service.spec.ts b/dictation_server/src/features/users/users.service.spec.ts index cea6f31..e7bf8af 100644 --- a/dictation_server/src/features/users/users.service.spec.ts +++ b/dictation_server/src/features/users/users.service.spec.ts @@ -97,7 +97,7 @@ describe('UsersService.confirmUser', () => { // account id:1, user id: 2のトークン const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await service.confirmUser(context, token); //result const resultUser = await getUser(source, userId); @@ -141,7 +141,7 @@ describe('UsersService.confirmUser', () => { if (!module) fail(); const token = 'invalid.id.token'; const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.confirmUser(context, token)).rejects.toEqual( new HttpException(makeErrorResponse('E000101'), HttpStatus.BAD_REQUEST), ); @@ -177,7 +177,7 @@ describe('UsersService.confirmUser', () => { const service = module.get(UsersService); const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.confirmUser(context, token)).rejects.toEqual( new HttpException(makeErrorResponse('E010202'), HttpStatus.BAD_REQUEST), ); @@ -189,7 +189,7 @@ describe('UsersService.confirmUser', () => { const service = module.get(UsersService); const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw'; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect(service.confirmUser(context, token)).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -246,7 +246,7 @@ describe('UsersService.confirmUserAndInitPassword', () => { 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw'; expect( await service.confirmUserAndInitPassword( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), token, ), ).toEqual(undefined); @@ -295,7 +295,10 @@ describe('UsersService.confirmUserAndInitPassword', () => { ); const token = 'invalid.id.token'; await expect( - service.confirmUserAndInitPassword(makeContext('trackingId'), token), + service.confirmUserAndInitPassword( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + token, + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E000101'), HttpStatus.BAD_REQUEST), ); @@ -348,7 +351,10 @@ describe('UsersService.confirmUserAndInitPassword', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw'; await expect( - service.confirmUserAndInitPassword(makeContext('trackingId'), token), + service.confirmUserAndInitPassword( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + token, + ), ).rejects.toEqual( new HttpException(makeErrorResponse('E010202'), HttpStatus.BAD_REQUEST), ); @@ -398,7 +404,10 @@ describe('UsersService.confirmUserAndInitPassword', () => { const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50SWQiOjEsInVzZXJJZCI6MiwiZW1haWwiOiJ4eHhAeHh4Lnh4eCIsImlhdCI6MTAwMDAwMDAwMCwiZXhwIjo5MDAwMDAwMDAwfQ.26L6BdNg-3TbyKT62PswlJ6RPMkcTtHzlDXW2Uo9XbMPVSrl2ObcuS6EcXjFFN2DEfNTKbqX_zevIWMpHOAdLNgGhk528nLrBrNvPASqtTjvW9muxMXpjUdjRVkmVbOylBHWW3YpWL9JEbJQ7rAzWDfaIdPhMovdaxumnZt_UwnlnrdaVPLACW7tkH_laEcAU507iSiM4mqxxG8FuTs34t6PEdwRuzZAQPN2IOPYNSvGNdJYryPacSeSNZ_z1xeBYXLOLQfOBZzyTReYDOhXdikhrNUbxjgnZQlSXBCVMlZ9PH42bHfp-LJIeJzW0yqnF6oLklvJP-fo8eW0k5iDOw'; await expect( - service.confirmUserAndInitPassword(makeContext('trackingId'), token), + service.confirmUserAndInitPassword( + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), + token, + ), ).rejects.toEqual( new HttpException( makeErrorResponse('E009999'), @@ -482,7 +491,7 @@ describe('UsersService.createUser', () => { expect( await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -570,7 +579,7 @@ describe('UsersService.createUser', () => { expect( await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -661,7 +670,7 @@ describe('UsersService.createUser', () => { expect( await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -749,7 +758,7 @@ describe('UsersService.createUser', () => { expect( await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -842,7 +851,7 @@ describe('UsersService.createUser', () => { try { await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -862,7 +871,7 @@ describe('UsersService.createUser', () => { // ADB2Cに作成したユーザーを削除するメソッドが呼ばれていることを確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), ); }); @@ -929,7 +938,7 @@ describe('UsersService.createUser', () => { try { await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -954,7 +963,7 @@ describe('UsersService.createUser', () => { // ADB2Cに作成したユーザーを削除するメソッドが呼ばれていることを確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), ); }); @@ -1010,7 +1019,7 @@ describe('UsersService.createUser', () => { try { await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -1089,7 +1098,7 @@ describe('UsersService.createUser', () => { try { await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -1170,7 +1179,7 @@ describe('UsersService.createUser', () => { expect( await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -1211,7 +1220,7 @@ describe('UsersService.createUser', () => { try { await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -1307,7 +1316,7 @@ describe('UsersService.createUser', () => { try { await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -1335,7 +1344,7 @@ describe('UsersService.createUser', () => { // ADB2Cに作成したユーザーを削除するメソッドが呼ばれていることを確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), ); }); @@ -1396,7 +1405,7 @@ describe('UsersService.createUser', () => { try { await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -1422,7 +1431,7 @@ describe('UsersService.createUser', () => { // ADB2Cに作成したユーザーを削除するメソッドが呼ばれていることを確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), ); }); @@ -1488,7 +1497,7 @@ describe('UsersService.createUser', () => { try { await service.createUser( - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), adminExternalId, name, role, @@ -1512,7 +1521,7 @@ describe('UsersService.createUser', () => { // ADB2Cに作成したユーザーを削除するメソッドが呼ばれていることを確認 expect(b2cService.deleteUser).toBeCalledWith( externalId, - makeContext('trackingId'), + makeContext('trackingId', 'xxx.xxx.xxx.xxx', 'requestId'), ); }); }); @@ -1635,7 +1644,7 @@ describe('UsersService.getUsers', () => { }, ]; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect(await service.getUsers(context, externalId_author)).toEqual( expectedUsers, ); @@ -1754,7 +1763,7 @@ describe('UsersService.getUsers', () => { }, ]; - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect(await service.getUsers(context, external_id1)).toEqual( expectedUsers, ); @@ -1778,7 +1787,7 @@ describe('UsersService.getUsers', () => { prompt: false, }); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); const service = module.get(UsersService); await expect( service.getUsers(context, 'externalId_failed'), @@ -1806,7 +1815,7 @@ describe('UsersService.getUsers', () => { prompt: false, }); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); const service = module.get(UsersService); await expect(service.getUsers(context, externalId_author)).rejects.toEqual( new HttpException(makeErrorResponse('E009999'), HttpStatus.NOT_FOUND), @@ -1831,7 +1840,7 @@ describe('UsersService.updateSortCriteria', () => { configMockValue, sortCriteriaRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.updateSortCriteria( @@ -1862,7 +1871,7 @@ describe('UsersService.updateSortCriteria', () => { configMockValue, sortCriteriaRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.updateSortCriteria(context, 'AUTHOR_ID', 'ASC', 'external_id'), @@ -1894,7 +1903,7 @@ describe('UsersService.updateSortCriteria', () => { configMockValue, sortCriteriaRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.updateSortCriteria(context, 'AUTHOR_ID', 'ASC', 'external_id'), @@ -1924,7 +1933,7 @@ describe('UsersService.getSortCriteria', () => { configMockValue, sortCriteriaRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect(await service.getSortCriteria(context, 'external_id')).toEqual({ direction: 'ASC', @@ -1953,7 +1962,7 @@ describe('UsersService.getSortCriteria', () => { configMockValue, sortCriteriaRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.getSortCriteria(context, 'external_id'), @@ -1988,7 +1997,7 @@ describe('UsersService.getSortCriteria', () => { configMockValue, sortCriteriaRepositoryMockValue, ); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.getSortCriteria(context, 'external_id'), @@ -2048,7 +2057,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.updateUser( @@ -2107,7 +2116,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.updateUser( @@ -2166,7 +2175,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.updateUser( @@ -2225,7 +2234,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.updateUser( @@ -2284,7 +2293,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.updateUser( @@ -2343,7 +2352,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.updateUser( @@ -2392,7 +2401,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.updateUser( @@ -2451,7 +2460,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); expect( await service.updateUser( @@ -2510,7 +2519,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.updateUser( @@ -2570,7 +2579,7 @@ describe('UsersService.updateUser', () => { }); const service = module.get(UsersService); - const context = makeContext(`uuidv4`); + const context = makeContext(`uuidv4`, 'xxx.xxx.xxx.xxx', 'requestId'); await expect( service.updateUser( @@ -2618,7 +2627,7 @@ describe('UsersService.updateAcceptedVersion', () => { const { admin } = await makeTestAccount(source, { tier: 5, }); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const service = module.get(UsersService); await service.updateAcceptedVersion( @@ -2639,7 +2648,7 @@ describe('UsersService.updateAcceptedVersion', () => { const { admin } = await makeTestAccount(source, { tier: 4, }); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const service = module.get(UsersService); await service.updateAcceptedVersion( @@ -2662,7 +2671,7 @@ describe('UsersService.updateAcceptedVersion', () => { const { admin } = await makeTestAccount(source, { tier: 4, }); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const service = module.get(UsersService); await expect( @@ -2705,7 +2714,7 @@ describe('UsersService.getUserName', () => { try { const module = await makeTestingModule(source); if (!module) fail(); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const service = module.get(UsersService); await service.getUserName(context, 'external_id'); @@ -2800,7 +2809,7 @@ describe('UsersService.getRelations', () => { expect(workflows[3].author_id).toBe(user2); } - const context = makeContext(external_id); + const context = makeContext(external_id, 'xxx.xxx.xxx.xxx', 'requestId'); const service = module.get(UsersService); const relations = await service.getRelations(context, external_id); @@ -2863,7 +2872,7 @@ describe('UsersService.getRelations', () => { expect(workflows[0].author_id).toBe(user2); } - const context = makeContext(external_id); + const context = makeContext(external_id, 'xxx.xxx.xxx.xxx', 'requestId'); const service = module.get(UsersService); const relations = await service.getRelations(context, external_id); @@ -2889,7 +2898,7 @@ describe('UsersService.getRelations', () => { try { const module = await makeTestingModule(source); if (!module) fail(); - const context = makeContext(uuidv4()); + const context = makeContext(uuidv4(), 'xxx.xxx.xxx.xxx', 'requestId'); const service = module.get(UsersService); await service.getRelations(context, 'external_id'); diff --git a/dictation_server/src/features/users/users.service.ts b/dictation_server/src/features/users/users.service.ts index e26a1c1..542e8d3 100644 --- a/dictation_server/src/features/users/users.service.ts +++ b/dictation_server/src/features/users/users.service.ts @@ -545,12 +545,7 @@ export class UsersService { // DBから取得したユーザーの外部IDをもとにADB2Cからユーザーを取得する const externalIds = dbUsers.map((x) => x.external_id); - const trackingId = new Context(context.trackingId); - const adb2cUsers = await this.adB2cService.getUsers( - // TODO: 外部連携以外のログ強化時に、ContollerからContextを取得するように修正する - trackingId, - externalIds, - ); + const adb2cUsers = await this.adB2cService.getUsers(context, externalIds); // DBから取得した各ユーザーをもとにADB2C情報をマージしライセンス情報を算出 const users = dbUsers.map((dbUser): User => { diff --git a/dictation_server/src/features/workflows/workflows.controller.ts b/dictation_server/src/features/workflows/workflows.controller.ts index ff312e1..4470f89 100644 --- a/dictation_server/src/features/workflows/workflows.controller.ts +++ b/dictation_server/src/features/workflows/workflows.controller.ts @@ -4,6 +4,7 @@ import { Get, HttpException, HttpStatus, + Logger, Param, Post, Req, @@ -33,13 +34,14 @@ import { RoleGuard } from '../../common/guards/role/roleguards'; import { ADMIN_ROLES } from '../../constants'; import { retrieveAuthorizationToken } from '../../common/http/helper'; import { Request } from 'express'; -import { makeContext } from '../../common/log'; +import { makeContext, retrieveRequestId, retrieveIp } from '../../common/log'; import { WorkflowsService } from './workflows.service'; import { makeErrorResponse } from '../../common/error/makeErrorResponse'; @ApiTags('workflows') @Controller('workflows') export class WorkflowsController { + private readonly logger = new Logger(WorkflowsController.name); constructor(private readonly workflowsService: WorkflowsService) {} @ApiResponse({ @@ -75,6 +77,21 @@ export class WorkflowsController { HttpStatus.UNAUTHORIZED, ); } + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -84,7 +101,8 @@ export class WorkflowsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); const workflows = await this.workflowsService.getWorkflows(context, userId); @@ -134,6 +152,21 @@ export class WorkflowsController { HttpStatus.UNAUTHORIZED, ); } + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -143,7 +176,8 @@ export class WorkflowsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.workflowsService.createWorkflow( context, userId, @@ -201,6 +235,21 @@ export class WorkflowsController { HttpStatus.UNAUTHORIZED, ); } + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -210,7 +259,8 @@ export class WorkflowsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.workflowsService.updateWorkflow( context, userId, @@ -267,6 +317,21 @@ export class WorkflowsController { HttpStatus.UNAUTHORIZED, ); } + const ip = retrieveIp(req); + if (!ip) { + throw new HttpException( + makeErrorResponse('E000401'), + HttpStatus.UNAUTHORIZED, + ); + } + + const requestId = retrieveRequestId(req); + if (!requestId) { + throw new HttpException( + makeErrorResponse('E000501'), + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } const decodedAccessToken = jwt.decode(accessToken, { json: true }); if (!decodedAccessToken) { throw new HttpException( @@ -276,7 +341,8 @@ export class WorkflowsController { } const { userId } = decodedAccessToken as AccessToken; - const context = makeContext(userId); + const context = makeContext(userId, requestId); + this.logger.log(`[${context.getTrackingId()}] ip : ${ip}`); await this.workflowsService.deleteWorkflow(context, userId, workflowId); return {}; } diff --git a/dictation_server/src/features/workflows/workflows.service.spec.ts b/dictation_server/src/features/workflows/workflows.service.spec.ts index e868605..208b1f7 100644 --- a/dictation_server/src/features/workflows/workflows.service.spec.ts +++ b/dictation_server/src/features/workflows/workflows.service.spec.ts @@ -118,7 +118,11 @@ describe('getWorkflows', () => { await createWorkflowTypist(source, workflow3.id, undefined, userGroupId); const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //作成したデータを確認 { @@ -190,7 +194,11 @@ describe('getWorkflows', () => { const { admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); overrideAdB2cService(service, { getUsers: async () => [], @@ -212,7 +220,11 @@ describe('getWorkflows', () => { const { account, admin } = await makeTestAccount(source, { tier: 5 }); const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //DBアクセスに失敗するようにする const templatesService = module.get( @@ -292,7 +304,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createWorkflow( context, @@ -357,7 +373,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createWorkflow( context, @@ -421,7 +441,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createWorkflow( context, @@ -479,7 +503,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.createWorkflow( context, @@ -543,7 +571,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); // 同一AuthorIDのワークフローを作成 await service.createWorkflow( @@ -616,7 +648,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { await service.createWorkflow( @@ -673,7 +709,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -734,7 +774,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -794,7 +838,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -856,7 +904,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -924,7 +976,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -986,7 +1042,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -1057,7 +1117,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -1124,7 +1188,11 @@ describe('createWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //DBアクセスに失敗するようにする const templatesService = module.get( @@ -1243,7 +1311,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.updateWorkflow( context, @@ -1333,7 +1405,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.updateWorkflow( context, @@ -1422,7 +1498,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.updateWorkflow( context, @@ -1505,7 +1585,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.updateWorkflow( context, @@ -1608,7 +1692,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.updateWorkflow( context, @@ -1687,7 +1775,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -1730,7 +1822,11 @@ describe('updateWorkflow', () => { }); const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -1804,7 +1900,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -1873,7 +1973,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -1941,7 +2045,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -2016,7 +2124,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -2097,7 +2209,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -2172,7 +2288,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -2241,7 +2361,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -2310,7 +2434,11 @@ describe('updateWorkflow', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //DBアクセスに失敗するようにする const workflowsRepositoryService = module.get( @@ -2401,7 +2529,11 @@ describe('deleteWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.deleteWorkflow(context, admin.external_id, workflow.id); @@ -2452,7 +2584,11 @@ describe('deleteWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); await service.deleteWorkflow(context, admin.external_id, workflow1.id); @@ -2503,7 +2639,11 @@ describe('deleteWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -2578,7 +2718,11 @@ describe('deleteWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //実行結果を確認 try { @@ -2633,7 +2777,11 @@ describe('deleteWorkflows', () => { } const service = module.get(WorkflowsService); - const context = makeContext(admin.external_id); + const context = makeContext( + admin.external_id, + 'xxx.xxx.xxx.xxx', + 'requestId', + ); //DBアクセスに失敗するようにする const workflowsRepositoryService = module.get(