diff --git a/dictation_server/src/api/odms/openapi.json b/dictation_server/src/api/odms/openapi.json index 7a7f262..9c9111f 100644 --- a/dictation_server/src/api/odms/openapi.json +++ b/dictation_server/src/api/odms/openapi.json @@ -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", diff --git a/dictation_server/src/app.module.ts b/dictation_server/src/app.module.ts index 172cb56..a5cd069 100644 --- a/dictation_server/src/app.module.ts +++ b/dictation_server/src/app.module.ts @@ -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, diff --git a/dictation_server/src/common/test/modules.ts b/dictation_server/src/common/test/modules.ts index bd4df33..ed77ffc 100644 --- a/dictation_server/src/common/test/modules.ts +++ b/dictation_server/src/common/test/modules.ts @@ -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, diff --git a/dictation_server/src/features/accounts/accounts.controller.ts b/dictation_server/src/features/accounts/accounts.controller.ts index 41929c8..b77c935 100644 --- a/dictation_server/src/features/accounts/accounts.controller.ts +++ b/dictation_server/src/features/accounts/accounts.controller.ts @@ -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 { + async getWorktypes(@Req() req: Request): Promise { 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') diff --git a/dictation_server/src/features/accounts/accounts.module.ts b/dictation_server/src/features/accounts/accounts.module.ts index 02991ab..4b43415 100644 --- a/dictation_server/src/features/accounts/accounts.module.ts +++ b/dictation_server/src/features/accounts/accounts.module.ts @@ -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, diff --git a/dictation_server/src/features/accounts/accounts.service.spec.ts b/dictation_server/src/features/accounts/accounts.service.spec.ts index 153a529..ba206d0 100644 --- a/dictation_server/src/features/accounts/accounts.service.spec.ts +++ b/dictation_server/src/features/accounts/accounts.service.spec.ts @@ -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); + 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); + 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); + 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, + ); + 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(); + } + } + }); +}); diff --git a/dictation_server/src/features/accounts/accounts.service.ts b/dictation_server/src/features/accounts/accounts.service.ts index f93df46..4aa8f2c 100644 --- a/dictation_server/src/features/accounts/accounts.service.ts +++ b/dictation_server/src/features/accounts/accounts.service.ts @@ -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 { + 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}`, + ); + } + } } diff --git a/dictation_server/src/features/accounts/test/accounts.service.mock.ts b/dictation_server/src/features/accounts/test/accounts.service.mock.ts index c18d259..7d9d664 100644 --- a/dictation_server/src/features/accounts/test/accounts.service.mock.ts +++ b/dictation_server/src/features/accounts/test/accounts.service.mock.ts @@ -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 => { 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); }; +export const makeWorktypesRepositoryMock = ( + value: WorktypesRepositoryMockValue, +) => { + const { getWorktypes } = value; + + return { + getWorktypes: + getWorktypes instanceof Error + ? jest.fn, []>().mockRejectedValue(getWorktypes) + : jest.fn, []>().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(); diff --git a/dictation_server/src/features/accounts/test/utility.ts b/dictation_server/src/features/accounts/test/utility.ts index ef8cdb6..1410c68 100644 --- a/dictation_server/src/features/accounts/test/utility.ts +++ b/dictation_server/src/features/accounts/test/utility.ts @@ -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 => { + 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 => { + return await datasource.getRepository(Worktype).find({ + where: { + account_id: accountId, + }, + }); +}; diff --git a/dictation_server/src/features/accounts/types/types.ts b/dictation_server/src/features/accounts/types/types.ts index 3d58765..4ad6f6c 100644 --- a/dictation_server/src/features/accounts/types/types.ts +++ b/dictation_server/src/features/accounts/types/types.ts @@ -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 { diff --git a/dictation_server/src/repositories/worktypes/entity/worktype.entity.ts b/dictation_server/src/repositories/worktypes/entity/worktype.entity.ts new file mode 100644 index 0000000..67d055a --- /dev/null +++ b/dictation_server/src/repositories/worktypes/entity/worktype.entity.ts @@ -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; +} diff --git a/dictation_server/src/repositories/worktypes/errors/types.ts b/dictation_server/src/repositories/worktypes/errors/types.ts new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/dictation_server/src/repositories/worktypes/errors/types.ts @@ -0,0 +1 @@ + diff --git a/dictation_server/src/repositories/worktypes/worktypes.repository.module.ts b/dictation_server/src/repositories/worktypes/worktypes.repository.module.ts new file mode 100644 index 0000000..df7a231 --- /dev/null +++ b/dictation_server/src/repositories/worktypes/worktypes.repository.module.ts @@ -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 {} diff --git a/dictation_server/src/repositories/worktypes/worktypes.repository.service.ts b/dictation_server/src/repositories/worktypes/worktypes.repository.service.ts new file mode 100644 index 0000000..f5fe450 --- /dev/null +++ b/dictation_server/src/repositories/worktypes/worktypes.repository.service.ts @@ -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 { + return await this.dataSource.transaction(async (entityManager) => { + const repo = entityManager.getRepository(Worktype); + + const worktypes = await repo.find({ where: { account_id: accountId } }); + return worktypes; + }); + } +}