samoulla-backend / controllers /imageController.js
Samoulla Sync Bot
Auto-deploy Samoulla Backend: b68e45770de26ed39feb4b1c0925e5345eb3a61d
634b9bb
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,
});
}
};