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(), }, });