From 183f4b43e5431608ecd8beb2e3cf5fa7460c7398 Mon Sep 17 00:00:00 2001 From: "Josepablo C." Date: Wed, 15 Nov 2023 21:27:44 -0600 Subject: [PATCH] feat: Adding news/download endpoint --- src/apps/public/news/routes.js | 1 + src/apps/public/news/services.js | 25 +++++++++++++++--- .../public-load-attachments/services.js | 25 ++---------------- src/config/apiConfig.json | 3 ++- src/config/apiConfig_local.json | 2 ++ src/lib/Misc.js | 26 ++++++++++++++++++- 6 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/apps/public/news/routes.js b/src/apps/public/news/routes.js index 2681e86..46e0453 100644 --- a/src/apps/public/news/routes.js +++ b/src/apps/public/news/routes.js @@ -5,5 +5,6 @@ const services= require('./services.js'); router.get('/', services.getList); router.get('/find', services.findList); router.get('/:id', services.getById); +router.get('/download/:image_name', services.getImageByNewId); module.exports = router; diff --git a/src/apps/public/news/services.js b/src/apps/public/news/services.js index 40e7ad3..4b35542 100644 --- a/src/apps/public/news/services.js +++ b/src/apps/public/news/services.js @@ -1,9 +1,15 @@ "use strict"; -const { ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env; +const { API_CONFIG, ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env; const { getPagination } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` ); const { GenericHandler } = require( `${ROOT_PATH}/${HANDLERS_PATH}/Generic.handler.js` ); -const Model = require( `${ROOT_PATH}/${MODELS_PATH}/news.model.js` ); +const { downloadFile } = require(`${ROOT_PATH}/${LIB_PATH}/Misc`); +const apiConfig = require( `${ROOT_PATH}/${API_CONFIG}` ); + +const s3Bucket = apiConfig.S3.bucket; +const s3BucketKey = apiConfig.S3.news_key; + +const Model = require( `${ROOT_PATH}/${MODELS_PATH}/news.model.js` ); const generic = new GenericHandler( Model ); const getList = async(req, res) => { @@ -30,4 +36,17 @@ const getById = async(req, res) => { res.send( retVal ); }; -module.exports = { getList , findList , getById }; +const getImageByNewId = async(req, res) => { + try{ + const image_name = req.params.image_name; + const file = await downloadFile( s3Bucket, s3BucketKey, image_name ); + res.attachment( image_name ); + res.setHeader('Content-Type', file.ContentType ); + res.send( file.Body ); + } catch ( err ){ + console.error( err ); + return res.status(500).send({ error : "News: Internal error" }); + } +}; + +module.exports = { getList , findList , getById, getImageByNewId }; diff --git a/src/apps/public/public-load-attachments/services.js b/src/apps/public/public-load-attachments/services.js index 4e1b914..e67f7c8 100644 --- a/src/apps/public/public-load-attachments/services.js +++ b/src/apps/public/public-load-attachments/services.js @@ -1,32 +1,11 @@ "use strict"; const { ROOT_PATH, LIB_PATH, MODELS_PATH, API_CONFIG } = process.env; +const { downloadFile } = require(`${ROOT_PATH}/${LIB_PATH}/Misc`); const apiConfig = require( `${ROOT_PATH}/${API_CONFIG}` ); -const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3'); -const s3Client = new S3Client({ - region : apiConfig.S3.region, - credentials : { - accessKeyId : apiConfig.S3.accessKeyId, - secretAccessKey : apiConfig.S3.secretAccessKey - } -}); const s3Bucket = apiConfig.S3.bucket; -const s3BucketKey = apiConfig.S3.key; +const s3BucketKey = apiConfig.S3.load_attachments_key; -async function downloadFile( bucket, key, obj_id ){ - const params = { - Bucket: bucket, - Key : `${key}/${obj_id}` - }; - const s3resp = await s3Client.send( new GetObjectCommand( params ) ); - const chunks = [] - for await (const chunk of s3resp.Body) { - chunks.push(chunk) - } - const body = Buffer.concat(chunks); - s3resp.Body = body; - return s3resp; -} const getAttachmentFile = async(req, res) => { const attachmentId = req.params.id; const file = await downloadFile( s3Bucket, s3BucketKey, attachmentId ); diff --git a/src/config/apiConfig.json b/src/config/apiConfig.json index ff654fd..7d2b595 100644 --- a/src/config/apiConfig.json +++ b/src/config/apiConfig.json @@ -24,7 +24,8 @@ "accessKeyId": "AKIAXTQEUF6MLCHTUIKW", "secretAccessKey": "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", "bucket": "enruta", - "key":"loadattachments", + "load_attachments_key":"loadattachments", + "news_key":"news", "region": "us-west-1" }, "sendgrid" : { diff --git a/src/config/apiConfig_local.json b/src/config/apiConfig_local.json index c210a4e..163f700 100644 --- a/src/config/apiConfig_local.json +++ b/src/config/apiConfig_local.json @@ -24,6 +24,8 @@ "accessKeyId": "AKIAXTQEUF6MLCHTUIKW", "secretAccessKey": "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", "bucket": "enruta", + "load_attachments_key":"loadattachments", + "news_key":"news", "region": "us-west-1" }, "sendgrid" : { diff --git a/src/lib/Misc.js b/src/lib/Misc.js index 39f7afa..25c0363 100644 --- a/src/lib/Misc.js +++ b/src/lib/Misc.js @@ -3,6 +3,15 @@ const { ROOT_PATH, API_CONFIG } = process.env; const apiConfig = require( `${ROOT_PATH}/${API_CONFIG}` ); const crypto = require('crypto'); +const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3'); +const s3Client = new S3Client({ + region : apiConfig.S3.region, + credentials : { + accessKeyId : apiConfig.S3.accessKeyId, + secretAccessKey : apiConfig.S3.secretAccessKey + } +}); + const secret = apiConfig.authentication.jwtSecret; /** * Convert string to sha256 string in hex @@ -74,4 +83,19 @@ async function queryPage(page, elements, model, filter=null, projection=null){ }; } -module.exports = { genKey , toSha256, getPagination, getPage, queryPage }; \ No newline at end of file +async function downloadFile( bucket, key, obj_id ){ + const params = { + Bucket: bucket, + Key : `${key}/${obj_id}` + }; + const s3resp = await s3Client.send( new GetObjectCommand( params ) ); + const chunks = [] + for await (const chunk of s3resp.Body) { + chunks.push(chunk) + } + const body = Buffer.concat(chunks); + s3resp.Body = body; + return s3resp; +} + +module.exports = { genKey , toSha256, getPagination, getPage, queryPage, downloadFile}; \ No newline at end of file