OMDSCloud/dictation_server/src/repositories/accounts/accounts.repository.service.ts
saito.k d5e5e59f8c Merged PR 128: API実装(ソート条件変更)
## 概要
[Task1835: API実装(ソート条件変更)](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/1835)

- ソート条件変更APIを実装
  - トークンからB2CのIDを取得→userテーブルからユーザー情報を取得
  - ユーザーIDでソート条件テーブルを検索→レコードを更新
- ソート条件テーブルにレコードを作成する
  - アカウント作成時の処理にソート条件レコードを作成する処理を追加
  - ユーザー追加時にも処理を追加
- テスト修正

## レビューポイント
- APIの引数をチェックする関数をControllerに配置してもよいか
- ソート条件のレコードを作成するタイミングに漏れはないか
- 実装漏れはないか

## UIの変更
- Before/Afterのスクショなど
- スクショ置き場

## 動作確認状況
- ローカルで確認

## 補足
- 相談、参考資料などがあれば
2023-06-06 08:20:21 +00:00

152 lines
4.6 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import { DataSource, UpdateResult } from 'typeorm';
import { User } from '../users/entity/user.entity';
import { Account } from './entity/account.entity';
import { SortCriteria } from '../sort_criteria/entity/sort_criteria.entity';
import {
getDirection,
getTaskListSortableAttribute,
} from '../../common/types/sort/util';
export class AccountNotFoundError extends Error {}
@Injectable()
export class AccountsRepositoryService {
constructor(private dataSource: DataSource) {}
/**
* 管理ユーザー無しでアカウントを作成する
* @param companyName
* @param country
* @param dealerAccountId
* @param tier
* @returns create
*/
async create(
companyName: string,
country: string,
dealerAccountId: number | null,
tier: number,
): Promise<Account> {
const account = new Account();
{
account.parent_account_id = dealerAccountId;
account.company_name = companyName;
account.country = country;
account.tier = tier;
}
const createdEntity = await this.dataSource.transaction(
async (entityManager) => {
const repo = entityManager.getRepository(Account);
const newAccount = repo.create(account);
const persisted = await repo.save(newAccount);
return persisted;
},
);
return createdEntity;
}
/**
* 特定の情報でアカウントを更新する
* @param account
* @returns update
*/
async update(account: Account): Promise<UpdateResult> {
return await this.dataSource.transaction(async (entityManager) => {
const repo = entityManager.getRepository(Account);
return await repo.update({ id: account.id }, account);
});
}
/**
* プライマリ管理者とアカウントを同時に作成する
* @param companyName
* @param country
* @param dealerAccountId
* @param tier
* @param adminExternalUserId
* @param adminUserRole
* @param adminUserAcceptedTermsVersion
* @returns account/admin user
*/
async createAccount(
companyName: string,
country: string,
dealerAccountId: number | null,
tier: number,
adminExternalUserId: string,
adminUserRole: string,
adminUserAcceptedTermsVersion: string,
): Promise<{ newAccount: Account; adminUser: User }> {
return await this.dataSource.transaction(async (entityManager) => {
const account = new Account();
{
account.parent_account_id = dealerAccountId;
account.company_name = companyName;
account.country = country;
account.tier = tier;
}
const accountsRepo = entityManager.getRepository(Account);
const newAccount = accountsRepo.create(account);
const persistedAccount = await accountsRepo.save(newAccount);
// 作成されたAccountのIDを使用してユーザーを作成
const user = new User();
{
user.account_id = persistedAccount.id;
user.external_id = adminExternalUserId;
user.role = adminUserRole;
user.accepted_terms_version = adminUserAcceptedTermsVersion;
}
const usersRepo = entityManager.getRepository(User);
const newUser = usersRepo.create(user);
const persistedUser = await usersRepo.save(newUser);
// アカウントに管理者を設定して更新
persistedAccount.primary_admin_user_id = persistedUser.id;
const result = await accountsRepo.update(
{ id: persistedAccount.id },
persistedAccount,
);
// 想定外の更新が行われた場合はロールバックを行った上でエラー送出
if (result.affected !== 1) {
throw new Error(`invalid update. result.affected=${result.affected}`);
}
// ユーザーのタスクソート条件を作成
const sortCriteria = new SortCriteria();
{
sortCriteria.parameter = getTaskListSortableAttribute('JOB_NUMBER');
sortCriteria.direction = getDirection('ASC');
sortCriteria.user_id = persistedUser.id;
}
const sortCriteriaRepo = entityManager.getRepository(SortCriteria);
const newSortCriteria = sortCriteriaRepo.create(sortCriteria);
await sortCriteriaRepo.save(newSortCriteria);
return { newAccount: persistedAccount, adminUser: persistedUser };
});
}
/**
* アカウントIDからアカウント情報を取得する
* @param id
* @returns account
*/
async findAccountById(id: number): Promise<Account> {
const account = await this.dataSource.getRepository(Account).findOne({
where: {
id: id,
},
});
if (!account) {
throw new AccountNotFoundError();
}
return account;
}
}