Spaces:
Running
Running
| 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, | |
| }); | |
| } | |
| }; | |