@@ -44,25 +44,25 @@ const generateSignedUploadUrls = async (req, res) => {
|
||||
for (const filename of filenames) {
|
||||
const key = filename;
|
||||
const client = new S3Client({ region: InstanceRegion() });
|
||||
|
||||
|
||||
// Check if filename indicates PDF and set content type accordingly
|
||||
const isPdf = filename.toLowerCase().endsWith('.pdf');
|
||||
const isPdf = filename.toLowerCase().endsWith(".pdf");
|
||||
const commandParams = {
|
||||
Bucket: imgproxyDestinationBucket,
|
||||
Key: key,
|
||||
StorageClass: "INTELLIGENT_TIERING"
|
||||
};
|
||||
|
||||
|
||||
if (isPdf) {
|
||||
commandParams.ContentType = "application/pdf";
|
||||
}
|
||||
|
||||
|
||||
const command = new PutObjectCommand(commandParams);
|
||||
|
||||
// For PDFs, we need to add conditions to the presigned URL to enforce content type
|
||||
const presignedUrlOptions = { expiresIn: 360 };
|
||||
if (isPdf) {
|
||||
presignedUrlOptions.signableHeaders = new Set(['content-type']);
|
||||
presignedUrlOptions.signableHeaders = new Set(["content-type"]);
|
||||
}
|
||||
|
||||
const presignedUrl = await getSignedUrl(client, command, presignedUrlOptions);
|
||||
@@ -265,6 +265,82 @@ const downloadFiles = async (req, res) => {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Stream original image content by document ID
|
||||
* @param req
|
||||
* @param res
|
||||
* @returns {Promise<*>}
|
||||
*/
|
||||
const getOriginalImageByDocumentId = async (req, res) => {
|
||||
const {
|
||||
body: { documentId },
|
||||
user,
|
||||
userGraphQLClient
|
||||
} = req;
|
||||
|
||||
if (!documentId) {
|
||||
return res.status(400).json({ message: "documentId is required" });
|
||||
}
|
||||
|
||||
try {
|
||||
logger.log("imgproxy-original-image", "DEBUG", user?.email, null, { documentId });
|
||||
|
||||
const { documents } = await userGraphQLClient.request(GET_DOCUMENTS_BY_IDS, { documentIds: [documentId] });
|
||||
|
||||
if (!documents || documents.length === 0) {
|
||||
return res.status(404).json({ message: "Document not found" });
|
||||
}
|
||||
|
||||
const [document] = documents;
|
||||
const { type } = document;
|
||||
|
||||
if (!type || !type.startsWith("image")) {
|
||||
return res.status(400).json({ message: "Document is not an image" });
|
||||
}
|
||||
|
||||
const s3client = new S3Client({ region: InstanceRegion() });
|
||||
const key = keyStandardize(document);
|
||||
|
||||
let s3Response;
|
||||
try {
|
||||
s3Response = await s3client.send(
|
||||
new GetObjectCommand({
|
||||
Bucket: imgproxyDestinationBucket,
|
||||
Key: key
|
||||
})
|
||||
);
|
||||
} catch (err) {
|
||||
logger.log("imgproxy-original-image-s3-error", "ERROR", user?.email, null, {
|
||||
key,
|
||||
message: err.message,
|
||||
stack: err.stack
|
||||
});
|
||||
return res.status(400).json({ message: "Unable to retrieve image" });
|
||||
}
|
||||
|
||||
res.setHeader("Content-Type", type || "image/jpeg");
|
||||
|
||||
s3Response.Body.on("error", (err) => {
|
||||
logger.log("imgproxy-original-image-s3stream-error", "ERROR", user?.email, null, {
|
||||
key,
|
||||
message: err.message,
|
||||
stack: err.stack
|
||||
});
|
||||
res.destroy(err);
|
||||
});
|
||||
|
||||
s3Response.Body.pipe(res);
|
||||
} catch (error) {
|
||||
logger.log("imgproxy-original-image-error", "ERROR", req.user?.email, null, {
|
||||
documentId,
|
||||
message: error.message,
|
||||
stack: error.stack
|
||||
});
|
||||
|
||||
return res.status(400).json({ message: error.message, stack: error.stack });
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Delete Files
|
||||
* @param req
|
||||
@@ -425,6 +501,7 @@ const keyStandardize = (doc) => {
|
||||
module.exports = {
|
||||
generateSignedUploadUrls,
|
||||
getThumbnailUrls,
|
||||
getOriginalImageByDocumentId,
|
||||
downloadFiles,
|
||||
deleteFiles,
|
||||
moveFiles
|
||||
|
||||
@@ -4,6 +4,7 @@ const { createSignedUploadURL, downloadFiles, renameKeys, deleteFiles } = requir
|
||||
const {
|
||||
generateSignedUploadUrls: createSignedUploadURLImgproxy,
|
||||
getThumbnailUrls: getThumbnailUrlsImgproxy,
|
||||
getOriginalImageByDocumentId: getOriginalImageByDocumentIdImgproxy,
|
||||
downloadFiles: downloadFilesImgproxy,
|
||||
moveFiles: moveFilesImgproxy,
|
||||
deleteFiles: deleteFilesImgproxy
|
||||
@@ -24,5 +25,6 @@ router.post("/imgproxy/thumbnails", getThumbnailUrlsImgproxy);
|
||||
router.post("/imgproxy/download", downloadFilesImgproxy);
|
||||
router.post("/imgproxy/rename", moveFilesImgproxy);
|
||||
router.post("/imgproxy/delete", deleteFilesImgproxy);
|
||||
router.post("/imgproxy/original", getOriginalImageByDocumentIdImgproxy);
|
||||
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user