utils_s3.js

/**
 * @fileoverview Utilitaires pour l'interaction avec Amazon S3
 * @module utils/s3
 */

const AWS = require('aws-sdk');
const { v4: uuidv4 } = require('uuid');
require('dotenv').config();

/**
 * Configuration AWS depuis les variables d'environnement
 */
AWS.config.update({
    region: 'eu-west-3',
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});

const s3 = new AWS.S3();

/**
 * @constant {string} BUCKET_NAME - Nom du bucket S3
 */
const BUCKET_NAME = process.env.AWS_BUCKET_NAME;

/**
 * Télécharge un fichier vers S3
 * @function uploadToS3
 * @async
 * @param {Object} file - Le fichier à télécharger
 * @param {string} file.originalname - Nom original du fichier
 * @param {Buffer} file.buffer - Contenu du fichier
 * @returns {Promise<string>} URL du fichier téléchargé
 * @throws {Error} Erreur lors du téléchargement
 */
const uploadToS3 = async (file) => {
    try{
        const fileExtension = file.originalname.split('.').pop();
        const key = `${uuidv4()}.${fileExtension}`;

        const params = {
            Bucket: BUCKET_NAME,
            Key: key,
            Body: file.buffer
        };
       const uploadData = await s3.upload(params).promise();
       console.log("File uploaded successfully at", uploadData.Location);
       return uploadData.Location; // Return the URL of the uploaded file
    } catch (error) {
        console.error("Error uploading file to S3:", error);
        throw new Error("Failed to upload file to S3");
    }
}

/**
 * Supprime un fichier de S3
 * @function deleteFromS3
 * @async
 * @param {string} fileUrl - URL du fichier à supprimer
 * @returns {Promise<boolean>} true si la suppression a réussi
 * @throws {Error} Erreur lors de la suppression
 */
const deleteFromS3 = async (fileUrl) => {
    try {
        // Extraire le nom du fichier de l'URL
        const key = fileUrl.split('/').pop();
        
        const params = {
            Bucket: BUCKET_NAME,
            Key: key
        };

        await s3.deleteObject(params).promise();
        console.log("File deleted successfully from S3:", key);
        return true;
    } catch (error) {
        console.error("Error deleting file from S3:", error);
        throw new Error("Failed to delete file from S3");
    }
}

module.exports = { uploadToS3, deleteFromS3 }