Merged PR 471: DBマイグレーション

## 概要
[Task2805: DBマイグレーション](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2805)

利用規約情報管理テーブルを作成しました。
ユーザーテーブル・ユーザー退避テーブルの同意済み利用規約バージョンカラムを、EULA、DPA用に分割しました。
また、ユーザーテーブルの変更に伴うソースコード修正を実施しました。

## レビューポイント
DB定義の認識が合っているか。

## UIの変更
なし

## 動作確認状況
migration up/downでの動作を確認
既存UTがすべて正常に動作することを確認

## 補足
なし
This commit is contained in:
oura.a 2023-10-10 04:59:57 +00:00
parent 7682c41ba5
commit 0e57d0cb81
19 changed files with 137 additions and 52 deletions

View File

@ -0,0 +1,13 @@
-- +migrate Up
CREATE TABLE IF NOT EXISTS `terms` (
`id` BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT '通番',
`document_type` VARCHAR(255) NOT NULL COMMENT '規約種別EULA/DPA',
`version` VARCHAR(255) NOT NULL COMMENT 'バージョン',
`created_by` VARCHAR(255) COMMENT '作成者',
`created_at` TIMESTAMP DEFAULT now() COMMENT '作成時刻',
`updated_by` VARCHAR(255) COMMENT '更新者',
`updated_at` TIMESTAMP DEFAULT now() on UPDATE now() COMMENT '更新時刻'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
-- +migrate Down
DROP TABLE IF EXISTS `terms`;

View File

@ -0,0 +1,13 @@
-- +migrate Up
ALTER TABLE `users` CHANGE COLUMN `accepted_terms_version` `accepted_eula_version` VARCHAR(255) COMMENT '同意済み利用規約バージョン(EULA)',
ADD COLUMN `accepted_dpa_version` VARCHAR(255) COMMENT '同意済み利用規約バージョン(DPA)' AFTER `accepted_eula_version`;
ALTER TABLE `users_archive` CHANGE COLUMN `accepted_terms_version` `accepted_eula_version` VARCHAR(255) COMMENT '同意済み利用規約バージョン(EULA)',
ADD COLUMN `accepted_dpa_version` VARCHAR(255) COMMENT '同意済み利用規約バージョン(DPA)' AFTER `accepted_eula_version`;
-- +migrate Down
ALTER TABLE `users` CHANGE COLUMN `accepted_eula_version` `accepted_terms_version` VARCHAR(255) COMMENT '同意済み利用規約バージョン(EULA)',
DROP COLUMN `accepted_dpa_version`;
ALTER TABLE `users_archive` CHANGE COLUMN `accepted_eula_version` `accepted_terms_version` VARCHAR(255) COMMENT '同意済み利用規約バージョン(EULA)',
DROP COLUMN `accepted_dpa_version`;

View File

@ -3316,9 +3316,13 @@
"adminName": { "type": "string" },
"adminMail": { "type": "string" },
"adminPassword": { "type": "string" },
"acceptedTermsVersion": {
"acceptedEulaVersion": {
"type": "string",
"description": "同意済み利用規約のバージョン"
"description": "同意済み利用規約のバージョン(EULA)"
},
"acceptedDpaVersion": {
"type": "string",
"description": "同意済み利用規約のバージョン(DPA)"
},
"token": { "type": "string", "description": "reCAPTCHA Token" }
},
@ -3328,7 +3332,8 @@
"adminName",
"adminMail",
"adminPassword",
"acceptedTermsVersion",
"acceptedEulaVersion",
"acceptedDpaVersion",
"token"
]
},

View File

@ -236,7 +236,8 @@ export const overrideAccountsRepositoryService = <TService>(
tier: number,
adminExternalUserId: string,
adminUserRole: string,
adminUserAcceptedTermsVersion: string,
adminUserAcceptedEulaVersion: string,
adminUserAcceptedDpaVersion: string,
) => Promise<{ newAccount: Account; adminUser: User }>;
deleteAccount?: (accountId: number, userId: number) => Promise<void>;
deleteAccountAndInsertArchives?: (accountId: number) => Promise<User[]>;

