55 lines
1.7 KiB
TypeScript
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
|
|
);
|