From 2504dd8676f384e48bba3c14e984d65e007574b4 Mon Sep 17 00:00:00 2001 From: Aydan Pirani Date: Fri, 5 Jul 2024 13:16:54 -0700 Subject: [PATCH] added batch download, needs testing --- src/services/s3/s3-router.ts | 36 ++++++++++++++++++++++++++++++++++-- src/services/s3/s3-schema.ts | 7 +++++++ src/services/s3/s3-utils.ts | 2 +- 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/services/s3/s3-schema.ts diff --git a/src/services/s3/s3-router.ts b/src/services/s3/s3-router.ts index 52f631d..2c35fca 100644 --- a/src/services/s3/s3-router.ts +++ b/src/services/s3/s3-router.ts @@ -6,6 +6,7 @@ import { Role } from "../auth/auth-models"; import { S3 } from "@aws-sdk/client-s3"; import { getResumeUrl, postResumeUrl } from "./s3-utils"; +import BatchResumeDownloadValidator from "./s3-schema"; const s3Router: Router = Router(); @@ -37,7 +38,7 @@ s3Router.get( const userId = payload.userId; const s3 = res.locals.s3 as S3; - + try { const downloadUrl = await getResumeUrl(userId, s3); return res.status(StatusCodes.OK).send({ url: downloadUrl }); @@ -48,7 +49,7 @@ s3Router.get( ); s3Router.get( - "/download/:USERID", + "/download/user/:USERID", RoleChecker([Role.Enum.STAFF, Role.Enum.CORPORATE], false), s3ClientMiddleware, async (req, res, next) => { @@ -64,4 +65,35 @@ s3Router.get( } ); +s3Router.get( + "/download/batch/:USERID", + RoleChecker([Role.Enum.STAFF, Role.Enum.CORPORATE], false), + s3ClientMiddleware, + async (req, res, next) => { + const s3 = res.locals.s3 as S3; + + try { + const { userIds } = BatchResumeDownloadValidator.parse(req.body); + + const batchDownloadPromises = userIds.map((userId) => + getResumeUrl(userId, s3) + ); + + const batchDownloadUrls = await Promise.allSettled( + batchDownloadPromises + ); + + const filteredUrls = batchDownloadUrls.forEach((result) => { + if (result.status === "fulfilled") { + return result.value; + } + }); + + return res.status(StatusCodes.OK).send({ url: filteredUrls }); + } catch (error) { + next(error); + } + } +); + export default s3Router; diff --git a/src/services/s3/s3-schema.ts b/src/services/s3/s3-schema.ts new file mode 100644 index 0000000..62ffa53 --- /dev/null +++ b/src/services/s3/s3-schema.ts @@ -0,0 +1,7 @@ +import { z } from "zod"; + +const BatchResumeDownloadValidator = z.object({ + userIds: z.string().array(), +}); + +export default BatchResumeDownloadValidator; diff --git a/src/services/s3/s3-utils.ts b/src/services/s3/s3-utils.ts index 49d5dbf..c6eb2da 100644 --- a/src/services/s3/s3-utils.ts +++ b/src/services/s3/s3-utils.ts @@ -25,7 +25,7 @@ export async function getResumeUrl(userId: string, client: S3) { Bucket: Config.S3_BUCKET_NAME, Key: `${userId}.pdf`, }); - + return getSignedUrl(client, command, { expiresIn: Config.RESUME_URL_EXPIRY_SECONDS, });