From f940193d17811c41f671edafc37314d58890c003 Mon Sep 17 00:00:00 2001 From: hardcodder Date: Sat, 10 Apr 2021 13:17:40 +0530 Subject: [PATCH] Adding course model and functionalities --- app.js | 13 +- controllers/admin.js | 110 ++++++++++++ controllers/auth.js | 7 +- controllers/course.js | 112 ++++++++++++ controllers/payment.js | 153 ++++++++++++++++ controllers/profile.js | 12 +- models/Course.js | 50 ++++++ models/CourseType.js | 25 +++ models/Order.js | 28 +++ models/Student.js | 9 +- models/User.js | 5 + package-lock.json | 387 ++++++++++++++++++++++++++++++++++++++++- package.json | 6 +- payment1.json | 60 +++++++ routes/admin.js | 12 ++ routes/course.js | 12 ++ routes/payment.js | 13 ++ 17 files changed, 1000 insertions(+), 14 deletions(-) create mode 100644 controllers/admin.js create mode 100644 controllers/course.js create mode 100644 controllers/payment.js create mode 100644 models/Course.js create mode 100644 models/CourseType.js create mode 100644 models/Order.js create mode 100644 payment1.json create mode 100644 routes/admin.js create mode 100644 routes/course.js create mode 100644 routes/payment.js diff --git a/app.js b/app.js index 88881f1..5133e25 100644 --- a/app.js +++ b/app.js @@ -3,6 +3,10 @@ const mongoose = require('mongoose') ; const bodyparser = require('body-parser') ; const authRoute = require('./routes/auth') ; const profileRoute = require('./routes/profile') ; +const paymentRoute = require('./routes/payment') ; +const courseRoute = require('./routes/course') ; +const adminRoute = require('./routes/admin') ; +const cors = require('cors') ; //const passport = require('passport'); //const cookieSession = require('cookie-session') ; //require('./passport-setup') ; @@ -11,6 +15,7 @@ const app = express() ; const MONGO_URI = `mongodb+srv://Cantilever:Cantilever@cluster0.dqxva.mongodb.net/myFirstDatabase?retryWrites=true&w=majority` +app.use(cors()) ; app.use(bodyparser.json()) ; // app.use(cookieSession({ @@ -71,11 +76,17 @@ app.use(bodyparser.json()) ; app.use(authRoute) ; app.use(profileRoute) ; + +app.use(paymentRoute) ; + +app.use(courseRoute) ; + +app.use(adminRoute) ; mongoose.connect(MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true }). then(result => { console.log('connected'); - app.listen(3000) ; + app.listen(5000) ; }) .catch(err => { console.log(err); diff --git a/controllers/admin.js b/controllers/admin.js new file mode 100644 index 0000000..1e72ba2 --- /dev/null +++ b/controllers/admin.js @@ -0,0 +1,110 @@ +const Course = require('../models/Course') ; + +module.exports.addSchedule = async (req , res , next) => { + try + { + //we will take startTime , endTime and link as input + const startTime = req.body.startTime ; + const endTime = req.body.endTime ; + const link = req.body.link ; + + //we will alse take CourseId as input + const parCourseId = req.body.parCourseId ; + const course = await Course.findById(parCourseId) ; + const meetings = [...course.meetings] ; + let newMeet = { + startTime : startTime , + endTime : endTime , + link : link + } ; + //pushing the new schedule + meetings.push(newMeet) ; + course.meetings = meetings ; + await course.save() ; + res.json({ + success : "added schedule" + }) + } + catch(err) + { + res.json({ + err : "Can not add" + }) + } +} + +module.exports.deleteSchedule = async (req , res , next) => { + try{ + //we need index as input + const index = req.body.index ; + + //we need courseId + const parCourseId = req.body.parCourseId ; + const course = await Course.findById(parCourseId) ; + const meetings = [...course.meetings] ; + if(index < (meetings.length)) + { + meetings.splice(index , 1) ; + course.meetings = meetings ; + await course.save() ; + res.json({ + success : "deleted schedule" + }) + } + else + { + res.json({ + err : "Index out of bound" + }) + } + } + catch(err) + { + res.json({ + err : "Can not delete" + }) + } +} + +module.exports.editSchedule = async (req , res , next) => { + try{ + //we will take startTime , endTime and link as input + const startTime = req.body.startTime ; + const endTime = req.body.endTime ; + const link = req.body.link ; + + //we need to take the index as input + const index = req.body.index ; + + //we will take courseId as input + const parCourseId = req.body.parCourseId ; + const course = await Course.findById(parCourseId) ; + const meetings = [...course.meetings] ; + if(index < (meetings.length)) + { + let newMeet = { + startTime : startTime , + endTime : endTime , + link : link + } ; + meetings[index] = newMeet ; + course.meetings = meetings ; + await course.save() ; + res.json({ + success : "edited schedule" + }) + } + else + { + res.json({ + err : "Index out of bound" + }) + } + } + catch(err) + { + res.json({ + err : "Can not edit" + }) + } +} \ No newline at end of file diff --git a/controllers/auth.js b/controllers/auth.js index b12ddf4..400e0c9 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -9,7 +9,7 @@ module.exports.Protected = async (req,res,next)=>{ } module.exports.postSignup = async (req , res , next) => { try - { + { //we need firstName , lastName , email , password as input let firstName = req.body.firstName || " " ; let lastName = req.body.lastName || " " ; let email = req.body.email ; @@ -36,7 +36,9 @@ module.exports.postSignup = async (req , res , next) => { let student = new Student({ user:user._id }) - await student.save() ; + student = await student.save() ; + user.student = student._id ; + await user.save() ; res.json({ message:"Successfully signed Up" , type:"success" @@ -53,6 +55,7 @@ module.exports.postSignup = async (req , res , next) => { module.exports.postSignin = async (req , res , next) => { try { + //we need email and password as input let email = req.body.email ; let password = req.body.password ; let user = await User.findOne({email : email}) ; diff --git a/controllers/course.js b/controllers/course.js new file mode 100644 index 0000000..ace5b77 --- /dev/null +++ b/controllers/course.js @@ -0,0 +1,112 @@ +const Course = require('../models/Course') ; +const CourseType = require('../models/CourseType') ; + +module.exports.postAddCourse = async (req , res , next) => { + try + { + //we will take input as name , mentor and totalLectures + let name = req.body.name ; + let mentor = req.body.mentor ; + let totalLectures = req.body.totalLectures ; + if(name) + { + name = name.trim() ; + } + if(mentor) + { + mentor = mentor.trim() ; + } + if(totalLectures) + { + totalLectures = Number(totalLectures) ; + } + + let course = new Course({ + name : name , + mentor : mentor , + totalLectures : totalLectures + }) ; ; + + course = await course.save() ; + + //tier 1 + let tier1 = new CourseType({ + name : course.name , + amount : 7000 , + tier : 1 , + course : course._id + }) + tier1 = await tier1.save() ; + + //tier 2 + let tier2 = new CourseType({ + name : course.name , + amount : 5000 , + tier : 2 , + course : course._id + }) + tier2 =await tier2.save() ; + + //tier 3 + let tier3 = new CourseType({ + name : course.name , + amount : 3000 , + tier : 3 , + course : course._id + }) + tier3 = await tier3.save() ; + + course.types.tier1 = tier1 ; + course.types.tier2 = tier2 ; + course.types.tier3 = tier3 ; + + await course.save() ; + + res.json({ + success: "Successfully created" + }) + } + catch(err) + { + console.log(err); + res.json({ + error : err + }) + } +} + +module.exports.getAllCourses = async (req , res , next) => { + try + { + //we will be getting all the courses here + const courses = await Course.find().populate("types.tier1").populate("types.tier2").populate("types.tier3") ; + res.json({ + courses : courses + }) + } + catch + { + res.json({ + error : "error" + }) + } +} + +module.exports.meetSchedule = async (req , res , next) => { + try + { + //we need courseTypeId as input + const courseId = req.body.courseId ; + + const course = await CourseType.findById(courseId).populate("course") ; + res.json({ + courses : course + }) + } + catch(err) + { + res.json({ + error : "error" + }) + } +} \ No newline at end of file diff --git a/controllers/payment.js b/controllers/payment.js new file mode 100644 index 0000000..eab06f1 --- /dev/null +++ b/controllers/payment.js @@ -0,0 +1,153 @@ +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'); + +//test credentials of razorpay +const instance = new razorpay({ + key_id : 'rzp_test_8YMWcm8JJ4fhzp' , + key_secret : 'jP1P03cD4ShN8Fp7Q3T6BXQo' +}) ; + +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.basicInfo) + { + ind = student.courses.basicInfo.findIndex(course => String(course) == 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(500).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(500).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 || "607142ec6de6df1a31bf509b" ; + const userId = req.user._id ; + let user = await User.findById(userId) ; + let course =await CourseType.findById(courseId) ; + + //we are creating a new order associated to it + //we are setting the paymentSuccess to be false + 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 + const amount = Number(course.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.json({ + id:response.id , + currency : response.currency , + amount : response.amount , + name:(user.firstName + " " + user.lastName) , + email:user.email , + receipt : response.receipt + }); + } + catch(err) + { + console.log(err); + res.json({ + error : "error" + }) + } +} + diff --git a/controllers/profile.js b/controllers/profile.js index 71839ea..6017015 100644 --- a/controllers/profile.js +++ b/controllers/profile.js @@ -1,6 +1,7 @@ const Student = require('../models/Student') ; const User = require('../models/User') ; +//function for trimming strings function trim_arr(arr) { let newArr = arr.map(a => { @@ -12,9 +13,10 @@ function trim_arr(arr) module.exports.getProfile =async (req , res , next) => { try { + //we can get the profile of the user including the courses which user has bought const userId = req.user._id ; let user = await User.findById(userId) ; - let student = await Student.findOne({user : userId}) ; + let student = await Student.findOne({user : userId}).populate("courses.basicInfo") ; res.json({ user:user , student:student @@ -31,9 +33,8 @@ module.exports.getProfile =async (req , res , next) => { module.exports.postProfile = async (req , res , next) => { try { + //Here we are updating the profile of the user const userId = req.user._id ; - - let courses = req.body.courses ; let interests = req.body.interests ; let projects = req.body.projects ; let yearofgrad = req.body.yearofgrad ; @@ -42,10 +43,6 @@ module.exports.postProfile = async (req , res , next) => { let skills = req.body.skills ; let student = await Student.findOne({user : userId}) ; - if(courses) - { - student.courses = trim_arr(courses.split(",")) ; - } if(interests) { student.interests = trim_arr(interests.split(",")) ; @@ -86,6 +83,7 @@ module.exports.postProfile = async (req , res , next) => { } module.exports.deleteUser = async (req , res , next) => { + //here we are deleting the user const userId = req.user._id ; try { diff --git a/models/Course.js b/models/Course.js new file mode 100644 index 0000000..7a3f328 --- /dev/null +++ b/models/Course.js @@ -0,0 +1,50 @@ +const mongoose = require('mongoose'); + +const Schema = mongoose.Schema ; + +const courseSchema = new Schema({ + name : { + type : String , + required : true + } , + mentor : { + type : String , + required : true + } , + totalLectures : { + type : Number , + required : true + } , + meetings : [ + { + startTime : { + type : String , + required : true + } , + endTime : { + type : String , + required : true + } , + link : { + type : String , + required : true + } + } + ] , + types : { + tier1: { + type : mongoose.Types.ObjectId , + ref : 'CourseType' + } , + tier2 : { + type : mongoose.Types.ObjectId , + ref : 'CourseType' + } , + tier3: { + type : mongoose.Types.ObjectId , + ref : 'CourseType' + } + } +}) ; + +module.exports = mongoose.model('Course' , courseSchema) ; \ No newline at end of file diff --git a/models/CourseType.js b/models/CourseType.js new file mode 100644 index 0000000..3fd82eb --- /dev/null +++ b/models/CourseType.js @@ -0,0 +1,25 @@ +const mongoose = require('mongoose') ; + +const Schema = mongoose.Schema ; + +const courseTypeSchema = new Schema({ + name : { + type : String , + required : true + } , + tier : { + type:Number , + required : true + } , + amount : { + type : Number , + required : true + } , + course : { + type : mongoose.Types.ObjectId , + ref : 'Course' , + required : true + } +}) + +module.exports = mongoose.model('CourseType' , courseTypeSchema) ; \ No newline at end of file diff --git a/models/Order.js b/models/Order.js new file mode 100644 index 0000000..2be1af8 --- /dev/null +++ b/models/Order.js @@ -0,0 +1,28 @@ +const mongoose = require('mongoose') ; + +const Schema = mongoose.Schema ; + +const orderSchema = new Schema({ + user : { + type:mongoose.Types.ObjectId , + ref:'User' , + required:true + } , + course : { + type: mongoose.Types.ObjectId , + ref : 'CourseType' , + required : true + }, + paymentSuccess : { + type:Boolean , + required : true + } , + paymentDetail : { + type:Object + } , + orderId : { + type : String + } +}) ; + +module.exports = mongoose.model('Order' , orderSchema) ; \ No newline at end of file diff --git a/models/Student.js b/models/Student.js index 6ed58af..4149075 100644 --- a/models/Student.js +++ b/models/Student.js @@ -14,7 +14,14 @@ const studentSchema = new Schema({ } , courses:[ { - type:String + basicInfo : { + type:mongoose.Types.ObjectId , + ref : 'CourseType' , + required : true + } , + details : { + type : Object + } } ], interests:[ diff --git a/models/User.js b/models/User.js index 1ddf3f8..d95f570 100644 --- a/models/User.js +++ b/models/User.js @@ -20,7 +20,12 @@ const userSchema = new Schema({ } , googleId : { type : String + } , + student : { + type : mongoose.Types.ObjectId , + ref: 'Student' } + //need to add isAdmin }) ; module.exports = mongoose.model("User" , userSchema) ; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b1147f0..7a2cb34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,6 +56,17 @@ "negotiator": "0.6.2" } }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-align": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", @@ -108,6 +119,39 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -119,6 +163,14 @@ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, "bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -249,6 +301,11 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -328,6 +385,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -402,12 +467,34 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -437,6 +524,11 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, "denque": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", @@ -467,6 +559,15 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -553,6 +654,26 @@ "vary": "~1.1.2" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -576,6 +697,21 @@ "unpipe": "~1.0.0" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -602,6 +738,14 @@ "pump": "^3.0.0" } }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -645,6 +789,20 @@ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -675,6 +833,16 @@ "toidentifier": "1.0.0" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -793,8 +961,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-yarn-global": { "version": "0.3.0", @@ -807,12 +974,37 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, "jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -837,6 +1029,17 @@ } } }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -887,6 +1090,11 @@ "package-json": "^6.3.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -1086,6 +1294,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -1152,6 +1365,16 @@ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -1276,6 +1499,11 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -1293,6 +1521,14 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -1302,6 +1538,11 @@ "ipaddr.js": "1.9.1" } }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, "pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -1318,6 +1559,11 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -1348,6 +1594,16 @@ "unpipe": "1.0.0" } }, + "razorpay": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/razorpay/-/razorpay-2.0.6.tgz", + "integrity": "sha512-tWdV+WfRuuQSGQcGtUXmsPx5WO3QPrEKegy+AbGWT1STD5kxIYW0KHjdspu7YnTTP3q7ekwHDUYYjG8zSR5IiQ==", + "requires": { + "promise": "^8.0.1", + "request": "^2.88.0", + "request-promise": "^4.2.2" + } + }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -1406,6 +1662,59 @@ "rc": "^1.2.8" } }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "requires": { + "lodash": "^4.17.19" + } + }, "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -1513,6 +1822,14 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "shortid": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", + "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", + "requires": { + "nanoid": "^2.1.0" + } + }, "sift": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", @@ -1538,11 +1855,32 @@ "memory-pager": "^1.0.2" } }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", @@ -1650,11 +1988,33 @@ "nopt": "~1.0.10" } }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, "tsscmp": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -1728,6 +2088,14 @@ "xdg-basedir": "^4.0.0" } }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -1747,11 +2115,26 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", diff --git a/package.json b/package.json index fc1f018..69b7bed 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,15 @@ "bcryptjs": "^2.4.3", "body-parser": "^1.19.0", "cookie-session": "^1.4.0", + "cors": "^2.8.5", + "crypto": "^1.0.1", "express": "^4.17.1", "jsonwebtoken": "^8.5.1", "mongoose": "^5.12.2", "passport": "^0.4.1", - "passport-google-oauth": "^2.0.0" + "passport-google-oauth": "^2.0.0", + "razorpay": "^2.0.6", + "shortid": "^2.2.16" }, "devDependencies": { "nodemon": "^2.0.7" diff --git a/payment1.json b/payment1.json new file mode 100644 index 0000000..4293e13 --- /dev/null +++ b/payment1.json @@ -0,0 +1,60 @@ +{ + "entity": "event", + "account_id": "acc_Gw1LiFWVLVRYkG", + "event": "payment.captured", + "contains": [ + "payment" + ], + "payload": { + "payment": { + "entity": { + "id": "pay_GwUwfzZD7hnooU", + "entity": "payment", + "amount": 50000, + "currency": "INR", + "status": "captured", + "order_id": "order_GwUvksWDBcSdw9", + "invoice_id": null, + "international": false, + "method": "card", + "amount_refunded": 0, + "refund_status": null, + "captured": true, + "description": "Test Transaction", + "card_id": "card_Gw33mMf3bsqqb0", + "card": { + "id": "card_Gw33mMf3bsqqb0", + "entity": "card", + "name": "Gaurav Kumar", + "last4": "1111", + "network": "Visa", + "type": "debit", + "issuer": null, + "international": false, + "emi": false, + "sub_type": "consumer" + }, + "bank": null, + "wallet": null, + "vpa": null, + "email": "test@test.com", + "contact": "+919999999999", + "notes": { + "address": "Razorpay Corporate Office" + }, + "fee": 1000, + "tax": 0, + "error_code": null, + "error_description": null, + "error_source": null, + "error_step": null, + "error_reason": null, + "acquirer_data": { + "auth_code": "892379" + }, + "created_at": 1617900492 + } + } + }, + "created_at": 1617900495 +} \ No newline at end of file diff --git a/routes/admin.js b/routes/admin.js new file mode 100644 index 0000000..4e03cce --- /dev/null +++ b/routes/admin.js @@ -0,0 +1,12 @@ +const express = require('express') ; +const adminController = require('../controllers/admin') + +const router = express.Router() ; + +router.post('/addSchedule' , adminController.addSchedule) ; + +router.post('/editSchedule' , adminController.editSchedule) ; + +router.post('/deleteSchedule' , adminController.deleteSchedule) ; + +module.exports = router ; \ No newline at end of file diff --git a/routes/course.js b/routes/course.js new file mode 100644 index 0000000..e624c02 --- /dev/null +++ b/routes/course.js @@ -0,0 +1,12 @@ +const express = require('express') ; +const courseController = require('../controllers/course') ; + +const router = express.Router() ; + +router.post('/addCourse' , courseController.postAddCourse) ; + +router.get('/getAllCourses' , courseController.getAllCourses) ; + +router.post('/meetSchedule' , courseController.meetSchedule) ; + +module.exports = router ; \ No newline at end of file diff --git a/routes/payment.js b/routes/payment.js new file mode 100644 index 0000000..67de290 --- /dev/null +++ b/routes/payment.js @@ -0,0 +1,13 @@ +const express = require('express') ; + +const authMiddleware = require('../middleware/requirelogin') ; + +const paymentController = require('../controllers/payment') ; + +const router = express.Router() ; + +router.post('/verification' , paymentController.postVerify) ; + +router.post('/razorpay' ,authMiddleware , paymentController.postRazorpay) ; + +module.exports = router ; \ No newline at end of file