summaryrefslogtreecommitdiff
path: root/lib/vendor-investigation
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-09-02 10:31:53 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-09-02 10:31:53 +0000
commitd84602bdf369636e29d298a96218bd672de4afd7 (patch)
tree4b03de7ab7807d728e9d34945ca333cf3c080ab6 /lib/vendor-investigation
parent581b415e6707d9f1d0d0b667b84c4314461bfe37 (diff)
(최겸) 기술영업 수정사항 반영 및 구매 PQ/실사 첨부오류 변경
Diffstat (limited to 'lib/vendor-investigation')
-rw-r--r--lib/vendor-investigation/service.ts66
-rw-r--r--lib/vendor-investigation/table/update-investigation-sheet.tsx43
2 files changed, 84 insertions, 25 deletions
diff --git a/lib/vendor-investigation/service.ts b/lib/vendor-investigation/service.ts
index f0eb411e..c5097e75 100644
--- a/lib/vendor-investigation/service.ts
+++ b/lib/vendor-investigation/service.ts
@@ -15,6 +15,8 @@ import { v4 as uuid } from "uuid"
import { vendorsLogs } from "@/db/schema";
import { cache } from "react"
import { deleteFile } from "../file-stroage";
+import { saveDRMFile } from "../file-stroage";
+import { decryptWithServerAction } from "@/components/drm/drmUtils";
export async function getVendorsInvestigation(input: GetVendorsInvestigationSchema) {
return unstable_cache(
@@ -629,4 +631,66 @@ export const getAllItems = cache(async () => {
console.error("Error fetching all items:", error)
throw new Error("Failed to fetch items")
}
-}) \ No newline at end of file
+})
+
+/**
+ * Create vendor investigation attachment
+ */
+export async function createVendorInvestigationAttachmentAction(input: {
+ investigationId: number;
+ file: File;
+ userId?: string;
+}) {
+ unstable_noStore();
+
+ try {
+ console.log(`📎 실사 첨부파일 생성 시작: ${input.file.name}`);
+
+ // 1. saveDRMFile을 사용하여 파일 저장
+ const saveResult = await saveDRMFile(
+ input.file,
+ decryptWithServerAction,
+ `vendor-investigation/${input.investigationId}`,
+ input.userId
+ );
+
+ if (!saveResult.success) {
+ throw new Error(`파일 저장 실패: ${input.file.name} - ${saveResult.error}`);
+ }
+
+ console.log(`✅ 파일 저장 완료: ${input.file.name} -> ${saveResult.fileName}`);
+
+ // 2. DB에 첨부파일 레코드 생성
+ const [insertedAttachment] = await db
+ .insert(vendorInvestigationAttachments)
+ .values({
+ investigationId: input.investigationId,
+ fileName: saveResult.fileName!,
+ originalFileName: input.file.name,
+ filePath: saveResult.publicPath!,
+ fileSize: input.file.size,
+ mimeType: input.file.type || 'application/octet-stream',
+ attachmentType: 'DOCUMENT', // 또는 파일 타입에 따라 결정
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ })
+ .returning();
+
+ console.log(`✅ 첨부파일 DB 레코드 생성 완료: ID ${insertedAttachment.id}`);
+
+ // 3. 캐시 무효화
+ revalidateTag(`vendor-investigation-${input.investigationId}`);
+ revalidateTag("vendor-investigations");
+
+ return {
+ success: true,
+ attachment: insertedAttachment,
+ };
+ } catch (error) {
+ console.error(`❌ 실사 첨부파일 생성 실패: ${input.file.name}`, error);
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : "알 수 없는 오류",
+ };
+ }
+} \ No newline at end of file
diff --git a/lib/vendor-investigation/table/update-investigation-sheet.tsx b/lib/vendor-investigation/table/update-investigation-sheet.tsx
index 14350815..37d1b2cd 100644
--- a/lib/vendor-investigation/table/update-investigation-sheet.tsx
+++ b/lib/vendor-investigation/table/update-investigation-sheet.tsx
@@ -64,7 +64,7 @@ import {
updateVendorInvestigationSchema,
type UpdateVendorInvestigationSchema,
} from "../validations"
-import { updateVendorInvestigationAction, getInvestigationAttachments, deleteInvestigationAttachment } from "../service"
+import { updateVendorInvestigationAction, getInvestigationAttachments, deleteInvestigationAttachment, createVendorInvestigationAttachmentAction } from "../service"
import { VendorInvestigationsViewWithContacts } from "@/config/vendorInvestigationsColumnsConfig"
import prettyBytes from "pretty-bytes"
import { downloadFile } from "@/lib/file-download"
@@ -183,15 +183,7 @@ export function UpdateVendorInvestigationSheet({
if (!investigation) return
try {
- const response = await fetch(`/api/vendor-investigations/${investigation.investigationId}/attachments?attachmentId=${attachmentId}`, {
- method: "DELETE",
- })
-
- if (!response.ok) {
- const errorData = await response.json()
- throw new Error(errorData.error || "첨부파일 삭제 실패")
- }
-
+ await deleteInvestigationAttachment(attachmentId)
toast.success("첨부파일이 삭제되었습니다.")
// 목록 새로고침
loadExistingAttachments(investigation.investigationId)
@@ -409,23 +401,26 @@ export function UpdateVendorInvestigationSheet({
// 파일 업로드 함수
const uploadFiles = async (files: File[], investigationId: number) => {
const uploadPromises = files.map(async (file) => {
- const formData = new FormData()
- formData.append("file", file)
-
- const response = await fetch(`/api/vendor-investigations/${investigationId}/attachments`, {
- method: "POST",
- body: formData,
- })
+ try {
+ // 서버 액션을 호출하여 파일 저장 및 DB 레코드 생성
+ const result = await createVendorInvestigationAttachmentAction({
+ investigationId,
+ file,
+ userId: undefined // 필요시 사용자 ID 추가
+ });
+
+ if (!result.success) {
+ throw new Error(result.error || "파일 업로드 실패");
+ }
- if (!response.ok) {
- const errorData = await response.json()
- throw new Error(errorData.error || "파일 업로드 실패")
+ return result.attachment;
+ } catch (error) {
+ console.error(`파일 업로드 실패: ${file.name}`, error);
+ throw error;
}
+ });
- return await response.json()
- })
-
- return await Promise.all(uploadPromises)
+ return await Promise.all(uploadPromises);
}
// Submit handler