const razorpay = require("razorpay"); const Order = require("../models/Order"); const User = require("../models/User"); const CourseType = require("../models/CourseType"); const Course = require("../models/Course"); const Student = require("../models/Student"); const Coupon = require("../models/Coupon"); const { getAllCoupons } = require("./coupon"); //test credentials of razorpay const instance = new razorpay({ key_id: process.env.KEY_ID, key_secret: process.env.KEY_SECRET, }); module.exports.postVerify = async (req, res, next) => { try { //Secret we put in razorpay const SECRET = "CantileverLabs"; const crypto = require("crypto"); const shasum = crypto.createHmac("sha256", SECRET); shasum.update(JSON.stringify(req.body)); const digest = shasum.digest("hex"); //if secret is matched if (digest === req.headers["x-razorpay-signature"]) { console.log("request is legit"); // process it const orderId = req.body.payload.payment.entity.order_id; //fetching the order from the orderId let order = await Order.findOne({ orderId: orderId }); let courseId = order.course; //adding the payment detail order.paymentDetail = req.body.payload.payment; //making the paymentSuccess as true order.paymentSuccess = true; //now getting the details of user which has bought this course const userId = order.user; let user = await User.findById(userId); let student = await Student.findById(user.student); let ind = -1; //checking whether user has already bought this course or not if (student.courses) { ind = student.courses.findIndex( (course) => String(course.basicInfo) == String(courseId) ); } console.log(ind); if (ind == -1) { //adding a new object in the courses array of student let newObj = { basicInfo: courseId, details: { completed: [], }, }; let courses = [...student.courses]; courses.push(newObj); student.courses = courses; await student.save(); await order.save(); res.status(200).json({ status: "ok", }); } else { //user has already bought this course res.status(200).json({ error: "already paid", }); } //now updating that course in user also //console.log(req.body.payload.payment) ; //require('fs').writeFileSync('payment1.json', JSON.stringify(req.body, null, 4)) } else { // pass it console.log("HELLO IN ERROR"); res.status(200).json({ error: "error", }); } } catch (err) { console.log(err); } }; module.exports.postRazorpay = async (req, res, next) => { try { //this route will be called after clicking the payment //here this is the id of courseType const courseId = req.body.courseId; const couponCode = req.body.couponCode; const userId = req.user._id; console.log( "Course ID =", courseId, " Coupon code =", couponCode, " user ID =", userId ); let user = await User.findById(userId); let student = await Student.findById(user.student); let course = await CourseType.findById(courseId); console.log(student.courses); //we are creating a new order associated to it //we are setting the paymentSuccess to be false let discount = 0; let coupon = await Coupon.findOne({ couponCode: couponCode }); if (coupon && coupon.numAllowed > 0) { discount = coupon.percentage; } let ind = -1; //checking whether user has already bought this course or not if (student.courses) { ind = student.courses.findIndex( (course) => String(course.basicInfo) == String(courseId) ); } console.log(ind); if (ind == -1) { let order = new Order({ course: courseId, user: userId, paymentSuccess: false, }); order = await order.save(); const payment_capture = 1; //setting the amount according to the course let amount = Number(course.amount); amount = amount - (amount * discount) / 100; amount = Math.ceil(amount); const options = { amount: (amount * 100).toString(), currency: "INR", receipt: order._id.toString(), payment_capture, }; //this is a razorpay feature const response = await instance.orders.create(options); order.orderId = response.id; await order.save(); res.status(200).json({ id: response.id, currency: response.currency, amount: response.amount, name: user.firstName + " " + user.lastName, email: user.email, receipt: response.receipt, date_purchased: response.created_at, }); if (coupon && coupon.numAllowed > 0) { coupon.numAllowed = coupon.numAllowed - 1; await coupon.save(); } } else { //user has already bought this course res.status(500).json({ error: "already paid", }); } } catch (err) { console.log(err); res.status(500).json({ error: "error", }); } };