payload-cloudinary
Version:
A Cloudinary storage plugin for Payload CMS
49 lines • 2.11 kB
JavaScript
import { getFilePrefix } from "@payloadcms/plugin-cloud-storage/utilities";
import path from "path";
import { getResourceType } from "./utils";
export const getHandler = ({ cloudinary, collection, folder }) => async (req, { params: { filename } }) => {
try {
const prefix = await getFilePrefix({ collection, filename, req });
const filePath = path.posix.join(folder, prefix, filename);
// Determine resource type based on file extension
const fileExt = path.extname(filename).toLowerCase();
const resourceType = getResourceType(fileExt);
const result = await cloudinary.api.resource(filePath.replace(/\.[^/.]+$/, ""), {
resource_type: resourceType,
});
if (!result || !result.secure_url) {
return new Response(null, { status: 404, statusText: "Not Found" });
}
const response = await fetch(result.secure_url);
if (!response.ok) {
return new Response(null, { status: 404, statusText: "Not Found" });
}
const blob = await response.blob();
const etagFromHeaders = req.headers.get("etag") || req.headers.get("if-none-match");
const objectEtag = req.headers.get("etag");
if (etagFromHeaders && etagFromHeaders === objectEtag) {
return new Response(null, {
headers: new Headers({
"Content-Type": blob.type,
"Content-Length": String(blob.size),
ETag: objectEtag,
}),
status: 304,
});
}
// Redirect to Cloudinary URL
return new Response(blob, {
headers: new Headers({
"Content-Type": blob.type,
"Content-Length": String(blob.size),
ETag: objectEtag,
}),
status: 200,
});
}
catch (error) {
req.payload.logger.error({ error, message: "Error in statichandler" });
return new Response("Internal Server Error", { status: 500 });
}
};
//# sourceMappingURL=staticHandler.js.map