import express from "express"; import multer from "multer"; import { uploadPatchImage, getImageFileStream, isS3UploadConfigured, } from "../services/images.js"; const upload = multer({ storage: multer.memoryStorage(), limits: { fileSize: 8 * 1024 * 1024 }, fileFilter: (_req, file, cb) => { const ok = /^image\/(jpeg|png|webp|gif)$/i.test(file.mimetype); cb(ok ? null : new Error("Invalid file type"), ok); }, }); function requireUser(req, res, next) { if (!req.session?.user?.sub) { res.status(401).json({ status: "error", error: "Unauthorized" }); return; } next(); } export function createImagesRouter() { const router = express.Router(); router.post( "/upload", requireUser, (req, res, next) => { upload.single("file")(req, res, (err) => { if (err) { res .status(400) .json({ status: "error", error: err.message || "Upload error" }); return; } next(); }); }, async (req, res) => { try { if (!isS3UploadConfigured()) { res.status(503).json({ status: "error", error: "Image upload not configured", }); return; } const file = req.file; if (!file?.buffer) { res.status(400).json({ status: "error", error: "file required" }); return; } const { id, blurHash } = await uploadPatchImage( file.buffer, file.mimetype, ); res.json({ status: "ok", id, blurHash }); } catch (e) { res.status(400).json({ status: "error", error: e.message || "Upload failed", }); } }, ); router.get("/:id", requireUser, async (req, res) => { const result = await getImageFileStream(req.params.id); if (!result) { res.status(404).end(); return; } res.setHeader("Content-Type", result.contentType); res.setHeader("Cache-Control", "private, max-age=3600"); result.stream.pipe(res); }); return router; }