From fe5e8b8e1c87731e3a3ebd2a8e8075d1df41adde Mon Sep 17 00:00:00 2001 From: "saito.k" Date: Tue, 14 May 2024 07:18:57 +0000 Subject: [PATCH] =?UTF-8?q?Merged=20PR=20895:=20API=E4=BF=AE=E6=AD=A3(?= =?UTF-8?q?=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3=E3=83=88=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E7=B3=BB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task4043: API修正(アカウント作成系)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/4043) - アカウント作成時にJobNumberの初期値を設定するように修正 - パートナーアカウント作成時にJobNumberの初期値を設定するように修正 - リカバリ処理にJobNumberのレコード削除を追加 - テスト修正 ## レビューポイント - JobNumber作成処理の追加する箇所に問題はないか - テストケースに不足はないか ## クエリの変更 - Repositoryを変更し、クエリが変更された場合は変更内容を確認する - Before/Afterのクエリ - 既存のクエリに修正はなし ## 動作確認状況 - ローカルで確認 - 行った修正がデグレを発生させていないことを確認できるか - 具体的にどのような確認をしたか - 既存テストが通ることを確認 - パートナーアカウント作成のテストにメール送信内容のチェックを追加 - ソート条件が作成・削除されていることを確認するテストを追加 ## 補足 - 相談、参考資料などがあれば --- dictation_server/src/common/test/utility.ts | 1 - dictation_server/src/constants/index.ts | 13 +++++ .../accounts/accounts.service.spec.ts | 53 ++++++++++++++++++- .../accounts/accounts.repository.service.ts | 23 ++++++++ .../tasks/tasks.repository.service.ts | 3 +- 5 files changed, 90 insertions(+), 3 deletions(-) diff --git a/dictation_server/src/common/test/utility.ts b/dictation_server/src/common/test/utility.ts index d784663..2d531a4 100644 --- a/dictation_server/src/common/test/utility.ts +++ b/dictation_server/src/common/test/utility.ts @@ -454,7 +454,6 @@ export const createJobNumber = async ( }); }; - // job_numberテーブルのレコードを更新する export const updateJobNumber = async ( datasource: DataSource, diff --git a/dictation_server/src/constants/index.ts b/dictation_server/src/constants/index.ts index 6478a26..c91dd23 100644 --- a/dictation_server/src/constants/index.ts +++ b/dictation_server/src/constants/index.ts @@ -339,3 +339,16 @@ export const STORAGE_SIZE_PER_LICENSE = 5; * @const {number} */ export const STORAGE_WARNING_THRESHOLD_PERCENT = 80; + +/** + * JobNumberの初期値 + * @const {string} + */ +export const INITIAL_JOB_NUMBER = '00000000'; + + +/** + * JobNumberの最大値 + * @const {string} + */ +export const MAX_JOB_NUMBER = '99999999'; diff --git a/dictation_server/src/features/accounts/accounts.service.spec.ts b/dictation_server/src/features/accounts/accounts.service.spec.ts index dcad6ac..1dc617b 100644 --- a/dictation_server/src/features/accounts/accounts.service.spec.ts +++ b/dictation_server/src/features/accounts/accounts.service.spec.ts @@ -49,6 +49,7 @@ import { AccountsService } from './accounts.service'; import { Context, makeContext } from '../../common/log'; import { ADB2C_SIGN_IN_TYPE, + INITIAL_JOB_NUMBER, LICENSE_ALLOCATED_STATUS, LICENSE_ISSUE_STATUS, LICENSE_TYPE, @@ -223,6 +224,16 @@ describe('createAccount', () => { expect(user?.account_id).toBe(accountId); expect(user?.role).toBe(role); + // jobNumberの初期値が正しく設定されているか確認 + const jobNumber = await getJobNumber(source, accountId); + expect(jobNumber?.job_number).toBe(INITIAL_JOB_NUMBER); + + // sortCriteriaが正しく設定されているか確認 + const sortCriteria = await getSortCriteria(source, user?.id ?? 0); + expect(sortCriteria?.user_id).toBe(user?.id); + expect(sortCriteria?.direction).toBe('ASC'); + expect(sortCriteria?.parameter).toBe('JOB_NUMBER'); + // 想定通りのメールが送られているか確認 expect(_subject).toBe('User Registration Notification [U-102]'); expect( @@ -878,7 +889,26 @@ describe('createPartnerAccount', () => { }, }); - overrideSendgridService(service, {}); + let _subject = ''; + let _url: string | undefined = ''; + overrideSendgridService(service, { + sendMail: async ( + context: Context, + to: string[], + cc: string[], + from: string, + subject: string, + text: string, + html: string, + ) => { + const urlPattern = /https?:\/\/[^\s]+/g; + const urls = text.match(urlPattern); + const url = urls?.pop(); + + _subject = subject; + _url = url; + }, + }); overrideBlobstorageService(service, { createContainer: async () => { @@ -918,6 +948,19 @@ describe('createPartnerAccount', () => { expect(createdAccount?.tier).toBe(2); expect(createdAccount?.primary_admin_user_id).toBe(createdUser?.id); expect(createdAccount?.secondary_admin_user_id).toBe(null); + const sortCriteria = await getSortCriteria(source, createdUser?.id ?? 0); + expect(sortCriteria).not.toBeNull(); + expect(sortCriteria?.user_id).toBe(createdUser?.id); + expect(sortCriteria?.direction).toBe('ASC'); + expect(sortCriteria?.parameter).toBe('JOB_NUMBER'); + const jobNumber = await getJobNumber(source, accountId); + expect(jobNumber?.job_number).toBe(INITIAL_JOB_NUMBER); + + // 想定通りのメールが送られているか確認 + expect(_subject).toBe('User Registration Notification [U-114]'); + expect( + _url?.startsWith('http://localhost:8081/mail-confirm/user?verify='), + ).toBeTruthy(); } }); @@ -1308,6 +1351,10 @@ describe('createPartnerAccount', () => { expect(users.length).toBe(2); expect(users[0].external_id).toBe(parentExternalId); expect(users[1].external_id).toBe(partnerExternalId); + const sortCriteria = await getSortCriteriaList(source); + expect(sortCriteria.length).toBe(2); + const jobNumber = await getJobNumber(source, accounts[1].id); + expect(jobNumber?.job_number).toBe(INITIAL_JOB_NUMBER); // ADB2Cユーザー削除メソッドが呼ばれているか確認 expect(b2cService.deleteUser).toBeCalledWith(partnerExternalId, context); } @@ -1487,6 +1534,10 @@ describe('createPartnerAccount', () => { expect(users.length).toBe(2); expect(users[0].external_id).toBe(parentExternalId); expect(users[1].external_id).toBe(partnerExternalId); + const sortCriteria = await getSortCriteriaList(source); + expect(sortCriteria.length).toBe(2); + const jobNumber = await getJobNumber(source, accounts[1].id); + expect(jobNumber?.job_number).toBe(INITIAL_JOB_NUMBER); // ADB2Cユーザー削除メソッドが呼ばれているか確認 expect(b2cService.deleteUser).toBeCalledWith(partnerExternalId, context); // コンテナ削除メソッドが呼ばれているか確認 diff --git a/dictation_server/src/repositories/accounts/accounts.repository.service.ts b/dictation_server/src/repositories/accounts/accounts.repository.service.ts index ecd571f..06ea6ef 100644 --- a/dictation_server/src/repositories/accounts/accounts.repository.service.ts +++ b/dictation_server/src/repositories/accounts/accounts.repository.service.ts @@ -26,6 +26,7 @@ import { getTaskListSortableAttribute, } from '../../common/types/sort/util'; import { + INITIAL_JOB_NUMBER, LICENSE_ALLOCATED_STATUS, LICENSE_EXPIRATION_THRESHOLD_DAYS, LICENSE_ISSUE_STATUS, @@ -210,6 +211,20 @@ export class AccountsRepositoryService { throw new Error(`invalid update. result.affected=${result.affected}`); } + // job_numberの初期値を設定 + const jobNumberRepo = entityManager.getRepository(JobNumber); + const initialJobNumber = jobNumberRepo.create({ + account_id: persistedAccount.id, + job_number: INITIAL_JOB_NUMBER, + }); + await insertEntity( + JobNumber, + jobNumberRepo, + initialJobNumber, + this.isCommentOut, + context, + ); + // ユーザーのタスクソート条件を作成 const sortCriteria = new SortCriteria(); { @@ -245,6 +260,14 @@ export class AccountsRepositoryService { const accountsRepo = entityManager.getRepository(Account); const usersRepo = entityManager.getRepository(User); const sortCriteriaRepo = entityManager.getRepository(SortCriteria); + const jobNumberRepo = entityManager.getRepository(JobNumber); + // JobNumberを削除 + await deleteEntity( + jobNumberRepo, + { account_id: accountId }, + this.isCommentOut, + context, + ); // ソート条件を削除 await deleteEntity( sortCriteriaRepo, diff --git a/dictation_server/src/repositories/tasks/tasks.repository.service.ts b/dictation_server/src/repositories/tasks/tasks.repository.service.ts index 1e30896..aef734f 100644 --- a/dictation_server/src/repositories/tasks/tasks.repository.service.ts +++ b/dictation_server/src/repositories/tasks/tasks.repository.service.ts @@ -12,6 +12,7 @@ import { import { Task } from './entity/task.entity'; import { ADMIN_ROLES, + MAX_JOB_NUMBER, NODE_ENV_TEST, TASK_STATUS, USER_ROLES, @@ -921,7 +922,7 @@ export class TasksRepositoryService { } let newJobNumber: string = ''; - if (currentJobNumberData.job_number === '99999999') { + if (currentJobNumberData.job_number === MAX_JOB_NUMBER) { // 末尾なら00000001に戻る newJobNumber = '00000001'; } else {