apix/app/api/history/route.ts
Khoa.vo 8741e3b89f
Some checks are pending
CI / build (18.x) (push) Waiting to run
CI / build (20.x) (push) Waiting to run
feat: Initial commit with multi-provider image generation
2026-01-05 13:50:35 +07:00

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 });
}
}