From e0978f8bb455f422144988e7b0c407cb3d07e639 Mon Sep 17 00:00:00 2001 From: Mohammed Shamel <160044480+Mohamed-shamel1@users.noreply.github.com> Date: Wed, 29 Apr 2026 01:41:41 +0300 Subject: [PATCH 1/2] fix --- controllers/paymentController.js | 51 +++++++++++++++++++++----------- node_modules/.package-lock.json | 16 ---------- services/getTicketService.js | 2 +- services/ticketPageService.js | 2 +- services/ticketService.js | 7 ----- 5 files changed, 35 insertions(+), 43 deletions(-) diff --git a/controllers/paymentController.js b/controllers/paymentController.js index cdbfa14..7f07a23 100644 --- a/controllers/paymentController.js +++ b/controllers/paymentController.js @@ -4,38 +4,53 @@ const { generateTicketsForUser } = require("../services/ticketService"); const handleWebhook = async (req, res) => { try { - const data = req.body.obj; - const success = data.success; - const orderId = data.order.id; + const { type, obj: data } = req.body; + + // Only process transaction webhooks + if (type !== "TRANSACTION") { + return res.sendStatus(200); + } + + const success = data.success === true || data.success === "true"; + const orderId = data.order?.id || data.order; // Handle both object and primitive + + console.log(`Webhook received: Type=${type}, Success=${success}, OrderID=${orderId}`); const user = await User.findOne({ paymobOrderId: orderId }); - if (!user || user.paymentStatus !== "pending") { + if (!user) { + console.log("User not found for orderId:", orderId); return res.sendStatus(200); } - if (!success) { - user.paymentStatus = "failed"; - await user.save(); + // If already paid, don't do anything + if (user.paymentStatus === "paid") { return res.sendStatus(200); } - - if (user.paymentStatus === "failed") { - return res.sendStatus(401).message("Payment failed"); - } - const tickets = await generateTicketsForUser(user); - - user.tickets = tickets; - user.paymentStatus = "paid"; - await user.save(); + if (success) { + // Generate tickets and update status + const tickets = await generateTicketsForUser(user); + user.tickets = tickets; + user.paymentStatus = "paid"; + await user.save(); - console.log("USER PAID:", user.email); + console.log("✅ PAYMENT SUCCESS: User paid and tickets generated:", user.email); + } else { + // Don't mark as 'failed' immediately to allow for subsequent successful attempts + // Just log the failure for now + console.log("❌ PAYMENT ATTEMPT FAILED: OrderID:", orderId, "User:", user.email); + + // Optional: you could update to 'failed' if you want to track it, + // but ensure 'paid' can still overwrite 'failed'. + // user.paymentStatus = "failed"; + // await user.save(); + } return res.sendStatus(200); } catch (err) { - console.log(err); + console.error("❌ WEBHOOK ERROR:", err); return res.sendStatus(500); } }; diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 2dc34a6..aef9fb6 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1275,22 +1275,6 @@ "node": ">= 0.8" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "ideallyInert": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", diff --git a/services/getTicketService.js b/services/getTicketService.js index d80d5c2..491c33f 100644 --- a/services/getTicketService.js +++ b/services/getTicketService.js @@ -15,7 +15,7 @@ const getTickets = async (req, res) => { let showTicketAloneButton = "" for (let t of user.tickets) { const qr = await QRCode.toDataURL( - `https://competition.ieeehsb.com/join?code=${t.code}` + `${process.env.BASE_URL}/join?code=${t.code}` ); if (user.tickets.length > 1) { diff --git a/services/ticketPageService.js b/services/ticketPageService.js index 67160b0..e4ec1ea 100644 --- a/services/ticketPageService.js +++ b/services/ticketPageService.js @@ -23,7 +23,7 @@ const getTicketPage = async (req, res) => { const groupLink = competitionLinks[user.competitionId]; - const qr = await QRCode.toDataURL(code); + const qr = await QRCode.toDataURL(`${process.env.BASE_URL}/join?code=${code}`); res.send(` diff --git a/services/ticketService.js b/services/ticketService.js index 02e5040..c38964c 100644 --- a/services/ticketService.js +++ b/services/ticketService.js @@ -4,8 +4,6 @@ const { generateQR } = require("./qrService"); const competitionLinks = require("../config/competitionLinks"); const generateTicketsForUser = async (user) => { - const groupLink = competitionLinks[user.competitionId]; - let participants = [ { name: user.name, phone: user.phone } ]; @@ -19,15 +17,10 @@ const generateTicketsForUser = async (user) => { for (let p of participants) { const code = generateCode(); - const qr = await generateQR( - `${process.env.BASE_URL}/join?code=${code}` - ); - tickets.push({ name: p.name, phone: p.phone, code, - qr, used: false }); } From 6d8c82b341dfa5063804f259d61dd5c744214315 Mon Sep 17 00:00:00 2001 From: Mohammed Shamel <160044480+Mohamed-shamel1@users.noreply.github.com> Date: Wed, 29 Apr 2026 02:07:41 +0300 Subject: [PATCH 2/2] f --- .gitignore | 36 +++++++- config/db.js | 2 +- index.js | 10 ++- test-frontend/index.html | 173 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 215 insertions(+), 6 deletions(-) create mode 100644 test-frontend/index.html diff --git a/.gitignore b/.gitignore index 2eea525..5bd42fe 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,35 @@ -.env \ No newline at end of file +# Dependencies +node_modules/ +jspm_packages/ + +# Debug logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# OS related files +.DS_Store +Thumbs.db + +# IDEs and editors +.vscode/ +.idea/ +*.swp +*.swo + +# Build outputs +dist/ +build/ +out/ + +# Other +.npm +.eslintcache \ No newline at end of file diff --git a/config/db.js b/config/db.js index e8c3907..309a378 100644 --- a/config/db.js +++ b/config/db.js @@ -3,7 +3,7 @@ const mongoose = require("mongoose"); const connectDB = async () => { try { - await mongoose.connect("mongodb+srv://Menna:T-J2gJB%25xRDqSHQ@cluster0.vnuyztt.mongodb.net/?appName=Cluster0"); + await mongoose.connect(process.env.MONGODB_URI); console.log("DB connected ✅"); } catch (error) { console.log(error); diff --git a/index.js b/index.js index da5c8ea..b65a5a5 100644 --- a/index.js +++ b/index.js @@ -8,10 +8,12 @@ const port = process.env.PORT || 3000; app.use(cors({ origin: [ - "http://localhost:3001", - process.env.FRONTEND_URL -], - credentials: true + "http://localhost:3001", + "http://localhost:5500", // VS Code Live Server + "http://127.0.0.1:5500", + process.env.FRONTEND_URL + ], + credentials: true })); // Middleware to parse JSON bodies diff --git a/test-frontend/index.html b/test-frontend/index.html new file mode 100644 index 0000000..fc23d50 --- /dev/null +++ b/test-frontend/index.html @@ -0,0 +1,173 @@ + + +
+ + +Competition Registration & Payment Integration
+Powered by IEEE HSB | Payment secured by Paymob
+