made the presigned url middleware

This commit is contained in:
2025-11-21 14:53:53 +05:30
parent 926ea67e41
commit e21ffd08f1
5 changed files with 392 additions and 0 deletions

346
package-lock.json generated
View File

@@ -11,6 +11,7 @@
"dependencies": {
"@aws-crypto/sha256-js": "^5.2.0",
"@aws-sdk/client-s3": "^3.928.0",
"@aws-sdk/s3-request-presigner": "^3.310.0",
"@nestjs/common": "^10.3.0",
"@nestjs/config": "^3.1.1",
"@nestjs/core": "^10.3.0",
@@ -679,6 +680,17 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/is-array-buffer": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz",
"integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/middleware-bucket-endpoint": {
"version": "3.922.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.922.0.tgz",
@@ -696,6 +708,32 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/middleware-endpoint": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.310.0.tgz",
"integrity": "sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg==",
"dependencies": {
"@aws-sdk/middleware-serde": "3.310.0",
"@aws-sdk/types": "3.310.0",
"@aws-sdk/url-parser": "3.310.0",
"@aws-sdk/util-middleware": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/middleware-expect-continue": {
"version": "3.922.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.922.0.tgz",
@@ -812,6 +850,29 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/middleware-serde": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.310.0.tgz",
"integrity": "sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg==",
"dependencies": {
"@aws-sdk/types": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/middleware-serde/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/middleware-ssec": {
"version": "3.922.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.922.0.tgz",
@@ -825,6 +886,17 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/middleware-stack": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.310.0.tgz",
"integrity": "sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/middleware-user-agent": {
"version": "3.928.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.928.0.tgz",
@@ -890,6 +962,76 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/protocol-http": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.310.0.tgz",
"integrity": "sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ==",
"dependencies": {
"@aws-sdk/types": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/protocol-http/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/querystring-builder": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.310.0.tgz",
"integrity": "sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A==",
"dependencies": {
"@aws-sdk/types": "3.310.0",
"@aws-sdk/util-uri-escape": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/querystring-builder/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/querystring-parser": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.310.0.tgz",
"integrity": "sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA==",
"dependencies": {
"@aws-sdk/types": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/querystring-parser/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/region-config-resolver": {
"version": "3.925.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.925.0.tgz",
@@ -905,6 +1047,73 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/s3-request-presigner": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.310.0.tgz",
"integrity": "sha512-7/KsHXKE9VKhKcMIXrUeTljWPhHHotcqmcycvPnEKxfQ9+hjw8QhRR1akKh+xFQjx6iabUTRkhu53Qu4JkOjLQ==",
"dependencies": {
"@aws-sdk/middleware-endpoint": "3.310.0",
"@aws-sdk/protocol-http": "3.310.0",
"@aws-sdk/signature-v4-multi-region": "3.310.0",
"@aws-sdk/smithy-client": "3.310.0",
"@aws-sdk/types": "3.310.0",
"@aws-sdk/util-format-url": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/signature-v4-multi-region": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.310.0.tgz",
"integrity": "sha512-q8W+RIomTS/q85Ntgks/CoDElwqkC9+4OCicee5YznNHjQ4gtNWhUkYIyIRWRmXa/qx/AUreW9DM8FAecCOdng==",
"dependencies": {
"@aws-sdk/protocol-http": "3.310.0",
"@aws-sdk/signature-v4": "3.310.0",
"@aws-sdk/types": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"@aws-sdk/signature-v4-crt": "^3.118.0"
},
"peerDependenciesMeta": {
"@aws-sdk/signature-v4-crt": {
"optional": true
}
}
},
"node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/signature-v4": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.310.0.tgz",
"integrity": "sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q==",
"dependencies": {
"@aws-sdk/is-array-buffer": "3.310.0",
"@aws-sdk/types": "3.310.0",
"@aws-sdk/util-hex-encoding": "3.310.0",
"@aws-sdk/util-middleware": "3.310.0",
"@aws-sdk/util-uri-escape": "3.310.0",
"@aws-sdk/util-utf8": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/signature-v4-multi-region": {
"version": "3.928.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.928.0.tgz",
@@ -921,6 +1130,41 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/signature-v4/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/smithy-client": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.310.0.tgz",
"integrity": "sha512-UHMFvhoB2RLzsTb0mQe1ofvBUg/+/JEu1uptavxf/hEpEKZnRAaHH5FNkTG+mbFd/olay/QFjqNcMD6t8LcsNQ==",
"dependencies": {
"@aws-sdk/middleware-stack": "3.310.0",
"@aws-sdk/types": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/smithy-client/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/token-providers": {
"version": "3.929.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.929.0.tgz",
@@ -950,6 +1194,27 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/url-parser": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.310.0.tgz",
"integrity": "sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw==",
"dependencies": {
"@aws-sdk/querystring-parser": "3.310.0",
"@aws-sdk/types": "3.310.0",
"tslib": "^2.5.0"
}
},
"node_modules/@aws-sdk/url-parser/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/util-arn-parser": {
"version": "3.893.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz",
@@ -961,6 +1226,18 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/util-buffer-from": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz",
"integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==",
"dependencies": {
"@aws-sdk/is-array-buffer": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/util-endpoints": {
"version": "3.922.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.922.0.tgz",
@@ -976,6 +1253,41 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/util-format-url": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.310.0.tgz",
"integrity": "sha512-NBOvmvvVR3ydquHmznfgtakiSgDhq8Ww6fq8TUaEjM+Es6+iqY4AwZo0rZ9xTX3GpCcoZy391HUi6kiXRAFzuA==",
"dependencies": {
"@aws-sdk/querystring-builder": "3.310.0",
"@aws-sdk/types": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/util-format-url/node_modules/@aws-sdk/types": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz",
"integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/util-hex-encoding": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz",
"integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/util-locate-window": {
"version": "3.893.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz",
@@ -987,6 +1299,28 @@
"node": ">=18.0.0"
}
},
"node_modules/@aws-sdk/util-middleware": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.310.0.tgz",
"integrity": "sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/util-uri-escape": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz",
"integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==",
"dependencies": {
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/util-user-agent-browser": {
"version": "3.922.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.922.0.tgz",
@@ -1021,6 +1355,18 @@
}
}
},
"node_modules/@aws-sdk/util-utf8": {
"version": "3.310.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz",
"integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==",
"dependencies": {
"@aws-sdk/util-buffer-from": "3.310.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/xml-builder": {
"version": "3.921.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.921.0.tgz",

View File

@@ -28,6 +28,7 @@
"dependencies": {
"@aws-crypto/sha256-js": "^5.2.0",
"@aws-sdk/client-s3": "^3.928.0",
"@aws-sdk/s3-request-presigner": "^3.310.0",
"@nestjs/common": "^10.3.0",
"@nestjs/config": "^3.1.1",
"@nestjs/core": "^10.3.0",

View File

@@ -5,6 +5,14 @@ provider:
runtime: nodejs20.x
region: ap-south-1
versionFunctions: false
iamRoleStatements:
- Effect: Allow
Action:
- s3:GetObject
- s3:ListBucket
Resource:
- arn:aws:s3:::minglar-dev-bucket
- arn:aws:s3:::minglar-dev-bucket/*
apiGateway:
binaryMediaTypes:

View File

@@ -0,0 +1,18 @@
// common/utils/awsPresign.ts
import config from "@/config/config";
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
const s3 = new S3Client({
region: config.aws.region, // e.g. ap-south-1
});
export const getPresignedUrl = async (bucket: string, key: string) => {
const command = new GetObjectCommand({
Bucket: bucket,
Key: key,
});
// URL valid for 1 hour
return await getSignedUrl(s3, command, { expiresIn: 3600 });
};

View File

@@ -10,6 +10,8 @@ import { hostCompanyDetailsSchema } from '@/common/utils/validation/host/hostCom
import { HOST_STATUS_DISPLAY, HOST_STATUS_INTERNAL, STEPPER } from '@/common/utils/constants/host.constant';
import { MINGLAR_STATUS_DISPLAY, MINGLAR_STATUS_INTERNAL } from '@/common/utils/constants/minglar.constant';
import { ROLE } from '@/common/utils/constants/common.constant';
import { getPresignedUrl } from '@/common/middlewares/aws/getPreSignedUrl';
import config from '@/config/config';
type HostCompanyDetailsInput = z.infer<typeof hostCompanyDetailsSchema>;
@@ -58,6 +60,23 @@ export class HostService {
return { stepper: STEPPER.NOT_SUBMITTED } as any;
}
if (host.HostDocuments?.length) {
const bucket = config.aws.bucketName;
for (const doc of host.HostDocuments) {
if (doc.filePath) {
const filePath = doc.filePath;
// If full URL is saved, extract only key
const key = filePath.startsWith("http")
? filePath.split(".com/")[1]
: filePath;
(doc as any).presignedUrl = await getPresignedUrl(bucket, key);
}
}
}
return host;
}