diff --git a/.ebextensions/nodecommand.config b/.ebextensions/nodecommand.config
new file mode 100644
index 0000000..b487bd4
--- /dev/null
+++ b/.ebextensions/nodecommand.config
@@ -0,0 +1,4 @@
+option_settings:
+ - namespace: aws:elasticbeanstalk:container:nodejs
+ option_name: NodeCommand
+ value: "npm start"
\ No newline at end of file
diff --git a/app.js b/app.js
index 180c92c..39e085a 100644
--- a/app.js
+++ b/app.js
@@ -13,6 +13,7 @@ const blogRouter = require("./routes/blog");
const port = process.env.PORT || 5000;
const cors = require("cors");
+
//const passport = require('passport');
//const cookieSession = require('cookie-session') ;
//require('./passport-setup') ;
diff --git a/controllers/auth.js b/controllers/auth.js
index 633fe4c..fa88481 100644
--- a/controllers/auth.js
+++ b/controllers/auth.js
@@ -17,11 +17,11 @@ const smtpTransport = require("nodemailer-smtp-transport");
var transport = nodemailer.createTransport(
smtpTransport({
- host: `${process.env.HOST}`, //`${process.env.HOST}`
+ host: "email-smtp.us-east-1.amazonaws.com", //`${process.env.HOST}`, //`${process.env.HOST}`
port: 465,
auth: {
- user: `${process.env.EMAIL}`, //`${process.env.EMAIL}`
- pass: `${process.env.PASS}`, //`${process.env.PASS}`
+ user: "AKIA2G7743RR3HEMJ6V5", //`${process.env.EMAIL}`, //`${process.env.EMAIL}`
+ pass: "BA5XVsIOnbDRje/Dc8icsYocLYm3x24iHlTamz94528K", //`${process.env.PASS}`, //`${process.env.PASS}`
},
})
);
@@ -39,7 +39,7 @@ module.exports.postSignup = async (req, res, next) => {
const { sending_company_email, email, password, subject } = req.body;
let user = await User.findOne({ email: email });
if (user) {
- res.json({
+ res.status(422).json({
message: "User already exist",
type: "error",
});
@@ -54,6 +54,7 @@ module.exports.postSignup = async (req, res, next) => {
password: hashedPass,
isAdmin: false,
email_otp,
+ signUp_date: Date.now().toString(),
});
user = await user.save();
await Student.deleteOne({ user: user._id });
@@ -119,11 +120,11 @@ module.exports.postSignup = async (req, res, next) => {
OTP: ${email_otp}
Please Navigate to Website to Verify OTP.
+
Facing any issue? Write us at
@@ -220,11 +221,14 @@ module.exports.verfiyemail = 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 }); - if (user) { - if (user.isVerified) { + let { email, password, isGoogle } = req.body; + console.log("req.body", req.body); + let user = await User.findOne({ email }); + if (isGoogle) { + if (user) { + user.isVerified = true; + user.lastLoginDate = Date.now(); + user = await user.save(); const isMatched = await bcrypt.compare(password, user.password); if (isMatched) { const token = jwt.sign({ _id: user._id }, JWT_secret); @@ -239,18 +243,44 @@ module.exports.postSignin = async (req, res, next) => { return; } } else { - res.status(403).json({ - message: "User Not Verified!", + res.json({ + message: "User Doesn't Exists", type: "error", }); return; } } else { - res.status(201).json({ - message: "No user with this email exists", - type: "error", - }); - return; + if (user) { + if (user.isVerified) { + const isMatched = await bcrypt.compare(password, user.password); + if (isMatched) { + const token = jwt.sign({ _id: user._id }, JWT_secret); + user.lastLoginDate = Date.now(); + user = await user.save(); + res.json({ + token: token, + }); + } else { + res.json({ + message: "email and password doesn't match", + type: "error", + }); + return; + } + } else { + res.status(403).json({ + message: "User Not Verified!", + type: "error", + }); + return; + } + } else { + res.status(201).json({ + message: "No user with this email exists", + type: "error", + }); + return; + } } } catch (err) { console.log(err); @@ -411,11 +441,11 @@ module.exports.forgotpassword = async (req, res, next) => { style="background:#ffc600;text-decoration:none !important; font-weight:500; margin-top:35px; color:#111;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;">Reset Password -
+
Facing any issue? Write us at
diff --git a/controllers/blog.js b/controllers/blog.js index f731fde..e862a49 100644 --- a/controllers/blog.js +++ b/controllers/blog.js @@ -119,3 +119,44 @@ module.exports.editBlog = async (req, res, next) => { }; } }; +module.exports.commentBlog = async (req, res, next) => { + const comment = req.body.comment; + const comments1 = { + user: req.user._id, + review: comment, + date: Date.now().toString(), + }; + + try { + if (comment) { + Blog.findByIdAndUpdate( + { _id: req.params.id }, + { + $push: { + comments: comments1, + }, + }, + { new: true } + ) + .populate("comments.user", "_id name") + .exec((err, result) => { + if (err) { + res.status(503).json({ + message: "Some Error Occured!" + err, + }); + } else { + res.status(201).json({ + message: "Comment posted!" + result, + }); + } + }); + } + } catch (err) { + if (err) { + res.status(501).json({ + message: "internal Server error please try again after some time", + err, + }); + } + } +}; diff --git a/controllers/payment.js b/controllers/payment.js index 57ff4fa..4bd3c64 100644 --- a/controllers/payment.js +++ b/controllers/payment.js @@ -1,197 +1,192 @@ -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'); +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 -}) ; + key_id: process.env.KEY_ID, + key_secret: process.env.KEY_SECRET, +}); -module.exports.postVerify =async (req , res , next) => { +module.exports.postVerify = async (req, res, next) => { + try { + //Secret we put in razorpay + const SECRET = "CantileverLabs"; - try - { - //Secret we put in razorpay - const SECRET = 'CantileverLabs' ; + const crypto = require("crypto"); - 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) ; + const shasum = crypto.createHmac("sha256", SECRET); + shasum.update(JSON.stringify(req.body)); + const digest = shasum.digest("hex"); - 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' - }) - } + //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 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' - }) - } + //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); + } 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; } - -} ; - -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 - }); - 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' - }) - } + 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) + ); } - catch(err) - { - console.log(err); - res.status(500).json({ - error : "error" - }) - } -} + 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 }); +}; diff --git a/models/Blog.js b/models/Blog.js index 7ebbcc7..8e7a309 100644 --- a/models/Blog.js +++ b/models/Blog.js @@ -21,5 +21,17 @@ const blogSchema = new mongoose.Schema({ type: Boolean, default: false, }, + comments: [ + { + user: { ref: "User", type: mongoose.Types.ObjectId }, + review: { + type: String, + }, + date: { + type: Date, + }, + }, + ], + user: { ref: "User", type: mongoose.Types.ObjectId }, }); module.exports = mongoose.model("Blog", blogSchema); diff --git a/models/Order.js b/models/Order.js index 2be1af8..c766ae1 100644 --- a/models/Order.js +++ b/models/Order.js @@ -1,28 +1,29 @@ -const mongoose = require('mongoose') ; +const mongoose = require("mongoose"); -const Schema = mongoose.Schema ; +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 - } -}) ; + 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, + }, + date_purchased: Date, +}); -module.exports = mongoose.model('Order' , orderSchema) ; \ No newline at end of file +module.exports = mongoose.model("Order", orderSchema); diff --git a/models/User.js b/models/User.js index 116ec6d..b90f5c8 100644 --- a/models/User.js +++ b/models/User.js @@ -37,6 +37,11 @@ const userSchema = new Schema({ }, passwordResetToken: String, passwordResetExpires: Date, + signUp_date: Date, + lastLoginDate: { + type: Date, + default: Date.now, + }, //need to add isAdmin }); diff --git a/nodemon.json b/nodemon.json index 3eff58c..0d4f4d8 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,12 +1,14 @@ { - "env" : { - "MONGO_USER":"Cantilever", - "MONGO_PASSWORD" :"Cantilever" , - "MONGO_DEFAULT_DATABASE" :"myFirstDatabase" , - "KEY_ID" : "rzp_live_aD9j5WLBGtdQxt" , - "KEY_SECRET" : "o9BDCwYcpNcHyFL5yjiY7OWG" , - "EMAIL" : "AKIA2G7743RRTZMVXE3X" , - "HOST" : "email-smtp.us-east-1.amazonaws.com" , - "PASS" : "BJSjV3jArJfsnk1LhFc/hUmisEyEtbLNGgrRbv0noh8c" + "env": { + "MONGO_USER": "Cantilever", + "MONGO_PASSWORD": "Cantilever", + "MONGO_DEFAULT_DATABASE": "myFirstDatabase", + "KEY_ID": "rzp_live_aD9j5WLBGtdQxt", + "KEY_SECRET": "o9BDCwYcpNcHyFL5yjiY7OWG", + "EMAIL": "AKIA2G7743RR3HEMJ6V5", + "HOST": "email-smtp.us-east-1.amazonaws.com", + "PASS": "BA5XVsIOnbDRje/Dc8icsYocLYm3x24iHlTamz94528K", + "AWS_KEY": "AKIA2G7743RRZXHP4XNL", + "AWS_SEC": "H4gCtDNRRfIPvq32fe9pHD3Q7OmwQ4z8AUm3Boel" } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 91418b9..939582d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -380,6 +380,18 @@ "@types/node": "*" } }, + "@types/chai": { + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.18.tgz", + "integrity": "sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ==", + "dev": true + }, + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, "@types/cors": { "version": "2.8.10", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", @@ -407,6 +419,16 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz", "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==" }, + "@types/superagent": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", + "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, "@types/type-is": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@types/type-is/-/type-is-1.6.3.tgz", @@ -415,6 +437,12 @@ "@types/node": "*" } }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -498,6 +526,12 @@ } } }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -541,6 +575,12 @@ "readable-stream": "^2.0.6" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -574,6 +614,12 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, "async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", @@ -753,6 +799,12 @@ "fill-range": "^7.0.1" } }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "browserslist": { "version": "4.16.6", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", @@ -931,6 +983,35 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-http": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz", + "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==", + "dev": true, + "requires": { + "@types/chai": "4", + "@types/superagent": "^3.8.3", + "cookiejar": "^2.1.1", + "is-ip": "^2.0.0", + "methods": "^1.1.2", + "qs": "^6.5.1", + "superagent": "^3.7.0" + } + }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -958,6 +1039,12 @@ } } }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, "cheerio": { "version": "1.0.0-rc.9", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.9.tgz", @@ -1086,6 +1173,12 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1162,6 +1255,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, "cookies": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", @@ -1279,6 +1378,15 @@ "mimic-response": "^1.0.0" } }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -1347,6 +1455,12 @@ } } }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, "dom-serializer": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz", @@ -1565,6 +1679,12 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, "fast-text-encoding": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", @@ -1617,6 +1737,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flushwritable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", @@ -1637,6 +1763,12 @@ "mime-types": "^2.1.12" } }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "dev": true + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -1772,6 +1904,12 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -1985,6 +2123,12 @@ "flushwritable": "^1.0.0" } }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "gtoken": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.2.1.tgz", @@ -2098,6 +2242,12 @@ "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -2285,6 +2435,12 @@ "loose-envify": "^1.0.0" } }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2361,6 +2517,15 @@ "is-path-inside": "^3.0.1" } }, + "is-ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", + "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=", + "dev": true, + "requires": { + "ip-regex": "^2.0.0" + } + }, "is-npm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", @@ -2385,6 +2550,12 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -2449,6 +2620,15 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -2828,6 +3008,42 @@ "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=" }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2989,6 +3205,221 @@ "minimist": "^1.2.5" } }, + "mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", @@ -3720,6 +4151,12 @@ "pinkie-promise": "^2.0.0" } }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, "pause": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", @@ -3924,6 +4361,15 @@ "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -4299,6 +4745,15 @@ } } }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", @@ -4539,6 +4994,148 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "dev": true, + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "supertest": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.3.tgz", + "integrity": "sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==", + "dev": true, + "requires": { + "methods": "^1.1.2", + "superagent": "^6.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "dev": true, + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4642,6 +5239,12 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -4948,6 +5551,12 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -5110,6 +5719,38 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 21c65ea..b16f1d2 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,10 @@ "main": "app.js", "scripts": { "start:dev": "nodemon app.js", - "start": "node app.js" + "start": "node app.js", + "test": "mocha ||true" }, + "author": "", "license": "ISC", "dependencies": { @@ -37,6 +39,10 @@ "shortid": "^2.2.16" }, "devDependencies": { - "nodemon": "^2.0.7" + "chai": "^4.3.4", + "chai-http": "^4.3.0", + "mocha": "^8.4.0", + "nodemon": "^2.0.7", + "supertest": "^6.1.3" } } diff --git a/readme.md b/readme.md index e511ade..3c3093f 100644 --- a/readme.md +++ b/readme.md @@ -98,8 +98,8 @@ Route : /sendotp Method: POST - Body Params : phoneNumber - Respone : {id:id} id of the transaction. + Body Params : phoneNumber , _id + Respone : {_id} _id is the user id that just signedup . Route : /getotp Method: POST @@ -306,4 +306,4 @@ Route : getTypeQueries Method : POST Requirements : None - Body Params : type \ No newline at end of file + Body Params : type diff --git a/routes/blog.js b/routes/blog.js index 847327c..3a70851 100644 --- a/routes/blog.js +++ b/routes/blog.js @@ -7,8 +7,8 @@ const multerS3 = require("multer-s3"); const aws = require("aws-sdk"); aws.config.update({ - secretAccessKey: `${process.env.AWS_SEC}`, - accessKeyId: `${process.env.AWS_KEY}`, + secretAccessKey: `${process.env.AWS_SEC}`, //`${process.env.AWS_SEC}`, + accessKeyId: `${process.env.AWS_KEY}`, //`${process.env.AWS_KEY}`, region: "ap-south-1", }); @@ -39,4 +39,6 @@ router.post("/deleteBlog/", BlogController.deleteBlog); router.post("/editBlog/", BlogController.editBlog); +router.post("/commentBlog/:id", isAuth, BlogController.commentBlog); + module.exports = router; diff --git a/routes/payment.js b/routes/payment.js index 67de290..cae43fe 100644 --- a/routes/payment.js +++ b/routes/payment.js @@ -1,13 +1,15 @@ -const express = require('express') ; +const express = require("express"); -const authMiddleware = require('../middleware/requirelogin') ; +const authMiddleware = require("../middleware/requirelogin"); -const paymentController = require('../controllers/payment') ; +const paymentController = require("../controllers/payment"); -const router = express.Router() ; +const router = express.Router(); -router.post('/verification' , paymentController.postVerify) ; +router.post("/verification", paymentController.postVerify); -router.post('/razorpay' ,authMiddleware , paymentController.postRazorpay) ; +router.post("/razorpay", authMiddleware, paymentController.postRazorpay); -module.exports = router ; \ No newline at end of file +router.post("/amount", paymentController.amount); + +module.exports = router; diff --git a/test/test.js b/test/test.js new file mode 100644 index 0000000..3d15cae --- /dev/null +++ b/test/test.js @@ -0,0 +1,37 @@ +let chai = require("chai"); +let chaiHttp = require("chai-http"); +let app = require("../app"); +let request = require("supertest"); +let authController = require("../controllers/auth"); +let User = require("../models/User"); + +// //Assertion Style +// chai.should(); +// chai.use(chaiHttp); +// describe("Testing API", () => { +// describe("POST /signup", () => { +// it( +// "should return User already exist if a record found " + +// "with the email provided", +// (done) => { +// chai +// .request(app) +// .post("/signup") +// .end((err, response) => { +// response.should.have.status(422); +// response.body.should.be.a(String); +// done(); +// }); +// } +// ); +// }); +// }); + +test("should ", (done) => { + request(app) + .post("/signup") + .send({ email: "testtt@mail.com", password: "password@11" }) + .then(() => { + request(app).get(); + }); +});