const s3 = require("@aws-sdk/client-s3"); const { S3Client, PutObjectCommand, GetObjectCommand } = s3; const s3Client = new S3Client({ region: process.env.AWS_REGION, endpoint: process.env.S3_ENDPOINT, credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, }, forcePathStyle: process.env.S3_FORCE_PATH_STYLE === 'true', }); module.exports = {}; module.exports.uploadFile = async (key, body) => { return new Promise(async (resolve, reject) => { const command = new PutObjectCommand({ Bucket: process.env.S3_BUCKET, Key: key, Body: body, }); try { await s3Client.send(command); resolve(); } catch (err) { reject(err); } }); }; module.exports.downloadFile = async (key) => { return new Promise(async (resolve, reject) => { const command = new GetObjectCommand({ Bucket: process.env.S3_BUCKET, Key: key, }); try { const response = await s3Client.send(command); const stream = response.Body; const chunks = []; try { for await (const chunk of stream) { chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); } resolve(Buffer.concat(chunks)); } catch (streamErr) { reject(streamErr); } } catch (err) { reject(err); } }); }; // Function to see if file/folder exists module.exports.fileExists = async (key) => { return new Promise(async (resolve, reject) => { try { const command = new GetObjectCommand({ Bucket: process.env.S3_BUCKET, Key: key, }); await s3Client.send(command); resolve(true); } catch (err) { resolve(false); } }); }; // List files in a folder module.exports.listFiles = async (prefix) => { const { ListObjectsV2Command } = require("@aws-sdk/client-s3"); return new Promise(async (resolve, reject) => { const command = new ListObjectsV2Command({ Bucket: process.env.S3_BUCKET, Prefix: prefix, }); try { const response = await s3Client.send(command); const files = response.Contents ? response.Contents.map(item => item.Key) : []; resolve(files); } catch (err) { reject(err); } }); };