apix/lib/history.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

55 lines
1.7 KiB
TypeScript

import fs from 'fs';
import path from 'path';
const DATA_DIR = path.join(process.cwd(), 'data');
const HISTORY_FILE = path.join(DATA_DIR, 'history.json');
// Ensure data dir exists
if (!fs.existsSync(DATA_DIR)) {
fs.mkdirSync(DATA_DIR, { recursive: true });
}
export interface HistoryItem {
id: string;
url: string; // Base64 data URI for now, or local path served via public
originalName: string;
category: string;
timestamp: number;
mediaId?: string; // Whisk Media ID if available
}
export const history = {
getAll: (category?: string): HistoryItem[] => {
if (!fs.existsSync(HISTORY_FILE)) return [];
try {
const data = JSON.parse(fs.readFileSync(HISTORY_FILE, 'utf-8'));
let items: HistoryItem[] = Array.isArray(data) ? data : [];
if (category) {
items = items.filter(i => i.category === category);
}
return items.sort((a, b) => b.timestamp - a.timestamp);
} catch (e) {
return [];
}
},
add: (item: Omit<HistoryItem, 'timestamp'>) => {
const items = history.getAll();
const newItem: HistoryItem = { ...item, timestamp: Date.now() };
items.unshift(newItem); // Add to top
// Limit to 50 items per category? or total?
// Let's keep total 100 for now.
const trimmed = items.slice(0, 100);
fs.writeFileSync(HISTORY_FILE, JSON.stringify(trimmed, null, 2));
return newItem;
},
delete: (id: string) => {
const items = history.getAll();
const filtered = items.filter(i => i.id !== id);
fs.writeFileSync(HISTORY_FILE, JSON.stringify(filtered, null, 2));
}
};