made upload and delete image from s3
This commit is contained in:
@@ -398,3 +398,35 @@ resendOTPmail:
|
||||
- httpApi:
|
||||
path: /resend-otp
|
||||
method: post
|
||||
|
||||
|
||||
mediaUploadTos3:
|
||||
handler: src/modules/host/handlers/mediaUploadToS3.handler
|
||||
memorySize: 512
|
||||
package:
|
||||
patterns:
|
||||
- 'src/modules/host/handlers/mediaUploadToS3/**'
|
||||
- ${file(./serverless/patterns/base.yml):pattern1}
|
||||
- ${file(./serverless/patterns/base.yml):pattern2}
|
||||
- ${file(./serverless/patterns/base.yml):pattern3}
|
||||
- ${file(./serverless/patterns/base.yml):pattern4}
|
||||
events:
|
||||
- httpApi:
|
||||
path: /media/upload/activity/{activityXid}
|
||||
method: post
|
||||
|
||||
|
||||
mediaDeleteFroms3:
|
||||
handler: src/modules/host/handlers/mediaDeleteFromS3.handler
|
||||
memorySize: 512
|
||||
package:
|
||||
patterns:
|
||||
- 'src/modules/host/handlers/mediaDeleteFromS3/**'
|
||||
- ${file(./serverless/patterns/base.yml):pattern1}
|
||||
- ${file(./serverless/patterns/base.yml):pattern2}
|
||||
- ${file(./serverless/patterns/base.yml):pattern3}
|
||||
- ${file(./serverless/patterns/base.yml):pattern4}
|
||||
events:
|
||||
- httpApi:
|
||||
path: /media/delete
|
||||
method: delete
|
||||
|
||||
40
src/modules/host/handlers/mediaDeleteFromS3.ts
Normal file
40
src/modules/host/handlers/mediaDeleteFromS3.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
// mediaDelete.ts
|
||||
import { APIGatewayProxyHandler } from 'aws-lambda';
|
||||
import { S3Client, DeleteObjectCommand } from '@aws-sdk/client-s3';
|
||||
import config from '../../../config/config';
|
||||
|
||||
const s3 = new S3Client({ region: config.aws.region, });
|
||||
|
||||
export const handler: APIGatewayProxyHandler = async (event) => {
|
||||
try {
|
||||
const body = JSON.parse(event.body || '{}');
|
||||
const { key } = body;
|
||||
|
||||
if (!key) {
|
||||
return response(400, 'S3 key is required');
|
||||
}
|
||||
|
||||
await s3.send(
|
||||
new DeleteObjectCommand({
|
||||
Bucket: config.aws.bucketName!,
|
||||
Key: key,
|
||||
})
|
||||
);
|
||||
|
||||
return response(200, { success: true });
|
||||
} catch (err: any) {
|
||||
console.error(err);
|
||||
return response(500, 'Failed to delete file');
|
||||
}
|
||||
};
|
||||
|
||||
function response(statusCode: number, body: any) {
|
||||
return {
|
||||
statusCode,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
};
|
||||
}
|
||||
66
src/modules/host/handlers/mediaUploadToS3.ts
Normal file
66
src/modules/host/handlers/mediaUploadToS3.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
// mediaPresignUpload.ts
|
||||
import { APIGatewayProxyHandler } from 'aws-lambda';
|
||||
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
|
||||
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import ApiError from '../../../common/utils/helper/ApiError';
|
||||
import config from '../../../config/config';
|
||||
|
||||
const s3 = new S3Client({ region: config.aws.region });
|
||||
|
||||
export const handler: APIGatewayProxyHandler = async (event) => {
|
||||
try {
|
||||
const body = JSON.parse(event.body || '{}');
|
||||
const { fileName, mimeType } = body;
|
||||
|
||||
if (!fileName || !mimeType) {
|
||||
throw new ApiError(400, 'fileName and mimeType are required');
|
||||
}
|
||||
|
||||
const activityXid = event.pathParameters?.activityXid;
|
||||
if (!activityXid) {
|
||||
throw new ApiError(400, 'activityXid is required in path parameters');
|
||||
}
|
||||
|
||||
const safeFileName = fileName
|
||||
.trim()
|
||||
.replace(/\s+/g, '_')
|
||||
.replace(/[^a-zA-Z0-9._-]/g, '')
|
||||
.toLowerCase();
|
||||
|
||||
// const key = `temporary/uploads/activity/activity_${activityXid}/${uuid()}_${safeFileName}`;
|
||||
const key = `ActivityOnboarding/Activity_${activityXid}/Artifacts/${uuid()}_${safeFileName}`;
|
||||
|
||||
const command = new PutObjectCommand({
|
||||
Bucket: config.aws.bucketName!,
|
||||
Key: key,
|
||||
ContentType: mimeType, // IMPORTANT: must match frontend header
|
||||
// ❌ DO NOT SET ACL
|
||||
});
|
||||
|
||||
const uploadUrl = await getSignedUrl(s3, command, {
|
||||
expiresIn: 300, // 5 minutes
|
||||
});
|
||||
|
||||
return response(200, {
|
||||
uploadUrl,
|
||||
key,
|
||||
fileUrl: `https://${config.aws.bucketName}.s3.${config.aws.region}.amazonaws.com/${key}`,
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
return response(500, 'Failed to generate presigned URL');
|
||||
}
|
||||
};
|
||||
|
||||
function response(statusCode: number, body: any) {
|
||||
return {
|
||||
statusCode,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user