Merged PR 371: API実装
## 概要 [Task2505: API実装](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/2505) - ワークタイプ一覧取得APIとテストを実装しました。 - ワークタイプテーブルのリポジトリも実装しています。 ## レビューポイント - リポジトリの実装に問題はないか - テスト実装に不足はないか ## UIの変更 - なし ## 動作確認状況 - ローカルで確認
This commit is contained in:
parent
bb0bdce84c
commit
2da40e278b
@ -759,7 +759,7 @@
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/GetWorkTypesResponse"
|
||||
"$ref": "#/components/schemas/GetWorktypesResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2735,24 +2735,24 @@
|
||||
"required": ["orderedAccountId", "poNumber"]
|
||||
},
|
||||
"CancelIssueResponse": { "type": "object", "properties": {} },
|
||||
"WorkType": {
|
||||
"Worktype": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": { "type": "number", "description": "WorkTypeのID" },
|
||||
"workTypeId": { "type": "string", "description": "WorkTypeID" },
|
||||
"description": { "type": "string", "description": "WorkTypeの説明" }
|
||||
"id": { "type": "number", "description": "WorktypeのID" },
|
||||
"worktypeId": { "type": "string", "description": "WorktypeID" },
|
||||
"description": { "type": "string", "description": "Worktypeの説明" }
|
||||
},
|
||||
"required": ["id", "workTypeId"]
|
||||
"required": ["id", "worktypeId"]
|
||||
},
|
||||
"GetWorkTypesResponse": {
|
||||
"GetWorktypesResponse": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"workTypes": {
|
||||
"worktypes": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/components/schemas/WorkType" }
|
||||
"items": { "$ref": "#/components/schemas/Worktype" }
|
||||
}
|
||||
},
|
||||
"required": ["workTypes"]
|
||||
"required": ["worktypes"]
|
||||
},
|
||||
"CreateWorktypesRequest": {
|
||||
"type": "object",
|
||||
|
||||
@ -40,6 +40,7 @@ import { CheckoutPermissionsRepositoryModule } from './repositories/checkout_per
|
||||
import { UserGroupsRepositoryModule } from './repositories/user_groups/user_groups.repository.module';
|
||||
import { SortCriteriaRepositoryModule } from './repositories/sort_criteria/sort_criteria.repository.module';
|
||||
import { TemplateFilesRepositoryModule } from './repositories/template_files/template_files.repository.module';
|
||||
import { WorktypesRepositoryModule } from './repositories/worktypes/worktypes.repository.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
@ -94,6 +95,7 @@ import { TemplateFilesRepositoryModule } from './repositories/template_files/tem
|
||||
BlobstorageModule,
|
||||
AuthGuardsModule,
|
||||
SortCriteriaRepositoryModule,
|
||||
WorktypesRepositoryModule,
|
||||
],
|
||||
controllers: [
|
||||
HealthController,
|
||||
|
||||
@ -17,6 +17,7 @@ import { LicensesRepositoryModule } from '../../repositories/licenses/licenses.r
|
||||
import { AudioFilesRepositoryModule } from '../../repositories/audio_files/audio_files.repository.module';
|
||||
import { AudioOptionItemsRepositoryModule } from '../../repositories/audio_option_items/audio_option_items.repository.module';
|
||||
import { CheckoutPermissionsRepositoryModule } from '../../repositories/checkout_permissions/checkout_permissions.repository.module';
|
||||
import { WorktypesRepositoryModule } from '../../repositories/worktypes/worktypes.repository.module';
|
||||
import { NotificationModule } from '../../features//notification/notification.module';
|
||||
import { NotificationhubModule } from '../../gateways/notificationhub/notificationhub.module';
|
||||
import { BlobstorageModule } from '../../gateways/blobstorage/blobstorage.module';
|
||||
@ -63,6 +64,7 @@ export const makeTestingModule = async (
|
||||
BlobstorageModule,
|
||||
AuthGuardsModule,
|
||||
SortCriteriaRepositoryModule,
|
||||
WorktypesRepositoryModule,
|
||||
],
|
||||
providers: [
|
||||
AuthService,
|
||||
|
||||
@ -42,7 +42,7 @@ import {
|
||||
UpdateTypistGroupRequestParam,
|
||||
CancelIssueRequest,
|
||||
CancelIssueResponse,
|
||||
GetWorkTypesResponse,
|
||||
GetWorktypesResponse,
|
||||
CreateWorktypeResponse,
|
||||
CreateWorktypesRequest,
|
||||
} from './types/types';
|
||||
@ -645,7 +645,7 @@ export class AccountsController {
|
||||
@Get('/worktypes')
|
||||
@ApiResponse({
|
||||
status: HttpStatus.OK,
|
||||
type: GetWorkTypesResponse,
|
||||
type: GetWorktypesResponse,
|
||||
description: '成功時のレスポンス',
|
||||
})
|
||||
@ApiResponse({
|
||||
@ -662,18 +662,14 @@ export class AccountsController {
|
||||
@ApiBearerAuth()
|
||||
@UseGuards(AuthGuard)
|
||||
@UseGuards(RoleGuard.requireds({ roles: [ADMIN_ROLES.ADMIN] }))
|
||||
async getWorktypes(@Req() req: Request): Promise<GetWorkTypesResponse> {
|
||||
async getWorktypes(@Req() req: Request): Promise<GetWorktypesResponse> {
|
||||
const token = retrieveAuthorizationToken(req);
|
||||
const { userId } = jwt.decode(token, { json: true }) as AccessToken;
|
||||
|
||||
const context = makeContext(userId);
|
||||
console.log(context.trackingId);
|
||||
const worktypes = await this.accountService.getWorktypes(context, userId);
|
||||
|
||||
return {
|
||||
workTypes: [
|
||||
{ id: 1, workTypeId: 'workTypeId', description: 'description' },
|
||||
],
|
||||
};
|
||||
return worktypes;
|
||||
}
|
||||
|
||||
@Post('/worktypes')
|
||||
|
||||
@ -8,6 +8,7 @@ import { AccountsService } from './accounts.service';
|
||||
import { AdB2cModule } from '../../gateways/adb2c/adb2c.module';
|
||||
import { UserGroupsRepositoryModule } from '../../repositories/user_groups/user_groups.repository.module';
|
||||
import { BlobstorageModule } from '../../gateways/blobstorage/blobstorage.module';
|
||||
import { WorktypesRepositoryModule } from '../../repositories/worktypes/worktypes.repository.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
@ -15,6 +16,7 @@ import { BlobstorageModule } from '../../gateways/blobstorage/blobstorage.module
|
||||
UsersRepositoryModule,
|
||||
LicensesRepositoryModule,
|
||||
UserGroupsRepositoryModule,
|
||||
WorktypesRepositoryModule,
|
||||
SendGridModule,
|
||||
AdB2cModule,
|
||||
BlobstorageModule,
|
||||
|
||||
@ -9,15 +9,18 @@ import {
|
||||
makeDefaultSendGridlValue,
|
||||
makeDefaultUserGroupsRepositoryMockValue,
|
||||
makeDefaultUsersRepositoryMockValue,
|
||||
makeDefaultWorktypesRepositoryMockValue,
|
||||
} from './test/accounts.service.mock';
|
||||
import { makeDefaultConfigValue } from '../users/test/users.service.mock';
|
||||
import {
|
||||
createLicense,
|
||||
createLicenseOrder,
|
||||
createLicenseSetExpiryDateAndStatus,
|
||||
createWorktype,
|
||||
getSortCriteria,
|
||||
getTypistGroup,
|
||||
getTypistGroupMember,
|
||||
getWorktypes,
|
||||
} from './test/utility';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { makeTestingModule } from '../../common/test/modules';
|
||||
@ -42,6 +45,7 @@ import {
|
||||
import { AdB2cService } from '../../gateways/adb2c/adb2c.service';
|
||||
import { BlobstorageService } from '../../gateways/blobstorage/blobstorage.service';
|
||||
import { UserGroupsRepositoryService } from '../../repositories/user_groups/user_groups.repository.service';
|
||||
import { WorktypesRepositoryService } from '../../repositories/worktypes/worktypes.repository.service';
|
||||
|
||||
describe('createAccount', () => {
|
||||
let source: DataSource = null;
|
||||
@ -1481,6 +1485,8 @@ describe('AccountsService', () => {
|
||||
const blobStorageMockValue = makeBlobStorageServiceMockValue();
|
||||
const licensesRepositoryMockValue =
|
||||
makeDefaultLicensesRepositoryMockValue();
|
||||
const worktypesRepositoryMockValue =
|
||||
makeDefaultWorktypesRepositoryMockValue();
|
||||
const service = await makeAccountsServiceMock(
|
||||
accountsRepositoryMockValue,
|
||||
usersRepositoryMockValue,
|
||||
@ -1490,6 +1496,7 @@ describe('AccountsService', () => {
|
||||
sendGridMockValue,
|
||||
blobStorageMockValue,
|
||||
licensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue,
|
||||
);
|
||||
expect(await service.getLicenseSummary(accountId)).toEqual(
|
||||
expectedAccountLisenceCounts,
|
||||
@ -1510,6 +1517,8 @@ describe('AccountsService', () => {
|
||||
const blobStorageMockValue = makeBlobStorageServiceMockValue();
|
||||
const licensesRepositoryMockValue =
|
||||
makeDefaultLicensesRepositoryMockValue();
|
||||
const worktypesRepositoryMockValue =
|
||||
makeDefaultWorktypesRepositoryMockValue();
|
||||
const service = await makeAccountsServiceMock(
|
||||
accountsRepositoryMockValue,
|
||||
usersRepositoryMockValue,
|
||||
@ -1519,6 +1528,7 @@ describe('AccountsService', () => {
|
||||
sendGridMockValue,
|
||||
blobStorageMockValue,
|
||||
licensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue,
|
||||
);
|
||||
await expect(service.getLicenseSummary(accountId)).rejects.toEqual(
|
||||
new HttpException(
|
||||
@ -1541,6 +1551,8 @@ describe('AccountsService', () => {
|
||||
const blobStorageMockValue = makeBlobStorageServiceMockValue();
|
||||
const licensesRepositoryMockValue =
|
||||
makeDefaultLicensesRepositoryMockValue();
|
||||
const worktypesRepositoryMockValue =
|
||||
makeDefaultWorktypesRepositoryMockValue();
|
||||
const service = await makeAccountsServiceMock(
|
||||
accountsRepositoryMockValue,
|
||||
usersRepositoryMockValue,
|
||||
@ -1550,6 +1562,7 @@ describe('AccountsService', () => {
|
||||
sendGridMockValue,
|
||||
blobStorageMockValue,
|
||||
licensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue,
|
||||
);
|
||||
expect(await service.getTypists(externalId)).toEqual([
|
||||
{ id: 1, name: 'Typist1' },
|
||||
@ -1571,6 +1584,8 @@ describe('AccountsService', () => {
|
||||
const blobStorageMockValue = makeBlobStorageServiceMockValue();
|
||||
const licensesRepositoryMockValue =
|
||||
makeDefaultLicensesRepositoryMockValue();
|
||||
const worktypesRepositoryMockValue =
|
||||
makeDefaultWorktypesRepositoryMockValue();
|
||||
const service = await makeAccountsServiceMock(
|
||||
accountsRepositoryMockValue,
|
||||
usersRepositoryMockValue,
|
||||
@ -1580,6 +1595,7 @@ describe('AccountsService', () => {
|
||||
sendGridMockValue,
|
||||
blobStorageMockValue,
|
||||
licensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue,
|
||||
);
|
||||
await expect(service.getTypists(externalId)).rejects.toEqual(
|
||||
new HttpException(
|
||||
@ -1602,6 +1618,8 @@ describe('AccountsService', () => {
|
||||
const blobStorageMockValue = makeBlobStorageServiceMockValue();
|
||||
const licensesRepositoryMockValue =
|
||||
makeDefaultLicensesRepositoryMockValue();
|
||||
const worktypesRepositoryMockValue =
|
||||
makeDefaultWorktypesRepositoryMockValue();
|
||||
const service = await makeAccountsServiceMock(
|
||||
accountsRepositoryMockValue,
|
||||
usersRepositoryMockValue,
|
||||
@ -1611,6 +1629,7 @@ describe('AccountsService', () => {
|
||||
sendGridMockValue,
|
||||
blobStorageMockValue,
|
||||
licensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue,
|
||||
);
|
||||
await expect(service.getTypists(externalId)).rejects.toEqual(
|
||||
new HttpException(
|
||||
@ -1633,6 +1652,8 @@ describe('AccountsService', () => {
|
||||
const blobStorageMockValue = makeBlobStorageServiceMockValue();
|
||||
const licensesRepositoryMockValue =
|
||||
makeDefaultLicensesRepositoryMockValue();
|
||||
const worktypesRepositoryMockValue =
|
||||
makeDefaultWorktypesRepositoryMockValue();
|
||||
const service = await makeAccountsServiceMock(
|
||||
accountsRepositoryMockValue,
|
||||
usersRepositoryMockValue,
|
||||
@ -1642,6 +1663,7 @@ describe('AccountsService', () => {
|
||||
sendGridMockValue,
|
||||
blobStorageMockValue,
|
||||
licensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue,
|
||||
);
|
||||
|
||||
expect(await service.getTypistGroups(externalId)).toEqual([
|
||||
@ -1663,6 +1685,8 @@ describe('AccountsService', () => {
|
||||
const blobStorageMockValue = makeBlobStorageServiceMockValue();
|
||||
const licensesRepositoryMockValue =
|
||||
makeDefaultLicensesRepositoryMockValue();
|
||||
const worktypesRepositoryMockValue =
|
||||
makeDefaultWorktypesRepositoryMockValue();
|
||||
const service = await makeAccountsServiceMock(
|
||||
accountsRepositoryMockValue,
|
||||
usersRepositoryMockValue,
|
||||
@ -1672,6 +1696,7 @@ describe('AccountsService', () => {
|
||||
sendGridMockValue,
|
||||
blobStorageMockValue,
|
||||
licensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue,
|
||||
);
|
||||
|
||||
await expect(service.getTypistGroups(externalId)).rejects.toEqual(
|
||||
@ -1695,6 +1720,8 @@ describe('AccountsService', () => {
|
||||
const blobStorageMockValue = makeBlobStorageServiceMockValue();
|
||||
const licensesRepositoryMockValue =
|
||||
makeDefaultLicensesRepositoryMockValue();
|
||||
const worktypesRepositoryMockValue =
|
||||
makeDefaultWorktypesRepositoryMockValue();
|
||||
const service = await makeAccountsServiceMock(
|
||||
accountsRepositoryMockValue,
|
||||
usersRepositoryMockValue,
|
||||
@ -1704,6 +1731,7 @@ describe('AccountsService', () => {
|
||||
sendGridMockValue,
|
||||
blobStorageMockValue,
|
||||
licensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue,
|
||||
);
|
||||
|
||||
await expect(service.getTypistGroups(externalId)).rejects.toEqual(
|
||||
@ -2053,6 +2081,8 @@ describe('getOrderHistories', () => {
|
||||
const limit = 0;
|
||||
const offset = 0;
|
||||
const accountId = 0;
|
||||
const worktypesRepositoryMockValue =
|
||||
makeDefaultWorktypesRepositoryMockValue();
|
||||
const usersRepositoryMockValue = makeDefaultUsersRepositoryMockValue();
|
||||
usersRepositoryMockValue.findTypistUsers = new Error();
|
||||
const userGroupsRepositoryMockValue =
|
||||
@ -2077,6 +2107,7 @@ describe('getOrderHistories', () => {
|
||||
sendGridMockValue,
|
||||
blobStorageMockValue,
|
||||
licensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue,
|
||||
);
|
||||
await expect(
|
||||
service.getOrderHistories(limit, offset, accountId),
|
||||
@ -3125,3 +3156,110 @@ describe('updateTypistGroup', () => {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('getWorktypes', () => {
|
||||
let source: DataSource = null;
|
||||
beforeEach(async () => {
|
||||
source = new DataSource({
|
||||
type: 'sqlite',
|
||||
database: ':memory:',
|
||||
logging: false,
|
||||
entities: [__dirname + '/../../**/*.entity{.ts,.js}'],
|
||||
synchronize: true, // trueにすると自動的にmigrationが行われるため注意
|
||||
});
|
||||
return source.initialize();
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await source.destroy();
|
||||
source = null;
|
||||
});
|
||||
|
||||
it('アカウント内のWorktypeを取得できる', async () => {
|
||||
const module = await makeTestingModule(source);
|
||||
// 第五階層のアカウント作成
|
||||
const { account, admin } = await makeTestAccount(source, { tier: 5 });
|
||||
|
||||
const service = module.get<AccountsService>(AccountsService);
|
||||
const context = makeContext(admin.external_id);
|
||||
|
||||
await createWorktype(source, account.id, 'worktype1', 'description1');
|
||||
await createWorktype(source, account.id, 'worktype2');
|
||||
|
||||
//作成したデータを確認
|
||||
const worktypes = await getWorktypes(source, account.id);
|
||||
{
|
||||
expect(worktypes.length).toBe(2);
|
||||
expect(worktypes[0].custom_worktype_id).toBe('worktype1');
|
||||
expect(worktypes[1].custom_worktype_id).toBe('worktype2');
|
||||
expect(worktypes[0].description).toBe('description1');
|
||||
expect(worktypes[1].description).toBeNull();
|
||||
}
|
||||
|
||||
const resWorktypes = await service.getWorktypes(context, admin.external_id);
|
||||
|
||||
//実行結果を確認
|
||||
{
|
||||
expect(resWorktypes.worktypes.length).toBe(2);
|
||||
expect(resWorktypes.worktypes[0].worktypeId).toBe('worktype1');
|
||||
expect(resWorktypes.worktypes[1].worktypeId).toBe('worktype2');
|
||||
expect(resWorktypes.worktypes[0].description).toBe('description1');
|
||||
expect(resWorktypes.worktypes[1].description).toBe(undefined);
|
||||
}
|
||||
});
|
||||
|
||||
it('アカウント内のWorktypeを取得できる(0件)', async () => {
|
||||
const module = await makeTestingModule(source);
|
||||
// 第五階層のアカウント作成
|
||||
const { admin } = await makeTestAccount(source, { tier: 5 });
|
||||
|
||||
const service = module.get<AccountsService>(AccountsService);
|
||||
const context = makeContext(admin.external_id);
|
||||
|
||||
const resWorktypes = await service.getWorktypes(context, admin.external_id);
|
||||
|
||||
//実行結果を確認
|
||||
{
|
||||
expect(resWorktypes.worktypes.length).toBe(0);
|
||||
}
|
||||
});
|
||||
|
||||
it('DBアクセスに失敗した場合、500エラーを返却する', async () => {
|
||||
const module = await makeTestingModule(source);
|
||||
// 第五階層のアカウント作成
|
||||
const { account, admin } = await makeTestAccount(source, { tier: 5 });
|
||||
|
||||
const service = module.get<AccountsService>(AccountsService);
|
||||
const context = makeContext(admin.external_id);
|
||||
|
||||
await createWorktype(source, account.id, 'worktype1', 'description1');
|
||||
await createWorktype(source, account.id, 'worktype2');
|
||||
|
||||
//作成したデータを確認
|
||||
const worktypes = await getWorktypes(source, account.id);
|
||||
{
|
||||
expect(worktypes.length).toBe(2);
|
||||
expect(worktypes[0].custom_worktype_id).toBe('worktype1');
|
||||
expect(worktypes[1].custom_worktype_id).toBe('worktype2');
|
||||
expect(worktypes[0].description).toBe('description1');
|
||||
expect(worktypes[1].description).toBeNull();
|
||||
}
|
||||
|
||||
//DBアクセスに失敗するようにする
|
||||
const worktypeService = module.get<WorktypesRepositoryService>(
|
||||
WorktypesRepositoryService,
|
||||
);
|
||||
worktypeService.getWorktypes = jest.fn().mockRejectedValue('DB failed');
|
||||
|
||||
try {
|
||||
await service.getWorktypes(context, admin.external_id);
|
||||
} catch (e) {
|
||||
if (e instanceof HttpException) {
|
||||
expect(e.getStatus()).toEqual(HttpStatus.INTERNAL_SERVER_ERROR);
|
||||
expect(e.getResponse()).toEqual(makeErrorResponse('E009999'));
|
||||
} else {
|
||||
fail();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@ -22,6 +22,7 @@ import {
|
||||
Dealer,
|
||||
GetMyAccountResponse,
|
||||
GetTypistGroupResponse,
|
||||
GetWorktypesResponse,
|
||||
} from './types/types';
|
||||
import {
|
||||
DateWithZeroTime,
|
||||
@ -45,6 +46,7 @@ import {
|
||||
TypistGroupNotExistError,
|
||||
TypistIdInvalidError,
|
||||
} from '../../repositories/user_groups/errors/types';
|
||||
import { WorktypesRepositoryService } from '../../repositories/worktypes/worktypes.repository.service';
|
||||
|
||||
@Injectable()
|
||||
export class AccountsService {
|
||||
@ -53,6 +55,7 @@ export class AccountsService {
|
||||
private readonly licensesRepository: LicensesRepositoryService,
|
||||
private readonly usersRepository: UsersRepositoryService,
|
||||
private readonly userGroupsRepository: UserGroupsRepositoryService,
|
||||
private readonly worktypesRepository: WorktypesRepositoryService,
|
||||
private readonly adB2cService: AdB2cService,
|
||||
private readonly sendgridService: SendGridService,
|
||||
private readonly blobStorageService: BlobstorageService,
|
||||
@ -1049,4 +1052,43 @@ export class AccountsService {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ワークタイプ一覧を取得します
|
||||
* @param context
|
||||
* @param externalId
|
||||
* @returns worktypes
|
||||
*/
|
||||
async getWorktypes(
|
||||
context: Context,
|
||||
externalId: string,
|
||||
): Promise<GetWorktypesResponse> {
|
||||
this.logger.log(`[IN] [${context.trackingId}] ${this.getWorktypes.name}`);
|
||||
try {
|
||||
// 外部IDをもとにユーザー情報を取得する
|
||||
const { account_id: accountId } =
|
||||
await this.usersRepository.findUserByExternalId(externalId);
|
||||
|
||||
// ワークタイプ一覧を取得する
|
||||
const worktypes = await this.worktypesRepository.getWorktypes(accountId);
|
||||
|
||||
return {
|
||||
worktypes: worktypes.map((x) => ({
|
||||
id: x.id,
|
||||
worktypeId: x.custom_worktype_id,
|
||||
description: x.description ?? undefined,
|
||||
})),
|
||||
};
|
||||
} catch (e) {
|
||||
this.logger.error(e);
|
||||
throw new HttpException(
|
||||
makeErrorResponse('E009999'),
|
||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
} finally {
|
||||
this.logger.log(
|
||||
`[OUT] [${context.trackingId}] ${this.getWorktypes.name}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -16,6 +16,12 @@ import { AdB2cUser } from '../../../gateways/adb2c/types/types';
|
||||
import { LicensesRepositoryService } from '../../../repositories/licenses/licenses.repository.service';
|
||||
import { Context } from '../../../common/log';
|
||||
import { BlobstorageService } from '../../../gateways/blobstorage/blobstorage.service';
|
||||
import { Worktype } from '../../../repositories/worktypes/entity/worktype.entity';
|
||||
import { WorktypesRepositoryService } from '../../../repositories/worktypes/worktypes.repository.service';
|
||||
|
||||
export type WorktypesRepositoryMockValue = {
|
||||
getWorktypes: Worktype[] | Error;
|
||||
};
|
||||
|
||||
export type LicensesRepositoryMockValue = {
|
||||
getLicenseOrderHistoryInfo:
|
||||
@ -79,6 +85,7 @@ export const makeAccountsServiceMock = async (
|
||||
sendGridMockValue: SendGridMockValue,
|
||||
blobStorageMockValue: BlobStorageServiceMockValue,
|
||||
licensesRepositoryMockValue: LicensesRepositoryMockValue,
|
||||
worktypesRepositoryMockValue: WorktypesRepositoryMockValue,
|
||||
): Promise<AccountsService> => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
providers: [AccountsService],
|
||||
@ -107,6 +114,8 @@ export const makeAccountsServiceMock = async (
|
||||
return makeBlobStorageServiceMock(blobStorageMockValue);
|
||||
case LicensesRepositoryService:
|
||||
return makeLicensesRepositoryMock(licensesRepositoryMockValue);
|
||||
case WorktypesRepositoryService:
|
||||
return makeWorktypesRepositoryMock(worktypesRepositoryMockValue);
|
||||
}
|
||||
})
|
||||
.compile();
|
||||
@ -114,6 +123,19 @@ export const makeAccountsServiceMock = async (
|
||||
return module.get<AccountsService>(AccountsService);
|
||||
};
|
||||
|
||||
export const makeWorktypesRepositoryMock = (
|
||||
value: WorktypesRepositoryMockValue,
|
||||
) => {
|
||||
const { getWorktypes } = value;
|
||||
|
||||
return {
|
||||
getWorktypes:
|
||||
getWorktypes instanceof Error
|
||||
? jest.fn<Promise<void>, []>().mockRejectedValue(getWorktypes)
|
||||
: jest.fn<Promise<Worktype[]>, []>().mockResolvedValue(getWorktypes),
|
||||
};
|
||||
};
|
||||
|
||||
export const makeAccountsRepositoryMock = (
|
||||
value: AccountsRepositoryMockValue,
|
||||
) => {
|
||||
@ -295,6 +317,13 @@ export const makeBlobStorageServiceMock = (
|
||||
};
|
||||
|
||||
// 個別のテストケースに対応してそれぞれのMockを用意するのは無駄が多いのでテストケース内で個別の値を設定する
|
||||
export const makeDefaultWorktypesRepositoryMockValue =
|
||||
(): WorktypesRepositoryMockValue => {
|
||||
return {
|
||||
getWorktypes: [],
|
||||
};
|
||||
};
|
||||
|
||||
export const makeDefaultAccountsRepositoryMockValue =
|
||||
(): AccountsRepositoryMockValue => {
|
||||
let licenseSummaryInfo = new LicenseSummaryInfo();
|
||||
|
||||
@ -6,6 +6,7 @@ import {
|
||||
import { SortCriteria } from '../../../repositories/sort_criteria/entity/sort_criteria.entity';
|
||||
import { UserGroup } from '../../../repositories/user_groups/entity/user_group.entity';
|
||||
import { UserGroupMember } from '../../../repositories/user_groups/entity/user_group_member.entity';
|
||||
import { Worktype } from '../../../repositories/worktypes/entity/worktype.entity';
|
||||
|
||||
/**
|
||||
* テスト ユーティリティ: すべてのソート条件を取得する
|
||||
@ -108,3 +109,36 @@ export const getTypistGroupMember = async (
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
// Worktypeを作成する
|
||||
export const createWorktype = async (
|
||||
datasource: DataSource,
|
||||
accountId: number,
|
||||
worktypeId: string,
|
||||
description?: string,
|
||||
): Promise<Worktype> => {
|
||||
const { identifiers } = await datasource.getRepository(Worktype).insert({
|
||||
account_id: accountId,
|
||||
custom_worktype_id: worktypeId,
|
||||
description: description ?? null,
|
||||
deleted_at: null,
|
||||
created_by: 'test_runner',
|
||||
created_at: new Date(),
|
||||
updated_by: 'updater',
|
||||
updated_at: new Date(),
|
||||
});
|
||||
const worktype = identifiers.pop() as Worktype;
|
||||
return worktype;
|
||||
};
|
||||
|
||||
// Worktypeを取得する
|
||||
export const getWorktypes = async (
|
||||
datasource: DataSource,
|
||||
accountId: number,
|
||||
): Promise<Worktype[]> => {
|
||||
return await datasource.getRepository(Worktype).find({
|
||||
where: {
|
||||
account_id: accountId,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
@ -333,18 +333,18 @@ export class CancelIssueRequest {
|
||||
|
||||
export class CancelIssueResponse {}
|
||||
|
||||
export class WorkType {
|
||||
@ApiProperty({ description: 'WorkTypeのID' })
|
||||
export class Worktype {
|
||||
@ApiProperty({ description: 'WorktypeのID' })
|
||||
id: number;
|
||||
@ApiProperty({ description: 'WorkTypeID' })
|
||||
workTypeId: string;
|
||||
@ApiProperty({ description: 'WorkTypeの説明', required: false })
|
||||
@ApiProperty({ description: 'WorktypeID' })
|
||||
worktypeId: string;
|
||||
@ApiProperty({ description: 'Worktypeの説明', required: false })
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export class GetWorkTypesResponse {
|
||||
@ApiProperty({ type: [WorkType] })
|
||||
workTypes: WorkType[];
|
||||
export class GetWorktypesResponse {
|
||||
@ApiProperty({ type: [Worktype] })
|
||||
worktypes: Worktype[];
|
||||
}
|
||||
|
||||
export class CreateWorktypesRequest {
|
||||
|
||||
@ -0,0 +1,38 @@
|
||||
import { Account } from '../../accounts/entity/account.entity';
|
||||
import {
|
||||
Entity,
|
||||
Column,
|
||||
PrimaryGeneratedColumn,
|
||||
CreateDateColumn,
|
||||
UpdateDateColumn,
|
||||
} from 'typeorm';
|
||||
|
||||
@Entity({ name: 'worktypes' })
|
||||
export class Worktype {
|
||||
@PrimaryGeneratedColumn()
|
||||
id: number;
|
||||
|
||||
@Column()
|
||||
account_id: number;
|
||||
|
||||
@Column()
|
||||
custom_worktype_id: string;
|
||||
|
||||
@Column({ nullable: true })
|
||||
description?: string;
|
||||
|
||||
@Column({ nullable: true })
|
||||
deleted_at?: Date;
|
||||
|
||||
@Column({ nullable: true })
|
||||
created_by: string;
|
||||
|
||||
@CreateDateColumn({ default: () => "datetime('now', 'localtime')" }) // defaultはSQLite用設定値.本番用は別途migrationで設定
|
||||
created_at: Date;
|
||||
|
||||
@Column({ nullable: true })
|
||||
updated_by?: string;
|
||||
|
||||
@UpdateDateColumn({ default: () => "datetime('now', 'localtime')" }) // defaultはSQLite用設定値.本番用は別途migrationで設定
|
||||
updated_at: Date;
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
|
||||
@ -0,0 +1,11 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { Worktype } from './entity/worktype.entity';
|
||||
import { WorktypesRepositoryService } from './worktypes.repository.service';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Worktype])],
|
||||
providers: [WorktypesRepositoryService],
|
||||
exports: [WorktypesRepositoryService],
|
||||
})
|
||||
export class WorktypesRepositoryModule {}
|
||||
@ -0,0 +1,22 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { Worktype } from './entity/worktype.entity';
|
||||
|
||||
@Injectable()
|
||||
export class WorktypesRepositoryService {
|
||||
constructor(private dataSource: DataSource) {}
|
||||
|
||||
/**
|
||||
* ワークタイプ一覧を取得する
|
||||
* @param accountId
|
||||
* @returns worktypes
|
||||
*/
|
||||
async getWorktypes(accountId: number): Promise<Worktype[]> {
|
||||
return await this.dataSource.transaction(async (entityManager) => {
|
||||
const repo = entityManager.getRepository(Worktype);
|
||||
|
||||
const worktypes = await repo.find({ where: { account_id: accountId } });
|
||||
return worktypes;
|
||||
});
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user