From f79d8d395db8a148507eca315f88f0a75c07155e Mon Sep 17 00:00:00 2001 From: "saito.k" Date: Wed, 8 Nov 2023 11:39:41 +0900 Subject: [PATCH] =?UTF-8?q?dev=E5=8B=95=E4=BD=9C=E7=A2=BA=E8=AA=8D?= =?UTF-8?q?=E3=81=AE=E4=B8=8D=E5=85=B7=E5=90=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/features/files/files.service.spec.ts | 117 ++++++++++++++++++ .../tasks/tasks.repository.service.ts | 7 +- 2 files changed, 118 insertions(+), 6 deletions(-) diff --git a/dictation_server/src/features/files/files.service.spec.ts b/dictation_server/src/features/files/files.service.spec.ts index 15aee70..35f5a1b 100644 --- a/dictation_server/src/features/files/files.service.spec.ts +++ b/dictation_server/src/features/files/files.service.spec.ts @@ -449,6 +449,123 @@ describe('タスク作成から自動ルーティング(DB使用)', () => { expect(resultCheckoutPermission.length).toEqual(1); expect(resultCheckoutPermission[0].user_group_id).toEqual(userGroupId); }); + it('タスク作成時に、音声ファイルメタ情報のAuthorIDに存在しないものが入っていても自動ルーティングを行うことができる(API実行者のAuthorIDとworkType)', async () => { + if (!source) fail(); + const { id: accountId } = await makeTestSimpleAccount(source); + // 音声ファイルの録音者のユーザー + const { author_id: authorAuthorId } = await makeTestUser(source, { + account_id: accountId, + external_id: 'author-user-external-id', + role: 'author', + author_id: 'AUTHOR_ID', + }); + // ルーティング先のタイピストのユーザー + const { id: typistUserId } = await makeTestUser(source, { + account_id: accountId, + external_id: 'typist-user-external-id', + role: 'typist', + author_id: undefined, + }); + // API実行者のユーザー + const { external_id: myExternalId, id: myUserId } = await makeTestUser( + source, + { + account_id: accountId, + external_id: 'my-author-user-external-id', + role: 'author', + author_id: 'MY_AUTHOR_ID', + }, + ); + + // ワークタイプを作成 + const { id: worktypeId, custom_worktype_id } = await createWorktype( + source, + accountId, + 'worktypeId', + ); + + // テンプレートファイルを作成 + const { id: templateFileId } = await createTemplateFile( + source, + accountId, + 'templateFile', + 'http://blob/url/templateFile.zip', + ); + + // ワークフローを作成 + const { id: workflowId } = await createWorkflow( + source, + accountId, + myUserId, // API実行者のユーザーIDを設定 + worktypeId, + templateFileId, + ); + // ユーザーグループを作成 + const { userGroupId } = await createUserGroupAndMember( + source, + accountId, + 'userGroupName', + typistUserId, // ルーティング先のタイピストのユーザーIDを設定 + ); + // ワークフロータイピストを作成 + await createWorkflowTypist( + source, + workflowId, + undefined, + userGroupId, // ルーティング先のユーザーグループIDを設定 + ); + + const blobParam = makeBlobstorageServiceMockValue(); + const notificationParam = makeDefaultNotificationhubServiceMockValue(); + + const module = await makeTestingModuleWithBlobAndNotification( + source, + blobParam, + notificationParam, + ); + if (!module) fail(); + const service = module.get(FilesService); + const NotificationHubService = module.get( + NotificationhubService, + ); + const result = await service.uploadFinished( + makeContext('trackingId'), + myExternalId, // API実行者のユーザーIDを設定 + 'http://blob/url/file.zip', + 'XXXXXXXXXX', // 音声ファイルの情報には、録音者のAuthorIDが入る + 'file.zip', + '11:22:33', + '2023-05-26T11:22:33.444', + '2023-05-26T11:22:33.444', + '2023-05-26T11:22:33.444', + 256, + '01', + 'DS2', + 'comment', + custom_worktype_id, + optionItemList, + false, + ); + expect(result).toEqual({ jobNumber: '00000001' }); + // 通知処理が想定通りの引数で呼ばれているか確認 + expect(NotificationHubService.notify).toHaveBeenCalledWith( + makeContext('trackingId'), + [`user_${typistUserId}`], + makeNotifyMessage('M000101'), + ); + // 作成したタスクを取得 + const resultTask = await getTaskFromJobNumber(source, result.jobNumber); + // タスクのチェックアウト権限を取得 + const resultCheckoutPermission = await getCheckoutPermissions( + source, + resultTask?.id ?? 0, + ); + // タスクのテンプレートファイルIDを確認 + expect(resultTask?.template_file_id).toEqual(templateFileId); + // タスクのチェックアウト権限が想定通り(ワークフローで設定されている)のユーザーIDで作成されているか確認 + expect(resultCheckoutPermission.length).toEqual(1); + expect(resultCheckoutPermission[0].user_group_id).toEqual(userGroupId); + }, 1000000); it('ワークフローが見つからない場合、タスク作成時に、自動ルーティングを行うことができない', async () => { if (!source) fail(); diff --git a/dictation_server/src/repositories/tasks/tasks.repository.service.ts b/dictation_server/src/repositories/tasks/tasks.repository.service.ts index bc0802a..e3daecb 100644 --- a/dictation_server/src/repositories/tasks/tasks.repository.service.ts +++ b/dictation_server/src/repositories/tasks/tasks.repository.service.ts @@ -1001,11 +1001,6 @@ export class TasksRepositoryService { account_id: accountId, }, }); - if (!authorUser) { - throw new Error( - `user not found. authorId:${audioFile.author_id}, accountId:${accountId}`, - ); - } // 音声ファイル上のworktypeIdをもとにworktypeを取得 const worktypeRepo = entityManager.getRepository(Worktype); @@ -1031,7 +1026,7 @@ export class TasksRepositoryService { }, where: { account_id: accountId, - author_id: authorUser.id, + author_id: authorUser?.id ?? IsNull(), // authorUserが存在しない場合は、必ずヒットしないようにNULLを設定する worktype_id: worktypeRecord?.id ?? IsNull(), }, });