mirror of
https://github.com/Drop-OSS/drop.git
synced 2025-11-20 11:41:14 +10:00
remove sanitize-filename because IDs are internally generated remove pulse animation on NO GAME cards add migration refactors to be inline with other stuff
37 lines
1.2 KiB
TypeScript
37 lines
1.2 KiB
TypeScript
import aclManager from "~/server/internal/acls";
|
|
import objectHandler from "~/server/internal/objects";
|
|
|
|
export default defineEventHandler(async (h3) => {
|
|
const id = getRouterParam(h3, "id");
|
|
if (!id) throw createError({ statusCode: 400, statusMessage: "Invalid ID" });
|
|
|
|
const userId = await aclManager.getUserIdACL(h3, ["object:read"]);
|
|
|
|
const object = await objectHandler.fetchWithPermissions(id, userId);
|
|
if (!object)
|
|
throw createError({ statusCode: 404, statusMessage: "Object not found" });
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/ETag
|
|
const etagRequestValue = h3.headers.get("If-None-Match");
|
|
const etagActualValue = await objectHandler.fetchHash(id);
|
|
if (
|
|
etagRequestValue &&
|
|
etagActualValue &&
|
|
etagActualValue === etagRequestValue
|
|
) {
|
|
// would compare if etag is valid, but objects should never change
|
|
setResponseStatus(h3, 304);
|
|
return null;
|
|
}
|
|
|
|
// TODO: fix undefined etagValue
|
|
setHeader(h3, "ETag", etagActualValue ?? "");
|
|
setHeader(h3, "Content-Type", object.mime);
|
|
setHeader(
|
|
h3,
|
|
"Cache-Control",
|
|
"private, max-age=31536000, s-maxage=31536000, immutable"
|
|
);
|
|
return object.data;
|
|
});
|