const { deleteImage, getPublicIdFromUrl } = require('../config/cloudinary'); // Upload single image exports.uploadImage = async (req, res) => { try { if (!req.file) { return res.status(400).json({ status: 'fail', message: 'No file uploaded', }); } res.status(200).json({ status: 'success', data: { url: req.file.path, publicId: req.file.filename, }, }); } catch (error) { console.error('Upload error details:', error); res.status(500).json({ status: 'error', message: error.message, }); } }; // Upload multiple images exports.uploadMultipleImages = async (req, res) => { try { if (!req.files || Object.keys(req.files).length === 0) { return res.status(400).json({ status: 'fail', message: 'No files uploaded', }); } const response = {}; // Handle imageCover if (req.files.imageCover) { response.imageCover = { url: req.files.imageCover[0].path, publicId: req.files.imageCover[0].filename, }; } // Handle additional images if (req.files.images) { response.images = req.files.images.map((file) => ({ url: file.path, publicId: file.filename, })); } res.status(200).json({ status: 'success', data: response, }); } catch (error) { res.status(500).json({ status: 'error', message: error.message, }); } }; // Delete image exports.deleteImage = async (req, res) => { try { const { publicId } = req.body; if (!publicId) { return res.status(400).json({ status: 'fail', message: 'Public ID is required', }); } const result = await deleteImage(publicId); if (result.result === 'ok') { res.status(200).json({ status: 'success', message: 'Image deleted successfully', }); } else { res.status(404).json({ status: 'fail', message: 'Image not found', }); } } catch (error) { res.status(500).json({ status: 'error', message: error.message, }); } }; // Delete image by URL exports.deleteImageByUrl = async (req, res) => { try { const { url } = req.body; if (!url) { return res.status(400).json({ status: 'fail', message: 'Image URL is required', }); } const publicId = getPublicIdFromUrl(url); if (!publicId) { return res.status(400).json({ status: 'fail', message: 'Invalid Cloudinary URL', }); } const result = await deleteImage(publicId); if (result.result === 'ok') { res.status(200).json({ status: 'success', message: 'Image deleted successfully', }); } else { res.status(404).json({ status: 'fail', message: 'Image not found', }); } } catch (error) { res.status(500).json({ status: 'error', message: error.message, }); } }; // Delete entire product folder exports.deleteProductFolder = async (req, res) => { try { const { productId } = req.params; if (!productId) { return res.status(400).json({ status: 'fail', message: 'Product ID is required', }); } const { deleteProductFolder: deleteFolderFn, } = require('../config/cloudinary'); const result = await deleteFolderFn(productId); res.status(200).json({ status: 'success', message: 'Product folder deleted successfully', data: result, }); } catch (error) { res.status(500).json({ status: 'error', message: error.message, }); } }; // Delete entire hero slide folder exports.deleteHeroSlideFolder = async (req, res) => { try { const { slideId } = req.params; if (!slideId) { return res.status(400).json({ status: 'fail', message: 'Slide ID is required', }); } const { cloudinary } = require('../config/cloudinary'); const folderPath = `samoulla/hero-images/${slideId}`; // Delete all resources in the folder (images and videos) await cloudinary.api.delete_resources_by_prefix(`${folderPath}/`, { resource_type: 'image', }); await cloudinary.api.delete_resources_by_prefix(`${folderPath}/`, { resource_type: 'video', }); // Delete the empty folder await cloudinary.api.delete_folder(folderPath); res.status(200).json({ status: 'success', message: 'Hero slide folder deleted successfully', }); } catch (error) { res.status(500).json({ status: 'error', message: error.message, }); } };