import { revalidateTag, unstable_cache } from "next/cache" import { getBusinessContactsByVendorId, upsertBusinessContacts, getAdditionalInfoByVendorId, upsertAdditionalInfo, getVendorAllAdditionalData, deleteBusinessContactsByVendorId, deleteAdditionalInfoByVendorId, type VendorBusinessContact, type VendorAdditionalInfo } from "./repository" // 업무담당자 정보 조회 export async function fetchBusinessContacts(vendorId: number) { return unstable_cache( async () => { try { const contacts = await getBusinessContactsByVendorId(vendorId) return { success: true, data: contacts, } } catch (error) { console.error("Error in fetchBusinessContacts:", error) return { success: false, error: error instanceof Error ? error.message : "업무담당자 정보를 가져오는 중 오류가 발생했습니다.", } } }, [`business-contacts-${vendorId}`], { revalidate: 300, // 5분 캐시 tags: ["business-contacts", `vendor-${vendorId}`], } )() } // 업무담당자 정보 저장 export async function saveBusinessContacts( vendorId: number, contacts: Omit[] ) { try { await upsertBusinessContacts(vendorId, contacts) // 캐시 무효화 revalidateTag("business-contacts") revalidateTag(`vendor-${vendorId}`) return { success: true, message: "업무담당자 정보가 저장되었습니다.", } } catch (error) { console.error("Error in saveBusinessContacts:", error) return { success: false, error: error instanceof Error ? error.message : "업무담당자 정보 저장 중 오류가 발생했습니다.", } } } // 추가정보 조회 export async function fetchAdditionalInfo(vendorId: number) { return unstable_cache( async () => { try { const additionalInfo = await getAdditionalInfoByVendorId(vendorId) return { success: true, data: additionalInfo, } } catch (error) { console.error("Error in fetchAdditionalInfo:", error) return { success: false, error: error instanceof Error ? error.message : "추가정보를 가져오는 중 오류가 발생했습니다.", } } }, [`additional-info-${vendorId}`], { revalidate: 300, // 5분 캐시 tags: ["additional-info", `vendor-${vendorId}`], } )() } // 추가정보 저장 export async function saveAdditionalInfo( vendorId: number, info: Omit ) { try { await upsertAdditionalInfo(vendorId, info) // 캐시 무효화 revalidateTag("additional-info") revalidateTag(`vendor-${vendorId}`) return { success: true, message: "추가정보가 저장되었습니다.", } } catch (error) { console.error("Error in saveAdditionalInfo:", error) return { success: false, error: error instanceof Error ? error.message : "추가정보 저장 중 오류가 발생했습니다.", } } } // 모든 추가정보 조회 (업무담당자 + 추가정보) export async function fetchAllAdditionalData(vendorId: number) { return unstable_cache( async () => { try { const data = await getVendorAllAdditionalData(vendorId) return { success: true, data, } } catch (error) { console.error("Error in fetchAllAdditionalData:", error) return { success: false, error: error instanceof Error ? error.message : "벤더 추가정보를 가져오는 중 오류가 발생했습니다.", } } }, [`all-additional-data-${vendorId}`], { revalidate: 300, // 5분 캐시 tags: ["business-contacts", "additional-info", `vendor-${vendorId}`], } )() } // 업무담당자 + 추가정보 한 번에 저장 export async function saveAllAdditionalData( vendorId: number, data: { businessContacts: Omit[] additionalInfo: Omit } ) { try { // 두 작업을 순차적으로 실행 await Promise.all([ upsertBusinessContacts(vendorId, data.businessContacts), upsertAdditionalInfo(vendorId, data.additionalInfo) ]) // 캐시 무효화 revalidateTag("business-contacts") revalidateTag("additional-info") revalidateTag(`vendor-${vendorId}`) return { success: true, message: "모든 추가정보가 저장되었습니다.", } } catch (error) { console.error("Error in saveAllAdditionalData:", error) return { success: false, error: error instanceof Error ? error.message : "추가정보 저장 중 오류가 발생했습니다.", } } } // 업무담당자 정보 삭제 export async function removeBusinessContacts(vendorId: number) { try { await deleteBusinessContactsByVendorId(vendorId) // 캐시 무효화 revalidateTag("business-contacts") revalidateTag(`vendor-${vendorId}`) return { success: true, message: "업무담당자 정보가 삭제되었습니다.", } } catch (error) { console.error("Error in removeBusinessContacts:", error) return { success: false, error: error instanceof Error ? error.message : "업무담당자 정보 삭제 중 오류가 발생했습니다.", } } } // 추가정보 삭제 export async function removeAdditionalInfo(vendorId: number) { try { await deleteAdditionalInfoByVendorId(vendorId) // 캐시 무효화 revalidateTag("additional-info") revalidateTag(`vendor-${vendorId}`) return { success: true, message: "추가정보가 삭제되었습니다.", } } catch (error) { console.error("Error in removeAdditionalInfo:", error) return { success: false, error: error instanceof Error ? error.message : "추가정보 삭제 중 오류가 발생했습니다.", } } } // 입력 완성도 체크 export async function checkAdditionalDataCompletion(vendorId: number) { try { const result = await fetchAllAdditionalData(vendorId) if (!result.success || !result.data) { return { success: false, error: "추가정보를 확인할 수 없습니다.", } } const { businessContacts, additionalInfo } = result.data // 필수 업무담당자 5개 타입이 모두 입력되었는지 체크 const requiredContactTypes = ["sales", "design", "delivery", "quality", "tax_invoice"] const existingContactTypes = businessContacts.map(contact => contact.contactType) const missingContactTypes = requiredContactTypes.filter(type => !existingContactTypes.includes(type)) // 업무담당자 완성도 const businessContactsComplete = missingContactTypes.length === 0 // 추가정보 완성도 (선택사항이므로 존재 여부만 체크) const additionalInfoExists = !!additionalInfo return { success: true, data: { businessContactsComplete, missingContactTypes, additionalInfoExists, totalCompletion: businessContactsComplete && additionalInfoExists } } } catch (error) { console.error("Error in checkAdditionalDataCompletion:", error) return { success: false, error: error instanceof Error ? error.message : "완성도 확인 중 오류가 발생했습니다.", } } }