summaryrefslogtreecommitdiff
path: root/lib/shi-signature/buyer-signature.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/shi-signature/buyer-signature.ts')
-rw-r--r--lib/shi-signature/buyer-signature.ts186
1 files changed, 186 insertions, 0 deletions
diff --git a/lib/shi-signature/buyer-signature.ts b/lib/shi-signature/buyer-signature.ts
new file mode 100644
index 00000000..d464ae54
--- /dev/null
+++ b/lib/shi-signature/buyer-signature.ts
@@ -0,0 +1,186 @@
+'use server';
+
+import db from '@/db/db';
+import { buyerSignatures } from '@/db/schema';
+import { eq } from 'drizzle-orm';
+import { revalidatePath } from 'next/cache';
+import { writeFile, mkdir } from 'fs/promises';
+import path from 'path';
+import { v4 as uuidv4 } from 'uuid';
+
+export async function uploadBuyerSignature(formData: FormData) {
+ try {
+ const file = formData.get('file') as File;
+ if (!file) {
+ return { success: false, error: '파일이 없습니다.' };
+ }
+
+ // 파일 크기 체크 (5MB)
+ if (file.size > 5 * 1024 * 1024) {
+ return { success: false, error: '파일 크기는 5MB 이하여야 합니다.' };
+ }
+
+ // 파일 타입 체크
+ if (!file.type.startsWith('image/')) {
+ return { success: false, error: '이미지 파일만 업로드 가능합니다.' };
+ }
+
+ const bytes = await file.arrayBuffer();
+ const buffer = Buffer.from(bytes);
+
+ // Base64 변환
+ const base64 = `data:${file.type};base64,${buffer.toString('base64')}`;
+
+ // 파일 저장 경로
+ const fileName = `${uuidv4()}-${file.name}`;
+ const uploadDir = path.join(process.cwd(), 'public', 'uploads', 'signatures');
+
+ // 디렉토리 생성
+ await mkdir(uploadDir, { recursive: true });
+
+ const filePath = path.join(uploadDir, fileName);
+ await writeFile(filePath, buffer);
+
+ // 기존 활성 서명 비활성화
+ await db.update(buyerSignatures)
+ .set({ isActive: false })
+ .where(eq(buyerSignatures.isActive, true));
+
+ // 새 서명 저장
+ const [newSignature] = await db.insert(buyerSignatures)
+ .values({
+ name: '삼성중공업',
+ imageUrl: `/uploads/signatures/${fileName}`,
+ dataUrl: base64,
+ mimeType: file.type,
+ fileSize: file.size,
+ isActive: true,
+ })
+ .returning();
+
+ revalidatePath('/admin/buyer-signature');
+
+ return { success: true, signature: newSignature };
+ } catch (error) {
+ console.error('서명 업로드 실패:', error);
+ return { success: false, error: '서명 업로드에 실패했습니다.' };
+ }
+}
+
+export async function getActiveSignature() {
+ try {
+ const [signature] = await db
+ .select()
+ .from(buyerSignatures)
+ .where(eq(buyerSignatures.isActive, true))
+ .limit(1);
+
+ return signature;
+ } catch (error) {
+ console.error('활성 서명 조회 실패:', error);
+ return null;
+ }
+}
+
+export async function getAllSignatures() {
+ try {
+ const signatures = await db
+ .select()
+ .from(buyerSignatures)
+ .orderBy(buyerSignatures.createdAt);
+
+ return signatures;
+ } catch (error) {
+ console.error('서명 목록 조회 실패:', error);
+ return [];
+ }
+}
+
+export async function setActiveSignature(id: number) {
+ try {
+ // 모든 서명 비활성화
+ await db.update(buyerSignatures)
+ .set({ isActive: false })
+ .where(eq(buyerSignatures.isActive, true));
+
+ // 선택한 서명 활성화
+ await db.update(buyerSignatures)
+ .set({ isActive: true })
+ .where(eq(buyerSignatures.id, id));
+
+ revalidatePath('/admin/buyer-signature');
+
+ return { success: true };
+ } catch (error) {
+ console.error('활성 서명 설정 실패:', error);
+ return { success: false, error: '활성 서명 설정에 실패했습니다.' };
+ }
+}
+
+export async function deleteSignature(id: number) {
+ try {
+ await db.delete(buyerSignatures)
+ .where(eq(buyerSignatures.id, id));
+
+ revalidatePath('/admin/buyer-signature');
+
+ return { success: true };
+ } catch (error) {
+ console.error('서명 삭제 실패:', error);
+ return { success: false, error: '서명 삭제에 실패했습니다.' };
+ }
+}
+
+
+// 클라이언트에서 직접 호출할 수 있는 서버 액션
+export async function getBuyerSignatureFile() {
+ try {
+ const [signature] = await db
+ .select()
+ .from(buyerSignatures)
+ .where(eq(buyerSignatures.isActive, true))
+ .limit(1);
+
+ if (!signature || !signature.dataUrl) {
+ console.log('활성화된 구매자 서명이 없습니다.');
+ return null;
+ }
+
+ return {
+ data: {
+ dataUrl: signature.dataUrl,
+ imageUrl: signature.imageUrl,
+ mimeType: signature.mimeType
+ }
+ };
+ } catch (error) {
+ console.error('구매자 서명 조회 실패:', error);
+ return null;
+ }
+}
+
+// 대체 서명이나 기본 서명이 필요한 경우
+export async function getBuyerSignatureFileWithFallback() {
+ try {
+ // 먼저 DB에서 활성 서명 조회
+ const signature = await getBuyerSignatureFile();
+
+ if (signature) {
+ return signature;
+ }
+
+ // DB에 서명이 없으면 기본 서명 반환 (선택사항)
+ const defaultSignature = {
+ data: {
+ dataUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==', // 1x1 투명 픽셀 또는 실제 기본 서명
+ imageUrl: '/images/default-buyer-signature.png',
+ mimeType: 'image/png'
+ }
+ };
+
+ return defaultSignature;
+ } catch (error) {
+ console.error('서명 조회 실패 (fallback 포함):', error);
+ return null;
+ }
+} \ No newline at end of file