Merged PR 895: API修正(アカウント作成系)

## 概要
[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のクエリ
- 既存のクエリに修正はなし

## 動作確認状況
- ローカルで確認
- 行った修正がデグレを発生させていないことを確認できるか
  - 具体的にどのような確認をしたか
    - 既存テストが通ることを確認
    - パートナーアカウント作成のテストにメール送信内容のチェックを追加
    - ソート条件が作成・削除されていることを確認するテストを追加

## 補足
- 相談、参考資料などがあれば
This commit is contained in:
saito.k 2024-05-14 07:18:57 +00:00
parent dfdc6a33ad
commit fe5e8b8e1c
5 changed files with 90 additions and 3 deletions

View File

@ -454,7 +454,6 @@ export const createJobNumber = async (
});
};
// job_numberテーブルのレコードを更新する
export const updateJobNumber = async (
datasource: DataSource,

View File

@ -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';

View File

@ -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);
// コンテナ削除メソッドが呼ばれているか確認

View File

@ -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,

View File

@ -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 {