feat: 질문지 제출 기능 + 관리자 응답 관리 + iframe 미리보기 수정

- 질문지 HTML에 제출/임시저장 JavaScript 추가 (localStorage 임시저장, API 제출)
- questionnaire_responses 테이블 마이그레이션 (005)
- /api/questionnaire/submit POST 엔드포인트
- 관리자 질문지 응답 목록/상세/상태변경 페이지 및 API
- 관리자 문서 미리보기를 fetch+srcdoc 방식으로 변경 (X-Frame-Options 우회)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-03 00:44:27 +09:00
parent 14996a320b
commit e27d13b6ec
9 changed files with 720 additions and 22 deletions

View File

@@ -0,0 +1,41 @@
import { NextResponse } from 'next/server';
import { createAdminClient } from '@/lib/supabase/admin';
export async function POST(request: Request) {
try {
const body = await request.json();
const { clientName, clientEmail, clientPhone, responses, type } = body;
if (!responses || typeof responses !== 'object') {
return NextResponse.json({ error: '응답 데이터가 없습니다.' }, { status: 400 });
}
if (!clientName || !clientEmail) {
return NextResponse.json({ error: '이름과 이메일은 필수입니다.' }, { status: 400 });
}
const admin = createAdminClient();
const { data, error } = await admin
.from('questionnaire_responses')
.insert({
questionnaire_type: type || 'ebay-tool',
client_name: clientName,
client_email: clientEmail,
client_phone: clientPhone || null,
responses,
status: 'submitted',
})
.select('id')
.single();
if (error) {
console.error('[Questionnaire] DB insert error:', error);
return NextResponse.json({ error: '저장에 실패했습니다.' }, { status: 500 });
}
return NextResponse.json({ success: true, id: data.id });
} catch (err) {
console.error('[Questionnaire] Submit error:', err);
return NextResponse.json({ error: '서버 오류가 발생했습니다.' }, { status: 500 });
}
}