oai-reverse-proxy/src/user/web/browse-images.ts

55 lines
1.7 KiB
TypeScript

import express, { Request, Response } from "express";
import { getLastNImages } from "../../shared/file-storage/image-history";
import { paginate } from "../../shared/utils";
import { ipLimiter } from "../../proxy/rate-limit";
const IMAGES_PER_PAGE = 24;
const metadataCacheTTL = 1000 * 60 * 3;
let metadataCache: unknown | null = null;
let metadataCacheValid = 0;
const handleImageHistoryPage = (req: Request, res: Response) => {
const page = parseInt(req.query.page as string) || 1;
const allImages = getLastNImages().reverse();
const { items, pageCount } = paginate(allImages, page, IMAGES_PER_PAGE);
res.render("image_history", {
images: items,
pagination: {
currentPage: page,
totalPages: pageCount,
},
});
};
const handleMetadataRequest = (_req: Request, res: Response) => {
res.setHeader("Cache-Control", "public, max-age=180");
res.setHeader("Content-Type", "application/json");
res.setHeader(
"Content-Disposition",
`attachment; filename="image-metadata-${new Date().toISOString()}.json"`
);
if (new Date().getTime() - metadataCacheValid < metadataCacheTTL) {
return res.status(200).json(metadataCache);
}
const images = getLastNImages().map(({ prompt, url }) => ({ url, prompt }));
const metadata = {
exportedAt: new Date().toISOString(),
totalImages: images.length,
images,
};
metadataCache = metadata;
metadataCacheValid = new Date().getTime();
res.status(200).json(metadata);
};
export const browseImagesRouter = express.Router();
browseImagesRouter.get("/image-history", handleImageHistoryPage);
browseImagesRouter.get(
"/image-history/metadata",
ipLimiter,
handleMetadataRequest
);