diff --git a/app.js b/app.js index c3b4e48..ca5c804 100644 --- a/app.js +++ b/app.js @@ -1,3 +1,4 @@ + const express = require("express"); const mongoose = require("mongoose"); const bodyparser = require("body-parser"); @@ -9,6 +10,21 @@ const adminRoute = require("./routes/admin"); const port = process.env.PORT || 5000; const cors = require("cors"); + +const express = require('express') ; +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 couponRoute = require('./routes/Coupon') ; +const queryRoute = require('./routes/query') ; +const port=process.env.PORT || 5000; + +const cors = require('cors') ; + //const passport = require('passport'); //const cookieSession = require('cookie-session') ; //require('./passport-setup') ; @@ -74,6 +90,7 @@ require("./models/Coupon"); // req.logout() ; // res.redirect('/') ; // }) + app.use(require("./routes/Coupon")); app.use(authRoute); @@ -98,5 +115,29 @@ mongoose }); }) .catch((err) => { + + +app.use(authRoute) ; + +app.use(profileRoute) ; + +app.use(paymentRoute) ; + +app.use(courseRoute) ; + +app.use(adminRoute) ; + +app.use(couponRoute) ; + +app.use(queryRoute) ; + +mongoose.connect(MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true ,useFindAndModify:false}). +then(result => { + console.log('connected'); + app.listen(port,()=>{ + console.log("server is running on port",port); + }) ; +}) +.catch(err => { console.log(err); }); diff --git a/controllers/auth.js b/controllers/auth.js index d9b71a4..75289d9 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -78,6 +78,7 @@ module.exports.postSignin = async (req, res, next) => { } }; + module.exports.sendOTP = (req, res, next) => { //uNNYosMopvvCW9RTR1tRWJmYC test //llVKD53ve6QRpbCKOHzWBADaS live @@ -89,6 +90,43 @@ module.exports.sendOTP = (req, res, next) => { } else { messagebird.verify.create( phoneNumber, + +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}) ; + if(user) + { + const isMatched = await bcrypt.compare(password , user.password) ; + if(isMatched) + { + const token = jwt.sign({_id:user._id},JWT_secret) + if(!user.numLoggedIn) + { + user.numLoggedIn = 0 ; + } + user.numLoggedIn = user.numLoggedIn + 1 ; + res.json( + { + token:token , + isAdmin : user.isAdmin + } + ) + await user.save() ; + } + else + { + res.json({ + message:"email and password doesn't match" , + type:"error" + }) + } + } + else + { template: "Your verification code is %token", }, diff --git a/controllers/coupon.js b/controllers/coupon.js new file mode 100644 index 0000000..2220624 --- /dev/null +++ b/controllers/coupon.js @@ -0,0 +1,64 @@ +const Coupon = require("../models/Coupon"); + +module.exports.getAllCoupons = async (req , res , next) => { + try + { + const coupons = await Coupon.find() ; + console.log(coupons) ; + res.json({ + coupons : coupons + }) ; + } + catch(err) + { + console.log(err) ; + } +} + +module.exports.addCoupon = async (req , res , next) => { + try + { + const couponCode = req.body.couponCode ; + const percentage = req.body.percentage ; + const numAllowed = req.body.numAllowed ; + + let coupon = await Coupon.findOne({couponCode : couponCode}) ; + if(coupon) + { + res.json({ + error:"coupon already Exist" + }) + } + else + { + let coupon = new Coupon({ + couponCode : couponCode , + percentage : percentage , + numAllowed : numAllowed + }) ; + coupon = await coupon.save() ; + res.json({ + message: "Created Successfully" + }) + } + } + catch(err) + { + console.log(err); + } +} + +module.exports.deleteCoupon = async (req , res, next) => { + try + { + const couponCode = req.body.couponCode ; + await Coupon.deleteOne({couponCode : couponCode}) ; + res.json({ + message: "Deleted Successfully" + }) + } + catch(err) + { + console.log(err); + } +} \ No newline at end of file diff --git a/controllers/course.js b/controllers/course.js index b4b8317..9840e17 100644 --- a/controllers/course.js +++ b/controllers/course.js @@ -1,5 +1,6 @@ const Course = require('../models/Course') ; const CourseType = require('../models/CourseType') ; +const User = require('../models/User') ; module.exports.postAddCourse = async (req , res , next) => { try @@ -8,6 +9,7 @@ module.exports.postAddCourse = async (req , res , next) => { let name = req.body.name ; let mentor = req.body.mentor ; let totalLectures = req.body.totalLectures ; + let route = req.body.route if(name) { name = name.trim() ; @@ -16,6 +18,10 @@ module.exports.postAddCourse = async (req , res , next) => { { mentor = mentor.trim() ; } + if(route) + { + route = route.trim() ; + } if(totalLectures) { totalLectures = Number(totalLectures) ; @@ -24,7 +30,8 @@ module.exports.postAddCourse = async (req , res , next) => { let course = new Course({ name : name , mentor : mentor , - totalLectures : totalLectures + totalLectures : totalLectures , + route : route }) ; ; course = await course.save() ; @@ -147,3 +154,46 @@ module.exports.getTierCourse = async (req , res , next) => { }) } } + +module.exports.getFromRoute = async (req , res , next) => { + try{ + const route = req.query.route ; + const course = await Course.findOne({route :route}).populate("types.tier1").populate("types.tier2").populate("types.tier3") ; + console.log(course); + res.json({ + course : course + }) + } + catch(err) + { + res.json({ + error : "error" + }) + } +} + +module.exports.addClick = async (req , res , next) => { + try + { + const route = req.body.route ; + const userId = req.user._id ; + let user = await User.findById(userId) ; + let clicked = {...user.clicked} ; + if(!clicked[route]) + { + clicked[route] = 0 ; + } + clicked[route] = clicked[route] + 1 ; + user.clicked = clicked ; + await user.save() ; + res.json({ + data : "added click" + }) ; + } + catch(err) + { + res.json({ + error : err + }) + } +} \ No newline at end of file diff --git a/controllers/payment.js b/controllers/payment.js index 7c0210d..394a24f 100644 --- a/controllers/payment.js +++ b/controllers/payment.js @@ -3,7 +3,9 @@ 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 Student = require('../models/Student') ; +const Coupon = require('../models/Coupon') ; +const { getAllCoupons } = require('./coupon'); //test credentials of razorpay const instance = new razorpay({ @@ -103,7 +105,8 @@ module.exports.postRazorpay = async (req , res , next) => { //this route will be called after clicking the payment //here this is the id of courseType - const courseId = req.body.courseId || "6074201a4f355c3e4830dfe0" ; + const courseId = req.body.courseId ; + const couponCode = req.body.couponCode ; const userId = req.user._id ; let user = await User.findById(userId) ; let student =await Student.findById(user.student) ; @@ -113,6 +116,13 @@ module.exports.postRazorpay = async (req , res , next) => { //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 @@ -134,7 +144,11 @@ module.exports.postRazorpay = async (req , res , next) => { const payment_capture = 1 ; //setting the amount according to the course - const amount = Number(course.amount) ; + let amount = Number(course.amount) ; + + amount = amount - amount*discount/100 ; + + amount = Math.ceil(amount) ; const options = {amount : (amount*100).toString() , currency : "INR" @@ -155,6 +169,11 @@ module.exports.postRazorpay = async (req , res , next) => { email:user.email , receipt : response.receipt }); + if(coupon && coupon.numAllowed > 0) + { + coupon.numAllowed = coupon.numAllowed - 1 ; + await coupon.save() ; + } } else { diff --git a/controllers/query.js b/controllers/query.js new file mode 100644 index 0000000..8dc4c39 --- /dev/null +++ b/controllers/query.js @@ -0,0 +1,93 @@ +const Query = require('../models/query') ; + +module.exports.addQuery = async (req , res , next)=> { + try + { + let fullName = req.body.fullName || " " ; + let phoneNumber = req.body.phoneNumber ; + let email = req.body.email ; + let query = req.body.query || " " ; + let other = req.body.other || false ; + let graduationYear = req.body.graduationYear ; + let queryModel = await Query.findOne({email:email , query:query}) ; + if(queryModel) + { + if(!queryModel.numAsked) + { + queryModel.numAsked = 0 ; + } + + queryModel.numAsked = queryModel.numAsked + 1 ; + await queryModel.save() ; + } + else + { + queryModel = new Query ({ + fullName : fullName , + phoneNumber : phoneNumber , + email : email, + query : query , + numAsked : 1 , + graduationYear : graduationYear , + other : other + }) ; + await queryModel.save() ; + } + res.json({ + message : "Saved Query" + }) ; + + } + catch(err) + { + res.json({ + error : err + }) ; + } +} + +module.exports.getQueries = async (req , res , next) => { + try + { + const queries = await Query.find() ; + res.json({ + queries : queries + }) + } + catch(err) + { + res.json({ + error : err + }) + } +} + +module.exports.getOtherQueries = async (req , res , next) => { + try{ + const queries = await Query.find({other : true}) ; + res.json({ + queries : queries + }) + } + catch(err){ + res.json({ + error : err + }) + } +} + +module.exports.getTypeQueries = async (req , res , next) => { + try{ + const type = req.body.type ; + const queries = await Query.find({type:type}) ; + res.json({ + queries : queries + }) + } + catch(err) + { + res.json({ + error:err + }) + } +} \ No newline at end of file diff --git a/models/Coupon.js b/models/Coupon.js index a68a548..20e4fb9 100644 --- a/models/Coupon.js +++ b/models/Coupon.js @@ -1,16 +1,29 @@ const mongoose=require('mongoose') const CouponSchema=new mongoose.Schema({ + coupon_code:{ + + couponCode:{ + type:String, required:true }, percentage:{ + type:String, required:true }, remainingTimes:{ type:Number + + type:Number , + required:true + }, + numAllowed:{ + type:Number , + required:true + } }) -module.exports=mongoose.model("Coupon",CouponSchema) \ No newline at end of file +module.exports = mongoose.model('Coupon' , CouponSchema) ; \ No newline at end of file diff --git a/models/Course.js b/models/Course.js index 7a3f328..c37b7e9 100644 --- a/models/Course.js +++ b/models/Course.js @@ -15,6 +15,10 @@ const courseSchema = new Schema({ type : Number , required : true } , + route: { + type : String , + required : true + } , meetings : [ { startTime : { diff --git a/models/User.js b/models/User.js index a9efe6e..db9528a 100644 --- a/models/User.js +++ b/models/User.js @@ -3,6 +3,7 @@ const crypto = require("crypto"); const Schema = mongoose.Schema; const userSchema = new Schema({ + firstName: { type: String, required: true, @@ -36,4 +37,39 @@ const userSchema = new Schema({ //need to add isAdmin }); + firstName : { + type :String , + required : true + } , + lastName : { + type:String , + required: true + } , + email : { + type:String , + required: true + } , + password : { + type : String + } , + googleId : { + type : String + } , + student : { + type : mongoose.Types.ObjectId , + ref: 'Student' + } , + isAdmin : { + type : Boolean + } , + numLoggedIn : { + type : Number + } , + clicked : { + type : Object + } + //need to add isAdmin +}) ; + + module.exports = mongoose.model("User", userSchema); diff --git a/models/query.js b/models/query.js new file mode 100644 index 0000000..1da09ba --- /dev/null +++ b/models/query.js @@ -0,0 +1,36 @@ +const mongoose = require('mongoose') ; + +const Schema = mongoose.Schema ; + +const querySchema = new Schema({ + fullName : { + type :String , + required : true + } , + phoneNumber : { + type : String , + required : true + } , + email : { + type:String , + required: true + } , + query : { + type:String , + required : true + } , + numAsked : { + type:Number , + required : true + } , + other : { + type : Boolean , + require : true + } , + graduationYear : { + type : Number , + required :true + } +}) ; + +module.exports = mongoose.model('Query' , querySchema) ; \ No newline at end of file diff --git a/routes/Coupon.js b/routes/Coupon.js index 36980c3..7241a15 100644 --- a/routes/Coupon.js +++ b/routes/Coupon.js @@ -1,14 +1,11 @@ const express = require("express"); -const router = express.Router(); -const mongoose = require("mongoose"); -const Coupon = mongoose.model("Coupon"); +const couponController = require('../controllers/coupon') ; + +const isAuth = require('../middleware/requirelogin') ; +const isAdmin = require('../middleware/isAdmin') ; + +const router = express.Router(); -router.get("/get-coupon", (req, res) => { - Coupon.find().then((result) => { - res.status(200).json({ coupon: result }); - console.log(result); - }); -}); router.post("/set-coupon", (req, res) => { const { percentage, coupon_code ,remainingTimes} = req.body; @@ -25,29 +22,12 @@ router.post("/set-coupon", (req, res) => { }); } }); +======= +router.get("/getAllCoupons",isAuth , isAdmin , couponController.getAllCoupons); -router.delete("/delete-coupon", (req, res) => { - Coupon.remove({ _id: req.body.id }).then((result) => { - res.status(200).json({ message: "Coupon Deleted" }); - }); -}); -router.put("/update-coupon", (req, res) => { - const {coupon_code,percentage} =req.body; - Coupon.findByIdAndUpdate( - req.body._id, - { - $set: { - coupon_code,percentage - } - }, - { new: true }) - .then((result) => { - res.status(200).json({ message: result }); - }) - .catch((err) => { - console.log(err); - }); -}); +router.post("/addCoupon", isAuth , isAdmin ,couponController.addCoupon); + +router.post("/deleteCoupon", isAuth , isAdmin ,couponController.deleteCoupon); module.exports = router; diff --git a/routes/course.js b/routes/course.js index afb025b..f763e05 100644 --- a/routes/course.js +++ b/routes/course.js @@ -19,4 +19,8 @@ router.post('/getTierCourse' , courseController.getTierCourse) ; //It is a post request router.post('/getMeetSchedule' ,isAuth , courseController.getMeetSchedule) ; +router.get('/getFromRoute' , courseController.getFromRoute) ; + +router.post('/addClick' , isAuth , courseController.addClick) ; + module.exports = router ; \ No newline at end of file diff --git a/routes/query.js b/routes/query.js new file mode 100644 index 0000000..9ad8e51 --- /dev/null +++ b/routes/query.js @@ -0,0 +1,15 @@ +const express = require('express') ; + +const queryController = require('../controllers/query') ; + +const router = express.Router() ; + +router.post('/addQuery' , queryController.addQuery) ; + +router.get('/getAllQueries' , queryController.getQueries) ; + +router.get('/getOtherQueries' , queryController.getOtherQueries) ; + +router.post('/getTypeQueries' , queryController.getTypeQueries) ; + +module.exports = router ; \ No newline at end of file