View File

@ -180,7 +180,8 @@ export const makeTestAccount = async (
account_id: accountId,
role: d?.role ?? 'admin none',
author_id: d?.author_id ?? undefined,
accepted_terms_version: d?.accepted_terms_version ?? '1.0',
accepted_eula_version: d?.accepted_eula_version ?? '1.0',
accepted_dpa_version: d?.accepted_dpa_version ?? '1.0',
email_verified: d?.email_verified ?? true,
auto_renew: d?.auto_renew ?? true,
license_alert: d?.license_alert ?? true,
@ -282,7 +283,8 @@ export const makeTestUser = async (
external_id: d?.external_id ?? uuidv4(),
role: d?.role ?? `${ADMIN_ROLES.STANDARD} ${USER_ROLES.NONE}`,
author_id: d?.author_id,
accepted_terms_version: d?.accepted_terms_version,
accepted_eula_version: d?.accepted_eula_version ?? '1.0',
accepted_dpa_version: d?.accepted_dpa_version ?? '1.0',
email_verified: d?.email_verified ?? true,
auto_renew: d?.auto_renew ?? true,
license_alert: d?.license_alert ?? true,

View File

@ -109,7 +109,8 @@ export class AccountsController {
adminMail,
adminPassword,
adminName,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
} = body;
const role = USER_ROLES.NONE;
@ -124,7 +125,8 @@ export class AccountsController {
adminPassword,
adminName,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
return {};

View File

@ -103,7 +103,8 @@ describe('createAccount', () => {
const password = 'dummy_password';
const username = 'dummy_username';
const role = 'none';
const acceptedTermsVersion = '1.0.0';
const acceptedEulaVersion = '1.0.0';
const acceptedDpaVersion = '1.0.0';
overrideAdB2cService(service, {
createUser: async () => {
@ -134,7 +135,8 @@ describe('createAccount', () => {
password,
username,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
// 作成したアカウントのIDが返ってくるか確認
expect(accountId).toBe(1);
@ -150,7 +152,8 @@ describe('createAccount', () => {
expect(account.tier).toBe(TIERS.TIER5);
expect(account.primary_admin_user_id).toBe(user.id);
expect(account.secondary_admin_user_id).toBe(null);
expect(user.accepted_terms_version).toBe(acceptedTermsVersion);
expect(user.accepted_eula_version).toBe(acceptedEulaVersion);
expect(user.accepted_dpa_version).toBe(acceptedDpaVersion);
expect(user.account_id).toBe(accountId);
expect(user.role).toBe(role);
});
@ -181,7 +184,8 @@ describe('createAccount', () => {
const password = 'dummy_password';
const username = 'dummy_username';
const role = 'admin none';
const acceptedTermsVersion = '1.0.0';
const acceptedEulaVersion = '1.0.0';
const acceptedDpaVersion = '1.0.0';
overrideAdB2cService(service, {
createUser: async () => {
@ -201,7 +205,8 @@ describe('createAccount', () => {
password,
username,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
} catch (e) {
if (e instanceof HttpException) {
@ -246,7 +251,8 @@ describe('createAccount', () => {
const password = 'dummy_password';
const username = 'dummy_username';
const role = 'admin none';
const acceptedTermsVersion = '1.0.0';
const acceptedEulaVersion = '1.0.0';
const acceptedDpaVersion = '1.0.0';
overrideAdB2cService(service, {
createUser: async () => {
@ -267,7 +273,8 @@ describe('createAccount', () => {
password,
username,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
} catch (e) {
if (e instanceof HttpException) {
@ -296,7 +303,8 @@ describe('createAccount', () => {
const password = 'dummy_password';
const username = 'dummy_username';
const role = 'none';
const acceptedTermsVersion = '1.0.0';
const acceptedEulaVersion = '1.0.0';
const acceptedDpaVersion = '1.0.0';
overrideAdB2cService(service, {
createUser: async () => {
@ -322,7 +330,8 @@ describe('createAccount', () => {
password,
username,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
} catch (e) {
if (e instanceof HttpException) {
@ -358,7 +367,8 @@ describe('createAccount', () => {
const password = 'dummy_password';
const username = 'dummy_username';
const role = 'none';
const acceptedTermsVersion = '1.0.0';
const acceptedEulaVersion = '1.0.0';
const acceptedDpaVersion = '1.0.0';
overrideAdB2cService(service, {
createUser: async () => {
@ -384,7 +394,8 @@ describe('createAccount', () => {
password,
username,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
} catch (e) {
if (e instanceof HttpException) {
@ -422,7 +433,8 @@ describe('createAccount', () => {
const password = 'dummy_password';
const username = 'dummy_username';
const role = 'none';
const acceptedTermsVersion = '1.0.0';
const acceptedEulaVersion = '1.0.0';
const acceptedDpaVersion = '1.0.0';
overrideAdB2cService(service, {
createUser: async () => {
@ -449,7 +461,8 @@ describe('createAccount', () => {
password,
username,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
} catch (e) {
if (e instanceof HttpException) {
@ -486,7 +499,8 @@ describe('createAccount', () => {
const password = 'dummy_password';
const username = 'dummy_username';
const role = 'none';
const acceptedTermsVersion = '1.0.0';
const acceptedEulaVersion = '1.0.0';
const acceptedDpaVersion = '1.0.0';
overrideAdB2cService(service, {
createUser: async () => {
@ -516,7 +530,8 @@ describe('createAccount', () => {
password,
username,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
} catch (e) {
if (e instanceof HttpException) {
@ -555,7 +570,8 @@ describe('createAccount', () => {
const password = 'dummy_password';
const username = 'dummy_username';
const role = 'none';
const acceptedTermsVersion = '1.0.0';
const acceptedEulaVersion = '1.0.0';
const acceptedDpaVersion = '1.0.0';
overrideAdB2cService(service, {
createUser: async (
@ -602,7 +618,8 @@ describe('createAccount', () => {
password,
username,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
} catch (e) {
if (e instanceof HttpException) {
@ -647,7 +664,8 @@ describe('createAccount', () => {
const password = 'dummy_password';
const username = 'dummy_username';
const role = 'none';
const acceptedTermsVersion = '1.0.0';
const acceptedEulaVersion = '1.0.0';
const acceptedDpaVersion = '1.0.0';
overrideAdB2cService(service, {
createUser: async () => {
@ -691,7 +709,8 @@ describe('createAccount', () => {
password,
username,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
} catch (e) {
if (e instanceof HttpException) {

View File

@ -159,14 +159,16 @@ export class AccountsService {
password: string,
username: string,
role: string,
acceptedTermsVersion: string,
acceptedEulaVersion: string,
acceptedDpaVersion: string,
): Promise<{ accountId: number; userId: number; externalUserId: string }> {
this.logger.log(
`[IN] [${context.trackingId}] ${this.createAccount.name} | params: { ` +
`country: ${country}, ` +
`dealerAccountId: ${dealerAccountId}, ` +
`role: ${role}, ` +
`acceptedTermsVersion: ${acceptedTermsVersion} };`,
`acceptedEulaVersion: ${acceptedEulaVersion} }, ` +
`acceptedDpaVersion: ${acceptedDpaVersion} };`,
);
try {
let externalUser: { sub: string } | ConflictError;
@ -209,7 +211,8 @@ export class AccountsService {
TIERS.TIER5,
externalUser.sub,
role,
acceptedTermsVersion,
acceptedEulaVersion,
acceptedDpaVersion,
);
account = newAccount;
user = adminUser;
@ -698,6 +701,7 @@ export class AccountsService {
externalUser.sub,
USER_ROLES.NONE,
null,
null,
);
account = newAccount;
user = adminUser;

View File

@ -345,7 +345,8 @@ export const makeDefaultAccountsRepositoryMockValue =
user.account_id = 1234567890123456;
user.role = 'none admin';
user.author_id = '6cce347f-0cf1-a15e-19ab-d00988b643f9';
user.accepted_terms_version = '1.0';
user.accepted_eula_version = '1.0';
user.accepted_dpa_version = '1.0';
user.email_verified = true;
user.auto_renew = false;
user.license_alert = false;
@ -374,7 +375,8 @@ export const makeDefaultUsersRepositoryMockValue =
user.account_id = 1234567890123456;
user.role = 'none admin';
user.author_id = '6cce347f-0cf1-a15e-19ab-d00988b643f9';
user.accepted_terms_version = '1.0';
user.accepted_eula_version = '1.0';
user.accepted_dpa_version = '1.0';
user.email_verified = true;
user.auto_renew = false;
user.license_alert = false;
@ -422,7 +424,8 @@ export const makeDefaultUserGroupsRepositoryMockValue =
user.account_id = 1234567890123456;
user.role = 'none admin';
user.author_id = '6cce347f-0cf1-a15e-19ab-d00988b643f9';
user.accepted_terms_version = '1.0';
user.accepted_eula_version = '1.0';
user.accepted_dpa_version = '1.0';
user.email_verified = true;
user.auto_renew = false;
user.license_alert = false;

View File

@ -43,8 +43,10 @@ export class CreateAccountRequest {
@ApiProperty()
@IsAdminPasswordvalid()
adminPassword: string;
@ApiProperty({ description: '同意済み利用規約のバージョン' })
acceptedTermsVersion: string;
@ApiProperty({ description: '同意済み利用規約のバージョン(EULA)' })
acceptedEulaVersion: string;
@ApiProperty({ description: '同意済み利用規約のバージョン(DPA)' })
acceptedDpaVersion: string;
@ApiProperty({ description: 'reCAPTCHA Token' })
token: string;
}

View File

@ -127,7 +127,8 @@ export const makeDefaultUsersRepositoryMockValue =
account_id: 1234567890123456,
role: 'none',
author_id: '',
accepted_terms_version: '1.0',
accepted_eula_version: '1.0',
accepted_dpa_version: '1.0',
email_verified: true,
deleted_at: null,
created_by: 'test',

View File

@ -116,7 +116,8 @@ export const makeDefaultUsersRepositoryMockValue =
user1.account_id = 1234567890123456;
user1.role = 'none';
user1.author_id = '6cce347f-0cf1-a15e-19ab-d00988b643f9';
user1.accepted_terms_version = '1.0';
user1.accepted_eula_version = '1.0';
user1.accepted_dpa_version = '1.0';
user1.email_verified = true;
user1.auto_renew = false;
user1.license_alert = false;

View File

@ -78,7 +78,8 @@ export const makeDefaultUsersRepositoryMockValue =
user.account_id = 123;
user.role = 'none';
user.author_id = undefined;
user.accepted_terms_version = '1.0';
user.accepted_eula_version = '1.0';
user.accepted_dpa_version = '1.0';
user.email_verified = true;
user.auto_renew = false;
user.license_alert = false;

View File

@ -423,7 +423,8 @@ const defaultTasksRepositoryMockValue: {
account_id: 1,
external_id: 'userId',
role: 'typist',
accepted_terms_version: '',
accepted_eula_version: '',
accepted_dpa_version: '',
email_verified: true,
auto_renew: true,
license_alert: true,

View File

@ -356,7 +356,8 @@ export const makeDefaultUsersRepositoryMockValue =
user1.account_id = 1234567890123456;
user1.role = 'none';
user1.author_id = '6cce347f-0cf1-a15e-19ab-d00988b643f9';
user1.accepted_terms_version = '1.0';
user1.accepted_eula_version = '1.0';
user1.accepted_dpa_version = '1.0';
user1.email_verified = true;
user1.auto_renew = false;
user1.license_alert = false;
@ -375,7 +376,8 @@ export const makeDefaultUsersRepositoryMockValue =
user2.account_id = 1234567890123456;
user2.role = 'none';
user2.author_id = '551c4077-5b55-a38c-2c55-cd1edd537aa8';
user2.accepted_terms_version = '1.0';
user2.accepted_eula_version = '1.0';
user2.accepted_dpa_version = '1.0';
user2.email_verified = true;
user2.auto_renew = false;
user2.license_alert = false;

View File

@ -188,7 +188,8 @@ describe('UsersService.confirmUserAndInitPassword', () => {
external_id: 'TEST9999',
account_id: 1,
role: 'None',
accepted_terms_version: 'string',
accepted_eula_version: 'string',
accepted_dpa_version: 'string',
email_verified: false,
created_by: 'string;',
created_at: new Date(),
@ -232,7 +233,8 @@ describe('UsersService.confirmUserAndInitPassword', () => {
external_id: 'TEST9999',
account_id: 1,
role: 'None',
accepted_terms_version: 'string',
accepted_eula_version: 'string',
accepted_dpa_version: 'string',
email_verified: false,
created_by: 'string;',
created_at: new Date(),
@ -272,7 +274,8 @@ describe('UsersService.confirmUserAndInitPassword', () => {
external_id: 'TEST9999',
account_id: 1,
role: 'None',
accepted_terms_version: 'string',
accepted_eula_version: 'string',
accepted_dpa_version: 'string',
email_verified: true,
created_by: 'string;',
created_at: new Date(),
@ -316,7 +319,8 @@ describe('UsersService.confirmUserAndInitPassword', () => {
external_id: 'TEST9999',
account_id: 1,
role: 'None',
accepted_terms_version: 'string',
accepted_eula_version: 'string',
accepted_dpa_version: 'string',
email_verified: false,
created_by: 'string;',
created_at: new Date(),

View File

@ -106,7 +106,8 @@ export class AccountsRepositoryService {
* @param tier
* @param adminExternalUserId
* @param adminUserRole
* @param adminUserAcceptedTermsVersion
* @param adminUserAcceptedEulaVersion
* @param adminUserAcceptedDpaVersion
* @returns account/admin user
*/
async createAccount(
@ -116,7 +117,8 @@ export class AccountsRepositoryService {
tier: number,
adminExternalUserId: string,
adminUserRole: string,
adminUserAcceptedTermsVersion: string,
adminUserAcceptedEulaVersion: string,
adminUserAcceptedDpaVersion: string,
): Promise<{ newAccount: Account; adminUser: User }> {
return await this.dataSource.transaction(async (entityManager) => {
const account = new Account();
@ -136,7 +138,8 @@ export class AccountsRepositoryService {
user.account_id = persistedAccount.id;
user.external_id = adminExternalUserId;
user.role = adminUserRole;
user.accepted_terms_version = adminUserAcceptedTermsVersion;
user.accepted_eula_version = adminUserAcceptedEulaVersion;
user.accepted_dpa_version = adminUserAcceptedDpaVersion;
}
const usersRepo = entityManager.getRepository(User);
const newUser = usersRepo.create(user);

View File

@ -32,7 +32,10 @@ export class User {
author_id?: string;
@Column({ nullable: true })
accepted_terms_version?: string;
accepted_eula_version?: string;
@Column({ nullable: true })
accepted_dpa_version?: string;
@Column({ default: false })
email_verified: boolean;
@ -99,7 +102,10 @@ export class UserArchive {
author_id?: string;
@Column({ nullable: true })
accepted_terms_version?: string;
accepted_eula_version?: string;
@Column({ nullable: true })
accepted_dpa_version?: string;
@Column()
email_verified: boolean;

View File

@ -40,7 +40,8 @@ export class UsersRepositoryService {
license_alert,
notification,
author_id,
accepted_terms_version,
accepted_eula_version,
accepted_dpa_version,
encryption,
encryption_password: encryptionPassword,
prompt,
@ -54,7 +55,8 @@ export class UsersRepositoryService {
userEntity.license_alert = license_alert;
userEntity.notification = notification;
userEntity.author_id = author_id;
userEntity.accepted_terms_version = accepted_terms_version;
userEntity.accepted_eula_version = accepted_eula_version;
userEntity.accepted_dpa_version = accepted_dpa_version;
userEntity.encryption = encryption;
userEntity.encryption_password = encryptionPassword;
userEntity.prompt = prompt;