193 lines
5.3 KiB
JavaScript
193 lines
5.3 KiB
JavaScript
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: Date.now(),
|
|
});
|
|
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",
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports.amount = async (req, res, next) => {
|
|
const amount = req.body.amount;
|
|
res.status(200).json({ amount: amount / 100 });
|
|
};
|