From e680dcaad15354de3e32a9a332855c4933128252 Mon Sep 17 00:00:00 2001 From: rishav_dml Date: Tue, 28 Jan 2025 16:20:32 +0530 Subject: [PATCH] Fixed: HeroImage upload bug fixed --- .../Screenshot from 2025-01-23 10-50-04.png | Bin 0 -> 6948 bytes backend/controllers/HeroImage.controller.js | 46 +++++++++++++----- backend/package-lock.json | 31 ++++++++++++ backend/package.json | 1 + backend/routes/HeroImage.route.js | 2 +- backend/utils/CloudinaryClient.js | 38 +++++++++++++++ 6 files changed, 104 insertions(+), 14 deletions(-) create mode 100644 backend/Screenshot from 2025-01-23 10-50-04.png create mode 100644 backend/utils/CloudinaryClient.js 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 0000000000000000000000000000000000000000..9140f484ac2e8fe7cc37e259d4ac9bc3e3a2ecac GIT binary patch literal 6948 zcmeHM`9IX_+aHzcsHkufLM4T4A!Kbql%0`1N0Y6wuVYJ+6Crz%Eo2>2vSb-k$vUC2 z#@Mp2$ujokxjyIl;k=&ne9wRI^?H>tGoR1g_jOFqm%f>8h-6_y{4vr5Pp0Q-un~&KIx`>$4$@izMH3|3kGHF;E2Ttxmvkk zFb=LZj&AdNNeb|$OURq9yI?HcY#kkV^lh;il)jC-i|aj0Z=OryJnEJX?v^g_Q1p@{ zkC^BcNzp5!5?Fm&~{ zlIC6(*6F}3mVBjDG|MlgnZV_AeS9#Fvi6K#WLvhurkDN=op*f>b>GrXqPgzKd8y`<`c|0;QBI!1%ZRXkUe%{YH2xG*4`N0c5t(1a@Q?e;-Ue%H0 zF(||L=gz(4VsugwJw9Yk#PLf>8H(Tk`mNZu zJvJ#Re}L$dy1ccqJe48iIzIV?!$Eq=+e?mXdt8b{5eZl)$869a zB0FEjtjWR3npMvoVA}phV>6Y>Nv|u6S6Njx-=xf8aotx)^hz;H85M7_J#EM?<t=0YgomCPhkcgwTy^?X2u&O(Z?JZV|mVo~o zx-W@~yU*auQgokd+`M(Go&JO=58U-_!?8+deSKYM^;!!`O-+qm(k>RaGMn3lH_6Y- zQzf!9jNklsqDx7`gFj3=p$Xm$a^cAdMqWP7K9@L}r5&fY=%z87wqN0WC zL<{m~F^*=}USlgZ*IN?PI-zG~mYkQLANTxuTHxLTb~{_^72}EaiB;w;U8|}%qItjP zpx^W$iPT$cdsfY^zoG<3n?9F7#(23|$BR$-+=C;iSZoqx<>q$8U04%g>DjA!^X9i0 zErndt4vk=3=`m+(p?&}U8!o?Piq)_QLE$qkP$3F7KJ&A3zU%qv>(Iysrlx&E&QRQw z;`b+q!$i<_c6ogcWz}oLhww)4RSZp?gDX7d@~($4+EQLC<9603FjS8Wix7-a;w4O| zaOLbJ_u20{4rM0rX>Fs8F_M@jmfE^HyOFx^jnNn_38x_?jTAW}vkEsIEEd1GwB)|K zy_#Q9VcaG)QOo5sD^^=uoBQFz9TDPk^zTB(y!Fn!YGwT%NrlxLcF?^1M-NWIhA7CU zs;cCglccnQ_8)13GfnS#Z+$D;e<93bGD7y}H`tY=^Y9lH(wlb6PmkzvKY~xhzIc%X zFv3_{+kbr_W?W*|DK=9(=3+bA5Vg_M>i_21v%>}k22&;7=I!SL0dkDy^`mtfCW>1}aMrK4j2WWQm&qQ~N>9RN zY;WeVvnrGLvVqVl%``E&HYskRWWbKEkV)xn0%>Q%*5W2K<#=l<;Q*J{(1!)QA@>i( zorTDX`RdIGSvh-rxSA-{A||p64<~nAC1@7(>qHVBxql7yZr?yU&6lY zV(phNIcaH1?(XhzAzW^7FS2gTrEy{@_stuXiC3->Z#0whK7YQ3{r>i9G|Pz-**Q5E zSWlb~l#ww4deMX9tcy66&!n)XwD$m`J{lblh~cc)NmcOURh#L;+b_?^^a}_GEdL1M z7Lb)SX>4q)?>BiV?fjbW_6r`hyn=$*)(QK!JDl|tz&*?1{RaB_9g~=V?$X~vY7kf< zcfTu|6Lf$n4;pV{&M_cgi6@O!5dF%@r{r$+6lf zUHc}7ltXOhd~#jUMa=#CO;Cl>QnWwG!q(Q7UD3Y^T9ejeoyxDEV2+@|&8=8nU7h9N zK7iME9(Cb_Tjm5qcz14YZpGA_Bz;}o*K^b|GT;nAS1}wacxEOO+8w#m@bGZ)y~gMU zU#OLl(aUS;&zqW>cyo2gj*J%m>sj!!gzuV@kWta&NX{D>-n@uhd3$>|yG)k(w@L{M z|9rfFFT+wV!|~aSe|-rx{rUY}#>VPA!AZIR*xm#-($Q&Xfe+#KUwh##6OrNbvs@Lp z-}r-5`f+AvNuQMm#HAKl++yST&N4>}+Dtb=jZOhK0NR?Mus+JHtgL*>^@XUUqydFO zS=`*Nm@B2~o0?t(716%HQttJo6x;7Tk-V|ot_9H1%GF9$XliVHy3Y$FBT+G+IyyQ! zHa0es{?P9iK=Ys?#w35@p1_AKG83H1uoeM9K|O#qD?>2S8kg5;uNdPoxu6XQjh|Bk zDy-kK)ZM++?abMnENd9{yHIG~t7?B@ha)vc{=n88HYPgyH6=q;knOPD*4jc7ncPn6 zwjfNkXV26t?z{u`aQ{5ld7OcP0TG%b9G7o*o4SSdE1gueC2^s&aYX0Ahn(QV^*d8y%e- z+}$Yy0;={*%$V5y!mM>cL_`Y#9d3Ct{p;7;ek(oJ>bGylcF!2_9R0?<^XoudLIQct zLy(hEwa$iG3d-&Ib*ap8u<*;58wjQ&Mr?qvdp|g5JYhVQ_s*(*IxoM_&WWL>6f3{8 zHgcqeF4bne8B2~Avg^!?L*6q+PLSGM{6$LdnLp?cL~jQc1_vJ-x#^{@9tvv%9vB=- z=wF^{2c$$=?ddCbwf2_dii?k*9*IR;(OkJi=&0OB$GJ-ym* zGv!xb^Vvwb*T7*nc8Ey7{us!h5Bg+P*w9DxDO>s3pYPf#ZwO3QG2k;VPh1-gt0x|8 zEXDePI8KAJ8D-ER7rAZDl_9bNwEFZm2SYFmGjm3NrRNNMKAPmeEphiFij|d>AG9FV zey()=Tr?;8u}o$$`pL9siEP|t-!U-!QJXlBf$S~L!EZtBrLTT z3IOMPZ2e>}DS#9j7S;*$13uMmX}sCE!Y!BK&>^k0Ezsgyy7xHa;^KOXFk!s5HBXLI z{CL8Flwf6!%I#V)WusxF;KcXq=HQo~Q`xCqU!F2+ZPMQf*xek|T3c(&x^+$sSv9t- z|M&Hccp;NBijV6@7QEQ~oI^*XqiU{!-DulYtt=OITG-r9l(3CPWEeCYt++vnl(^S$ zR3lMh>I12RB%eYSA(@WUM;aO!#O*9+E9QdpfL+IR&%}|(qDQ2St9{EiR_5|Q1s%vQ zF4m7O{-ZXOFS%X8?DLPe09?jXS29}_cTK?;big_yo=#I{HYZ(igDZ1$x{7%6nBAgk zd1q^WVd2jgiVTe03KyxRS|5nup2GNq=JkEIY26zjL$pP*$V|M610^fLJP-QH22|uc zjcC043TWLRA1&!M2O?C2t<-7n*zM!Q?=X#Lr0z~;MA{*OFYT0ua9lyb#pajd6CVtn z12)&sZ}{6hV-_Nn6LMOcnsi-UT!LywKd!#Zbo|44p16uYsBMyx5q@~I?Uo3(!wuY- zt|*&60&FI3|K4~D(s@4q#eu#9+`igGpVf%1)yl!`Ldw#Tms}CnL`$9)s}jMPtEITD zFD51i9yA~$B{d~Qm|RqBRnJIV>9t1+x8)xYWZP9>lo1-rfVld-`wwetXoQ1>piGLT zXtv5NJrgEvxggPHgGLD0P7aWp8z7pbYv+9Wp+A+h)DN=p>8^G>W~$G%HEwyAn>xO_ z357TZ@S!N5khFb3BNr&9?!c>4FRfE3`Go4c+OQMk(mA~W^X#Ugi)J1@n5eTn>Dm`u zerN*_p^n42+y!$_q(ZD+LS?(; zAab^QndH*IUP6$O!uf!FX~D9bot>kSmX>F_wYVZxOG-)rfVw)XMqOfKttJg71&Y&C06kCo2&EPio5Gt;hZwM zNCulL8}v73G<#BGi75FAGq)%%|250??H#>}7r8#GKXE_HCqR1&^6~_dJqNs9II}4s zH9%3Psikqr$@q!X0CNCX)OB|nM2M0HJ(v33+BLv(wiRK>`sU{TZB`Dy(bLm|?Tv#Y zFAU+r-9%U#N(AskO!y3}CK73^m*Uny0k>g`h=79~DRJn(f-DpAMLXDB_U*37N00U( zZnN9m2M?Z&uHU)-6!Zy{sA3|;XPKhPoxHem#o*-0lNGcs6O0l19#corMG#=9B@q7% zBqsG!_14BF4gnd3ZCXS+N}fxEwZ_YODw z^n9`3=8B3&I~y43E(or$x5D0D<7C$s85d4fxG)^&udE!bur{=J`&Wo!2XKj`L!UHc z5cOy@!5j~UsN7U|uCH7VsWG2MVrESU6986|Nq+eozsT-A__+WkZN6%W(NHO)kzJqg z_N_MJ_l3&({;-o91jYs2skSO?7J#s_aB~yD4bJtv&;C?uu<|Qpr5S{1A@Pqbt;4JW57kszxufaslPmz{ zIGjUDrF#AW6|JKa6@Ss_b%KSzj7#(C7S&C!ZbqX%=qZts_$CJPWA=y_= z?df07K))QRtMJ?O=qbgot$9HWz$~OLE^4XF4-iZKsAV{%;QOH`K5*BpaCUY!MqvR= z)^VBDH9yE1Zhe&|r~IM}wnqjfg%Y*&O3!IN_?C7xO7X(4L2&bun>rsiHtB|DJ7*2A za^uAuukS$(J^1zqokJ6skPivW2WM_ z@f)#1uX>P&Jk-*1YYE{R)Lj zYn0x1FsGj-YzT1&>FyvwkN&622tAEV9{$A%tD;x~>UJ1d} z%MFZB9^^iF@5A`#FjDZ}-e`2@1kckX4)dd|%*=){mt3Hv-HmRNzL^>R`}aFwfVIG% zEPBc1<>YAF+UB;kx5JrbZEg8tdy14xv4W>hUxmSxx~3-D-MysLp+9eXb2Z5y51%Op z=P>F~2^rAB7Sz9J%bx`BfH3r?xLATV-FYh-rVDY2iFpuYUcWvAK%F|ExE2T+Spd&C z^jG9s)ki?%=xS<4M90Ly048m6(&h-8s1o4*iG=_Pb>8~RpT{7s)_5umq+dS}&L;L+ zZAs2|?Je|ag0NZa%a{DC03oh{GRIW#71l{%r*a{;U{XFx1Fu(z(Va&2zmUKGmM6li7tVYW0t+2Z2j z{z&(!Hszk49)zgu?CjX(TY-i;J34aUa=XE5q8!9EBT{KX$K9gtni%Y^44^7TUM)nfI@u*OteG5mIUhpV+wU@DK>_eHc7dTtPq|z zFf!^HT^}DCvxW394Vgy{c(wb4g>O1k77@Yl#6U1cyQ`bq(V1{~FkTW|q{WMZTsWRiN>J$&v}st>DrT-%oD-ydW2f4+5nJVKPX*Z(a{5uEf4uKwMl8QgL+V;-ZUD{5dd9cF&=w_#qN@ z6`J`NkLy7njgH=f*9=uuR7UI%p-`HK9F%|i7byM5G4Effk%P&TnEZYes^v=GA$AxW z|2rQ4{U(2pn*WC0KZnZyiqZeR@js00|69lZ`<29hy9d6<`A1WH+@!-ADfeE<1WM literal 0 HcmV?d00001 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); + } +}