chore(phase0): eBay 세트 제거 — 문진·문서 admin/API/lib/CONTENT + cheerio

Delete:
- app/api/questionnaire/ (submit/route.ts)
- app/admin/questionnaire/ (page.tsx)
- app/api/admin/questionnaire/ (route.ts + [id]/route.ts)
- app/admin/documents/ (page.tsx)
- app/api/admin/documents/ ([filename]/route.ts)
- lib/ebay-tools/ (crawler.ts·pricing.ts·ai-analyzer.ts·types.ts)
- CONTENT/ebay-tool-{questionnaire,proposal}.html
- CONTENT/ARCHITECTURE_EBAY_PARTS_TOOL.md

Modify:
- app/admin/components/AdminSidebar.tsx: Remove NAV_ITEMS for /admin/documents & /admin/questionnaire
- package.json: Remove cheerio dependency

Verify: npm test (4 files, 20 tests PASS), npm run build OK

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-02 14:02:47 +09:00
parent 0c6ebb2eaa
commit 88fe56163d
16 changed files with 0 additions and 4904 deletions

View File

@@ -1,44 +0,0 @@
import { NextResponse } from 'next/server';
import { readFile } from 'fs/promises';
import path from 'path';
import { verifyAdminTokenNode } from '@/lib/admin-auth';
import { cookies } from 'next/headers';
export const runtime = 'nodejs';
const ALLOWED_FILES = [
'ebay-tool-proposal.html',
'ebay-tool-questionnaire.html',
];
async function checkAuth() {
const cookieStore = await cookies();
const token = cookieStore.get('admin_token')?.value;
return token && verifyAdminTokenNode(token);
}
export async function GET(
request: Request,
{ params }: { params: Promise<{ filename: string }> }
) {
if (!(await checkAuth())) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const { filename } = await params;
if (!ALLOWED_FILES.includes(filename)) {
return NextResponse.json({ error: 'Not found' }, { status: 404 });
}
try {
const filePath = path.join(process.cwd(), 'CONTENT', filename);
const content = await readFile(filePath, 'utf-8');
return new NextResponse(content, {
headers: { 'Content-Type': 'text/html; charset=utf-8' },
});
} catch {
return NextResponse.json({ error: 'File not found' }, { status: 404 });
}
}

View File

@@ -1,69 +0,0 @@
import { NextResponse } from 'next/server';
import { createAdminClient } from '@/lib/supabase/admin';
import { verifyAdminTokenNode } from '@/lib/admin-auth';
import { cookies } from 'next/headers';
export const runtime = 'nodejs';
async function checkAuth() {
const cookieStore = await cookies();
const token = cookieStore.get('admin_token')?.value;
return token && verifyAdminTokenNode(token);
}
// 질문지 응답 상세 조회
export async function GET(
request: Request,
{ params }: { params: Promise<{ id: string }> }
) {
if (!(await checkAuth())) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const { id } = await params;
const admin = createAdminClient();
const { data, error } = await admin
.from('questionnaire_responses')
.select('*')
.eq('id', id)
.single();
if (error) {
console.error('[Admin Questionnaire] DB error:', error);
return NextResponse.json({ error: '조회 실패' }, { status: 500 });
}
return NextResponse.json({ data });
}
// 상태/메모 업데이트
export async function PATCH(
request: Request,
{ params }: { params: Promise<{ id: string }> }
) {
if (!(await checkAuth())) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const { id } = await params;
const body = await request.json();
const { status, admin_notes } = body;
const updates: Record<string, unknown> = {};
if (status) updates.status = status;
if (admin_notes !== undefined) updates.admin_notes = admin_notes;
if (status === 'reviewed') updates.reviewed_at = new Date().toISOString();
const admin = createAdminClient();
const { error } = await admin
.from('questionnaire_responses')
.update(updates)
.eq('id', id);
if (error) {
console.error('[Admin Questionnaire] Update error:', error);
return NextResponse.json({ error: '업데이트 실패' }, { status: 500 });
}
return NextResponse.json({ success: true });
}

View File

@@ -1,32 +0,0 @@
import { NextResponse } from 'next/server';
import { createAdminClient } from '@/lib/supabase/admin';
import { verifyAdminTokenNode } from '@/lib/admin-auth';
import { cookies } from 'next/headers';
export const runtime = 'nodejs';
async function checkAuth() {
const cookieStore = await cookies();
const token = cookieStore.get('admin_token')?.value;
return token && verifyAdminTokenNode(token);
}
// 질문지 응답 목록 조회
export async function GET() {
if (!(await checkAuth())) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const admin = createAdminClient();
const { data, error } = await admin
.from('questionnaire_responses')
.select('*')
.order('created_at', { ascending: false });
if (error) {
console.error('[Admin Questionnaire] DB error:', error);
return NextResponse.json({ error: '데이터 조회 실패' }, { status: 500 });
}
return NextResponse.json({ data });
}

View File

@@ -1,41 +0,0 @@
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 });
}
}