From 399c6c91917455006c848fe9bb717ee11444bc32 Mon Sep 17 00:00:00 2001 From: ivis-kosaka Date: Wed, 4 Mar 2026 11:21:51 +0000 Subject: [PATCH 1/4] fix: history module and bulks module --- src/app/components/bulk/BulkResultStep.vue | 77 ++++- src/app/components/bulk/BulkUploadStep.vue | 27 +- src/app/components/bulk/BulkUserTable.vue | 13 +- .../components/bulk/BulkValidationStep.vue | 173 +++++++--- src/app/components/history/HistoryFilter.vue | 5 - src/app/components/history/HistoryTable.vue | 16 + src/app/composables/useBulk.ts | 251 ++++----------- src/app/composables/useHistory.ts | 162 ++++------ src/app/i18n/locales/en.json | 20 +- src/app/i18n/locales/ja.json | 20 +- src/app/pages/bulk/index.vue | 7 +- src/app/pages/history/index.vue | 74 ++--- src/app/types/bulks.ts | 26 +- src/app/types/history.ts | 12 +- src/server/api/bulk.py | 133 +++++--- src/server/entities/bulk.py | 18 +- src/server/entities/history_detail.py | 3 + src/server/exc.py | 14 + src/server/services/bulks.py | 304 +++++++++++++----- src/server/services/history.py | 11 +- 20 files changed, 785 insertions(+), 581 deletions(-) diff --git a/src/app/components/bulk/BulkResultStep.vue b/src/app/components/bulk/BulkResultStep.vue index af7ea7b5..7f28da0a 100644 --- a/src/app/components/bulk/BulkResultStep.vue +++ b/src/app/components/bulk/BulkResultStep.vue @@ -4,18 +4,29 @@ const properties = defineProps<{ taskId: string }>() -const { - uploadResult, - useBulkIndicators, - fetchUploadResult, -} = useExecuteUpload() -const { makePageInfo } = useBulk() +const { query, makePageInfo, makeIndicators } = useBulk() const toast = useToast() -const url = `/api/bulk/result/${properties.historyId}` +const { handleFetchError } = useErrorHandling() const { data: status, execute: executeStatus } - = await useFetch(`/api/bulk/execute/status/${properties.taskId}`) + = await useFetch(`/api/bulk/execute/status/${properties.taskId}`, + { + method: 'GET', + lazy: true, + onResponseError({ response }) { + switch (response.status) { + case 404: { + break + } + default:{ + handleFetchError({ response }) + break + } + } + }, + server: false }) + const { polling: { interval, maxAttempts } } = useAppConfig() const pollExecuteStatus = async () => { for (let index = 0; index < maxAttempts; index++) { @@ -31,8 +42,6 @@ const pollExecuteStatus = async () => { }) return } - const { uploadResult: result } = await fetchUploadResult(url) - uploadResult.value = result.value await new Promise(r => setTimeout(r, interval)) } toast.add({ @@ -42,13 +51,47 @@ const pollExecuteStatus = async () => { icon: 'i-lucide-circle-x', }) } + +const { data: executeResult, execute: fetchExecuteResult } + = await useFetch(`/api/bulk/result/${properties.historyId}`, { + method: 'GET', + query, + lazy: true, + server: false, + onResponseError({ response }) { + switch (response.status) { + case 403: { + showError({ + status: 403, + statusText: 'Forbidden', + message: $t('error-page.forbidden.bulk-result'), + }) + break + } + case 404: { + showError({ + status: 404, + statusText: 'Not Found', + message: $t('error-page.not-found.bulk-result'), + }) + break + } + default: { + handleFetchError({ response }) + break + } + } + }, + }) onMounted(async () => { - await pollExecuteStatus() + if (properties.taskId) + await pollExecuteStatus() + await fetchExecuteResult() }) -const indicators = useBulkIndicators -const fileInfo = computed(() => uploadResult.value!.fileInfo) -const pageInfo = makePageInfo(uploadResult) +const indicators = computed(() => makeIndicators(executeResult.value)) +const fileInfo = computed(() => executeResult.value!.fileInfo) +const pageInfo = makePageInfo(executeResult)