diff --git a/backend/Screenshot from 2025-01-23 10-50-04.png b/backend/Screenshot from 2025-01-23 10-50-04.png new file mode 100644 index 0000000..9140f48 Binary files /dev/null and b/backend/Screenshot from 2025-01-23 10-50-04.png differ diff --git a/backend/controllers/HeroImage.controller.js b/backend/controllers/HeroImage.controller.js index 63d7644..a221c17 100644 --- a/backend/controllers/HeroImage.controller.js +++ b/backend/controllers/HeroImage.controller.js @@ -1,4 +1,5 @@ import { PrismaClient } from "@prisma/client"; +import CloudinaryUploadHandler from "../utils/CloudinaryClient.js"; const prisma = new PrismaClient(); @@ -15,30 +16,49 @@ export const uploadHeroImages = async (req, res) => { try { const files = req.files; const heroImages = files.map((file) => file.filename); - const newHeroImages = await prisma.heroImages.create({ - data: { - urls: heroImages, - }, - }); - res.status(201).json({ status: 201, data: newHeroImages }); + const CloudinaryURLs = await heroImages.map((item) => + CloudinaryUploadHandler(`./uploads/${item}`) + ); + Promise.all(CloudinaryURLs) + .then(async (results) => { + console.log("RTesults: ", results); + const newHeroImages = await prisma.heroImages.create({ + data: { + urls: results, + }, + }); + return res + .status(201) + .json({ status: 201, data: newHeroImages }); + }) + .catch((error) => + res.status(500).json({ status: 500, message: error.message }) + ); } catch (error) { res.status(500).json({ status: 500, message: error.message }); } }; export const updateHeroImage = async (req, res) => { + console.log(`req--->`, req); const { id, index } = req.params; try { - const data = await prisma.heroImages.findUnique({where:{id: id}}) - let oldArray = data.urls - oldArray[index] = req.file.filename - const updatedEvent = await prisma.heroImages.update({ - where: { id: id }, + const data = await prisma.heroImages.findUnique({ where: { id: id } }); + console.log(`data---->`, data); + let dataArray = data.urls; + const fileName = req?.file?.filename; + const CloudinaryURL = await CloudinaryUploadHandler( + `./uploads/${fileName}` + ); + console.log("Cloud", CloudinaryURL); + dataArray[index] = CloudinaryURL; + const newHeroImages = await prisma.heroImages.update({ + where: { id }, data: { - urls: oldArray + urls: dataArray, }, }); - res.status(200).json({ status: 200, data: updatedEvent }); + return res.status(200).json({ status: 200, data: newHeroImages }); } catch (error) { res.status(500).json({ status: 500, message: error.message }); } diff --git a/backend/package-lock.json b/backend/package-lock.json index 682add6..342a2a0 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "@prisma/client": "^6.2.1", + "cloudinary": "^2.5.1", "cors": "^2.8.5", "dotenv": "^16.4.7", "express": "^4.21.2", @@ -183,6 +184,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/cloudinary": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.5.1.tgz", + "integrity": "sha512-CNg6uU53Hl4FEVynkTGpt5bQEAQWDHi3H+Sm62FzKf5uQHipSN2v7qVqS8GRVqeb0T1WNV+22+75DOJeRXYeSQ==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21", + "q": "^1.5.1" + }, + "engines": { + "node": ">=9" + } + }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", @@ -594,6 +608,12 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -803,6 +823,17 @@ "node": ">= 0.10" } }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", diff --git a/backend/package.json b/backend/package.json index 21cdb89..14d2900 100644 --- a/backend/package.json +++ b/backend/package.json @@ -7,6 +7,7 @@ }, "dependencies": { "@prisma/client": "^6.2.1", + "cloudinary": "^2.5.1", "cors": "^2.8.5", "dotenv": "^16.4.7", "express": "^4.21.2", diff --git a/backend/routes/HeroImage.route.js b/backend/routes/HeroImage.route.js index 2173d28..a05c599 100644 --- a/backend/routes/HeroImage.route.js +++ b/backend/routes/HeroImage.route.js @@ -12,7 +12,7 @@ const HeroImageRouter = express.Router(); HeroImageRouter.get("/", getHeroImages) .post("/upload", MulterClient.array("heroImages", 10), uploadHeroImages) - .put("/:id/:index",MulterClient.single("heroImages"), updateHeroImage) + .put("/:id/:index", MulterClient.single("heroImages"), updateHeroImage) .delete("/:id", deleteHeroImage); export default HeroImageRouter; diff --git a/backend/utils/CloudinaryClient.js b/backend/utils/CloudinaryClient.js new file mode 100644 index 0000000..14f9464 --- /dev/null +++ b/backend/utils/CloudinaryClient.js @@ -0,0 +1,38 @@ +import { v2 as cloudinary } from "cloudinary"; + +cloudinary.config({ + cloud_name: "ds6sqynn2", + api_key: "814617551846369", + api_secret: "Gx3rvuiGhNDRIu9qBnBvyzM6eew", // Click 'View API Keys' above to copy your API secret +}); + +// // Upload an image +// const uploadResult = await cloudinary.uploader +// .upload( +// "https://res.cloudinary.com/demo/image/upload/getting-started/shoes.jpg", +// { +// public_id: "shoesByRIshav", +// } +// ) +// .catch((error) => { +// console.log(error); +// }); + +// console.log(uploadResult); +// console.log(optimizeUrl); + +export default async function CloudinaryUploadHandler(imagePath) { + const options = { + use_filename: true, + unique_filename: false, + overwrite: true, + }; + + try { + const result = await cloudinary.uploader.upload(imagePath, options); + console.log(result.secure_url) + return result.secure_url; + } catch (error) { + console.error(error); + } +}