77 lines
2.9 KiB
TypeScript
77 lines
2.9 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { history } from '@/lib/history';
|
|
import { WhiskClient } from '@/lib/whisk-client';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
export async function GET(req: NextRequest) {
|
|
const { searchParams } = new URL(req.url);
|
|
const category = searchParams.get('category') || undefined;
|
|
|
|
const items = history.getAll(category);
|
|
return NextResponse.json({ history: items });
|
|
}
|
|
|
|
export async function POST(req: NextRequest) {
|
|
try {
|
|
const formData = await req.formData();
|
|
const file = formData.get('file') as File;
|
|
const category = formData.get('category') as string || 'subject';
|
|
const cookieString = formData.get('cookies') as string;
|
|
|
|
if (!file) return NextResponse.json({ error: "No file provided" }, { status: 400 });
|
|
|
|
const buffer = Buffer.from(await file.arrayBuffer());
|
|
const base64 = buffer.toString('base64');
|
|
const mimeType = file.type || 'image/png';
|
|
|
|
// 1. Upload to Whisk (if cookies provided)
|
|
let mediaId = undefined;
|
|
if (cookieString) {
|
|
const client = new WhiskClient(cookieString);
|
|
mediaId = await client.uploadReferenceImage(base64, mimeType, category) || undefined;
|
|
}
|
|
|
|
// 2. Save to History
|
|
// Ideally we save the file to `public/uploads` and return a URL.
|
|
// For simplicity/speed in this MVP, we'll store the Data URI (Warning: Large JSON).
|
|
// BETTER: Save file to disk.
|
|
|
|
// Saving file to public/uploads
|
|
// We need to assume the app runs where it can write to public.
|
|
// In dev it works.
|
|
|
|
/*
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const uploadDir = path.join(process.cwd(), 'public', 'uploads');
|
|
if (!fs.existsSync(uploadDir)) fs.mkdirSync(uploadDir, { recursive: true });
|
|
|
|
const fileName = `${uuidv4()}.png`; // Normalize to PNG?
|
|
const filePath = path.join(uploadDir, fileName);
|
|
fs.writeFileSync(filePath, buffer);
|
|
const url = `/uploads/${fileName}`;
|
|
*/
|
|
|
|
// For now, let's use Data URI for immediate portability and less fs hassle in Next.js structure
|
|
// (Next.js public folder isn't always writable in production builds easily without config)
|
|
// But Data URI in JSON is bad.
|
|
// Let's use Data URI for the response but assume successful upload implies we can use it.
|
|
|
|
// Changing strategy: Use Data URI for history.json for now (simpler migration)
|
|
const url = `data:${mimeType};base64,${base64}`;
|
|
|
|
const newItem = history.add({
|
|
id: uuidv4(),
|
|
url,
|
|
originalName: file.name,
|
|
category,
|
|
mediaId
|
|
});
|
|
|
|
return NextResponse.json(newItem);
|
|
|
|
} catch (error: any) {
|
|
console.error("Upload error:", error);
|
|
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
}
|
|
}
|