From f084ec0c400cae6b2933b3b6fece04de084f77f1 Mon Sep 17 00:00:00 2001
From: yashraj verma
Date: Sat, 29 May 2021 14:03:20 +0530
Subject: [PATCH 01/15] Update readme.md
---
readme.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
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
From db6f4210e61abd7d3159d61ab01d52ffba04a30c Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Sat, 29 May 2021 14:42:02 +0530
Subject: [PATCH 02/15] Google isVerified
---
controllers/auth.js | 111 ++++++++++++++++++++++++++------------------
1 file changed, 67 insertions(+), 44 deletions(-)
diff --git a/controllers/auth.js b/controllers/auth.js
index 633fe4c..b956eef 100644
--- a/controllers/auth.js
+++ b/controllers/auth.js
@@ -220,37 +220,54 @@ 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 { email, password, isGoogle } = req.body;
let user = await User.findOne({ email: email });
- if (user) {
- if (user.isVerified) {
- const isMatched = await bcrypt.compare(password, user.password);
- if (isMatched) {
- const token = jwt.sign({ _id: user._id }, JWT_secret);
- res.json({
- token: token,
- });
- } else {
- res.json({
- message: "email and password doesn't match",
- type: "error",
- });
- return;
- }
+ if (isGoogle) {
+ user.isVerified = true;
+ user = await user.save();
+ const isMatched = await bcrypt.compare(password, user.password);
+ if (isMatched) {
+ const token = jwt.sign({ _id: user._id }, JWT_secret);
+ res.json({
+ token: token,
+ });
} else {
- res.status(403).json({
- message: "User Not Verified!",
+ res.json({
+ message: "email and password doesn't match",
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);
+ 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);
@@ -278,30 +295,36 @@ module.exports.postSignin = async (req, res, next) => {
// Phone verification Starts.
// -----------------------------------------------------------------------------------------------
-module.exports.sendOTP = (req, res, next) => {
+module.exports.sendOTP = async (req, res, next) => {
//uNNYosMopvvCW9RTR1tRWJmYC test
//llVKD53ve6QRpbCKOHzWBADaS live
- const { phoneNumber } = req.body;
+ const { phoneNumber, _id } = req.body;
try {
- if (!phoneNumber) {
- res.status(422).json({ message: "Please Add All Required Fields" });
- return;
- } else {
- messagebird.verify.create(
- phoneNumber,
- {
- template: "Your verification code is %token",
- },
- function (err, response) {
- if (err) {
- console.log(err);
- res.status(422).json({ message: err.errors[0].description });
- } else {
- console.log(response);
- res.json({ id: response.id });
+ let user = await User.findOne({ _id });
+ if (user) {
+ if (!phoneNumber) {
+ res.status(422).json({ message: "Please Add All Required Fields" });
+ return;
+ } else {
+ messagebird.verify.create(
+ phoneNumber,
+ {
+ template: "Your verification code is %token",
+ },
+ function (err, response) {
+ if (err) {
+ console.log(err);
+ res.status(422).json({ message: err.errors[0].description });
+ } else {
+ console.log(response);
+ res.json({ id: response.id });
+ }
}
- }
- );
+ );
+ }
+ } else {
+ res.status(422).json({ error: "User Doesn't Exists!" });
+ return;
}
} catch (err) {
console.log(err);
From 51238a4d968d7f99feda25a084aedd521970a448 Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Sat, 29 May 2021 18:06:18 +0530
Subject: [PATCH 03/15] Done!
---
controllers/auth.js | 49 ++++++++++++++++++++-------------------------
1 file changed, 22 insertions(+), 27 deletions(-)
diff --git a/controllers/auth.js b/controllers/auth.js
index b956eef..47ae245 100644
--- a/controllers/auth.js
+++ b/controllers/auth.js
@@ -221,7 +221,8 @@ module.exports.postSignin = async (req, res, next) => {
try {
//we need email and password as input
let { email, password, isGoogle } = req.body;
- let user = await User.findOne({ email: email });
+ console.log("req.body", req.body);
+ let user = await User.findOne({ email });
if (isGoogle) {
user.isVerified = true;
user = await user.save();
@@ -295,36 +296,30 @@ module.exports.postSignin = async (req, res, next) => {
// Phone verification Starts.
// -----------------------------------------------------------------------------------------------
-module.exports.sendOTP = async (req, res, next) => {
+module.exports.sendOTP = (req, res, next) => {
//uNNYosMopvvCW9RTR1tRWJmYC test
//llVKD53ve6QRpbCKOHzWBADaS live
- const { phoneNumber, _id } = req.body;
+ const { phoneNumber } = req.body;
try {
- let user = await User.findOne({ _id });
- if (user) {
- if (!phoneNumber) {
- res.status(422).json({ message: "Please Add All Required Fields" });
- return;
- } else {
- messagebird.verify.create(
- phoneNumber,
- {
- template: "Your verification code is %token",
- },
- function (err, response) {
- if (err) {
- console.log(err);
- res.status(422).json({ message: err.errors[0].description });
- } else {
- console.log(response);
- res.json({ id: response.id });
- }
- }
- );
- }
- } else {
- res.status(422).json({ error: "User Doesn't Exists!" });
+ if (!phoneNumber) {
+ res.status(422).json({ message: "Please Add All Required Fields" });
return;
+ } else {
+ messagebird.verify.create(
+ phoneNumber,
+ {
+ template: "Your verification code is %token",
+ },
+ function (err, response) {
+ if (err) {
+ console.log(err);
+ res.status(422).json({ message: err.errors[0].description });
+ } else {
+ console.log(response);
+ res.json({ id: response.id });
+ }
+ }
+ );
}
} catch (err) {
console.log(err);
From 812cc70ae9ebe7ac0c30fdd478ed69bf53ed796d Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Mon, 31 May 2021 13:13:31 +0530
Subject: [PATCH 04/15] Done!
---
controllers/auth.js | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/controllers/auth.js b/controllers/auth.js
index 47ae245..6db904c 100644
--- a/controllers/auth.js
+++ b/controllers/auth.js
@@ -224,17 +224,25 @@ module.exports.postSignin = async (req, res, next) => {
console.log("req.body", req.body);
let user = await User.findOne({ email });
if (isGoogle) {
- user.isVerified = true;
- user = await user.save();
- const isMatched = await bcrypt.compare(password, user.password);
- if (isMatched) {
- const token = jwt.sign({ _id: user._id }, JWT_secret);
- res.json({
- token: token,
- });
+ if (user) {
+ user.isVerified = true;
+ user = await user.save();
+ const isMatched = await bcrypt.compare(password, user.password);
+ if (isMatched) {
+ const token = jwt.sign({ _id: user._id }, JWT_secret);
+ res.json({
+ token: token,
+ });
+ } else {
+ res.json({
+ message: "email and password doesn't match",
+ type: "error",
+ });
+ return;
+ }
} else {
res.json({
- message: "email and password doesn't match",
+ message: "User Doesn't Exists",
type: "error",
});
return;
From 58dc707291d9cbb053ae3c8c74d3b1ba6a168b4a Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Wed, 2 Jun 2021 10:51:56 +0530
Subject: [PATCH 05/15] Date Login
---
controllers/auth.js | 6 +-
models/User.js | 5 +
package-lock.json | 641 ++++++++++++++++++++++++++++++++++++++++++++
package.json | 9 +-
test/test.js | 37 +++
5 files changed, 695 insertions(+), 3 deletions(-)
create mode 100644 test/test.js
diff --git a/controllers/auth.js b/controllers/auth.js
index 6db904c..ebd7d95 100644
--- a/controllers/auth.js
+++ b/controllers/auth.js
@@ -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 });
@@ -226,6 +227,7 @@ module.exports.postSignin = async (req, res, next) => {
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) {
@@ -253,6 +255,8 @@ module.exports.postSignin = async (req, res, next) => {
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,
});
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/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..5a2b335 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,8 @@
"main": "app.js",
"scripts": {
"start:dev": "nodemon app.js",
- "start": "node app.js"
+ "start": "node app.js",
+ "test": "mocha ||true"
},
"author": "",
"license": "ISC",
@@ -37,6 +38,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/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();
+ });
+});
From ac0611e73979b13c6ba908c556248a36b5b041f9 Mon Sep 17 00:00:00 2001
From: laya5
Date: Wed, 2 Jun 2021 16:58:01 +0530
Subject: [PATCH 06/15] comment section
---
app.js | 3 ++-
controllers/blog.js | 53 +++++++++++++++++++++++++++++++++++++++++++++
models/Blog.js | 11 ++++++++++
package.json | 1 +
routes/blog.js | 2 ++
5 files changed, 69 insertions(+), 1 deletion(-)
diff --git a/app.js b/app.js
index 180c92c..509d11d 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') ;
@@ -75,7 +76,7 @@ app.use(bodyparser.json());
// req.logout() ;
// res.redirect('/') ;
// })
-
+const url = "mongodb://127.0.0.1:27017/game-of-dice";
mongoose.connect(MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
diff --git a/controllers/blog.js b/controllers/blog.js
index f731fde..97ff725 100644
--- a/controllers/blog.js
+++ b/controllers/blog.js
@@ -119,3 +119,56 @@ module.exports.editBlog = async (req, res, next) => {
};
}
};
+module.exports.commentBlog = async (req, res, next) => {
+ const comment = req.body.comment;
+ const today = new Date();
+ var dd = today.getDate();
+ var mm = today.getMonth() + 1;
+
+ var yyyy = today.getFullYear();
+ if (dd < 10) {
+ dd = "0" + dd;
+ }
+ if (mm < 10) {
+ mm = "0" + mm;
+ }
+ var today = dd + "/" + mm + "/" + yyyy;
+
+ const comments1 = {
+ user: req.user._id,
+ review: comment,
+ date: datenow,
+ };
+
+ try {
+ if (comment) {
+ Blog.findByIdAndUpdate(
+ { _id: req.params.id },
+ {
+ $push: {
+ comments: comments1,
+ },
+ },
+ function (err, docs) {
+ if (err) {
+ res.status(503).json({
+ message: "internal server error cant post the comment",
+ err,
+ });
+ } else {
+ res.status(201).json({
+ message: "Comment posted!",
+ });
+ }
+ }
+ );
+ }
+ } catch (err) {
+ if (err) {
+ res.status(501).json({
+ message: "internal Server error please try again after some time",
+ err,
+ });
+ }
+ }
+};
diff --git a/models/Blog.js b/models/Blog.js
index 7ebbcc7..0450548 100644
--- a/models/Blog.js
+++ b/models/Blog.js
@@ -21,5 +21,16 @@ const blogSchema = new mongoose.Schema({
type: Boolean,
default: false,
},
+ comments: [
+ {
+ user: { type: mongoose.Schema.Types.ObjectId, ref: "Users" },
+ review: {
+ type: String,
+ },
+ date: {
+ type: Date,
+ },
+ },
+ ],
});
module.exports = mongoose.model("Blog", blogSchema);
diff --git a/package.json b/package.json
index 5a2b335..b16f1d2 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,7 @@
"start": "node app.js",
"test": "mocha ||true"
},
+
"author": "",
"license": "ISC",
"dependencies": {
diff --git a/routes/blog.js b/routes/blog.js
index 847327c..b98e254 100644
--- a/routes/blog.js
+++ b/routes/blog.js
@@ -39,4 +39,6 @@ router.post("/deleteBlog/", BlogController.deleteBlog);
router.post("/editBlog/", BlogController.editBlog);
+router.post("/commentBlog/:id",BlogController.commentBlog)
+
module.exports = router;
From 22033d805b792d67fe4e8ce4ace017d934c5cff6 Mon Sep 17 00:00:00 2001
From: yashraj verma
Date: Wed, 2 Jun 2021 17:43:25 +0530
Subject: [PATCH 07/15] Update app.js
---
app.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app.js b/app.js
index 509d11d..39e085a 100644
--- a/app.js
+++ b/app.js
@@ -76,7 +76,7 @@ app.use(bodyparser.json());
// req.logout() ;
// res.redirect('/') ;
// })
-const url = "mongodb://127.0.0.1:27017/game-of-dice";
+
mongoose.connect(MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
From 375a1fe0b55ec6f535debf34705468ede4593875 Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Wed, 2 Jun 2021 18:23:02 +0530
Subject: [PATCH 08/15] Resolved
---
controllers/blog.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/controllers/blog.js b/controllers/blog.js
index 97ff725..4231dce 100644
--- a/controllers/blog.js
+++ b/controllers/blog.js
@@ -132,7 +132,7 @@ module.exports.commentBlog = async (req, res, next) => {
if (mm < 10) {
mm = "0" + mm;
}
- var today = dd + "/" + mm + "/" + yyyy;
+ // var today = dd + "/" + mm + "/" + yyyy;
const comments1 = {
user: req.user._id,
From 3f8776af1e122ac4d5f55c5a660335aad70ecc8c Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Fri, 4 Jun 2021 11:26:50 +0530
Subject: [PATCH 09/15] Payment purchase date
---
controllers/payment.js | 358 ++++++++++++++++++++---------------------
models/Order.js | 49 +++---
2 files changed, 199 insertions(+), 208 deletions(-)
diff --git a/controllers/payment.js b/controllers/payment.js
index 57ff4fa..685b72d 100644
--- a/controllers/payment.js
+++ b/controllers/payment.js
@@ -1,197 +1,187 @@
-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,
+ date_purchased: Date.now().toString(),
+ });
+ 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",
+ });
+ }
+ } catch (err) {
+ console.log(err);
+ res.status(500).json({
+ error: "error",
+ });
+ }
+};
diff --git a/models/Order.js b/models/Order.js
index 2be1af8..d2a1930 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: { type: Date },
+});
-module.exports = mongoose.model('Order' , orderSchema) ;
\ No newline at end of file
+module.exports = mongoose.model("Order", orderSchema);
From 127bdd1c70bf43514ebaf7d5d4ac7c3aaf1c8ef0 Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Fri, 4 Jun 2021 11:39:39 +0530
Subject: [PATCH 10/15] Payment purchase date
---
controllers/payment.js | 2 +-
models/Order.js | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/controllers/payment.js b/controllers/payment.js
index 685b72d..4b9c4d1 100644
--- a/controllers/payment.js
+++ b/controllers/payment.js
@@ -134,7 +134,6 @@ module.exports.postRazorpay = async (req, res, next) => {
course: courseId,
user: userId,
paymentSuccess: false,
- date_purchased: Date.now().toString(),
});
order = await order.save();
@@ -167,6 +166,7 @@ module.exports.postRazorpay = async (req, res, next) => {
name: user.firstName + " " + user.lastName,
email: user.email,
receipt: response.receipt,
+ date_purchased: response.created_at,
});
if (coupon && coupon.numAllowed > 0) {
coupon.numAllowed = coupon.numAllowed - 1;
diff --git a/models/Order.js b/models/Order.js
index d2a1930..3522d1e 100644
--- a/models/Order.js
+++ b/models/Order.js
@@ -23,7 +23,6 @@ const orderSchema = new Schema({
orderId: {
type: String,
},
- date_purchased: { type: Date },
});
module.exports = mongoose.model("Order", orderSchema);
From 92dd6eac75878800e92a88a651fb849f6686abfa Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Fri, 4 Jun 2021 17:37:17 +0530
Subject: [PATCH 11/15] Comment Section
---
controllers/blog.js | 15 +--------------
routes/blog.js | 6 +++---
2 files changed, 4 insertions(+), 17 deletions(-)
diff --git a/controllers/blog.js b/controllers/blog.js
index 4231dce..50c27e6 100644
--- a/controllers/blog.js
+++ b/controllers/blog.js
@@ -121,23 +121,10 @@ module.exports.editBlog = async (req, res, next) => {
};
module.exports.commentBlog = async (req, res, next) => {
const comment = req.body.comment;
- const today = new Date();
- var dd = today.getDate();
- var mm = today.getMonth() + 1;
-
- var yyyy = today.getFullYear();
- if (dd < 10) {
- dd = "0" + dd;
- }
- if (mm < 10) {
- mm = "0" + mm;
- }
- // var today = dd + "/" + mm + "/" + yyyy;
-
const comments1 = {
user: req.user._id,
review: comment,
- date: datenow,
+ date: Date.now().toString(),
};
try {
diff --git a/routes/blog.js b/routes/blog.js
index b98e254..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,6 +39,6 @@ router.post("/deleteBlog/", BlogController.deleteBlog);
router.post("/editBlog/", BlogController.editBlog);
-router.post("/commentBlog/:id",BlogController.commentBlog)
+router.post("/commentBlog/:id", isAuth, BlogController.commentBlog);
module.exports = router;
From 8b77a7e19fa68f7b24b26badac86fbec28ceeb8c Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Fri, 4 Jun 2021 17:48:13 +0530
Subject: [PATCH 12/15] Comment Section
---
nodemon.json | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/nodemon.json b/nodemon.json
index 3eff58c..f1742c7 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": "AKIA2G7743RRTZMVXE3X",
+ "HOST": "email-smtp.us-east-1.amazonaws.com",
+ "PASS": "BJSjV3jArJfsnk1LhFc/hUmisEyEtbLNGgrRbv0noh8c",
+ "AWS_KEY": "AKIA2G7743RRZXHP4XNL",
+ "AWS_SEC": "H4gCtDNRRfIPvq32fe9pHD3Q7OmwQ4z8AUm3Boel"
}
}
\ No newline at end of file
From 54046c404c95a0369651abd6faae573839ccfe6a Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Fri, 4 Jun 2021 18:50:03 +0530
Subject: [PATCH 13/15] User Posted
---
controllers/blog.js | 13 +++++++------
models/Blog.js | 3 ++-
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/controllers/blog.js b/controllers/blog.js
index 50c27e6..e862a49 100644
--- a/controllers/blog.js
+++ b/controllers/blog.js
@@ -136,19 +136,20 @@ module.exports.commentBlog = async (req, res, next) => {
comments: comments1,
},
},
- function (err, docs) {
+ { new: true }
+ )
+ .populate("comments.user", "_id name")
+ .exec((err, result) => {
if (err) {
res.status(503).json({
- message: "internal server error cant post the comment",
- err,
+ message: "Some Error Occured!" + err,
});
} else {
res.status(201).json({
- message: "Comment posted!",
+ message: "Comment posted!" + result,
});
}
- }
- );
+ });
}
} catch (err) {
if (err) {
diff --git a/models/Blog.js b/models/Blog.js
index 0450548..8e7a309 100644
--- a/models/Blog.js
+++ b/models/Blog.js
@@ -23,7 +23,7 @@ const blogSchema = new mongoose.Schema({
},
comments: [
{
- user: { type: mongoose.Schema.Types.ObjectId, ref: "Users" },
+ user: { ref: "User", type: mongoose.Types.ObjectId },
review: {
type: String,
},
@@ -32,5 +32,6 @@ const blogSchema = new mongoose.Schema({
},
},
],
+ user: { ref: "User", type: mongoose.Types.ObjectId },
});
module.exports = mongoose.model("Blog", blogSchema);
From dfe82f23ee949c2701b15b7bfeed03fd76f2c1ec Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Sat, 5 Jun 2021 15:51:38 +0530
Subject: [PATCH 14/15] Creds
---
controllers/auth.js | 14 +++++++-------
controllers/payment.js | 5 +++++
nodemon.json | 4 ++--
routes/payment.js | 16 +++++++++-------
4 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/controllers/auth.js b/controllers/auth.js
index ebd7d95..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}`
},
})
);
@@ -120,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
info@cantileverlabs.com
@@ -441,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
info@cantileverlabs.com
diff --git a/controllers/payment.js b/controllers/payment.js
index 4b9c4d1..234dce6 100644
--- a/controllers/payment.js
+++ b/controllers/payment.js
@@ -185,3 +185,8 @@ module.exports.postRazorpay = async (req, res, next) => {
});
}
};
+
+module.exports.amount = async (req, res, next) => {
+ const amount = req.body.amount;
+ res.status(200).json({ amount: amount / 100 });
+};
diff --git a/nodemon.json b/nodemon.json
index f1742c7..0d4f4d8 100644
--- a/nodemon.json
+++ b/nodemon.json
@@ -5,9 +5,9 @@
"MONGO_DEFAULT_DATABASE": "myFirstDatabase",
"KEY_ID": "rzp_live_aD9j5WLBGtdQxt",
"KEY_SECRET": "o9BDCwYcpNcHyFL5yjiY7OWG",
- "EMAIL": "AKIA2G7743RRTZMVXE3X",
+ "EMAIL": "AKIA2G7743RR3HEMJ6V5",
"HOST": "email-smtp.us-east-1.amazonaws.com",
- "PASS": "BJSjV3jArJfsnk1LhFc/hUmisEyEtbLNGgrRbv0noh8c",
+ "PASS": "BA5XVsIOnbDRje/Dc8icsYocLYm3x24iHlTamz94528K",
"AWS_KEY": "AKIA2G7743RRZXHP4XNL",
"AWS_SEC": "H4gCtDNRRfIPvq32fe9pHD3Q7OmwQ4z8AUm3Boel"
}
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;
From c331c2ddc35a6a461b9efe79101a9ec15e95a95f Mon Sep 17 00:00:00 2001
From: yashrajverma
Date: Mon, 7 Jun 2021 14:44:46 +0530
Subject: [PATCH 15/15] AWS
---
.ebextensions/nodecommand.config | 4 ++++
controllers/payment.js | 2 +-
models/Order.js | 1 +
3 files changed, 6 insertions(+), 1 deletion(-)
create mode 100644 .ebextensions/nodecommand.config
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/controllers/payment.js b/controllers/payment.js
index 234dce6..4bd3c64 100644
--- a/controllers/payment.js
+++ b/controllers/payment.js
@@ -166,7 +166,7 @@ module.exports.postRazorpay = async (req, res, next) => {
name: user.firstName + " " + user.lastName,
email: user.email,
receipt: response.receipt,
- date_purchased: response.created_at,
+ date_purchased: Date.now(),
});
if (coupon && coupon.numAllowed > 0) {
coupon.numAllowed = coupon.numAllowed - 1;
diff --git a/models/Order.js b/models/Order.js
index 3522d1e..c766ae1 100644
--- a/models/Order.js
+++ b/models/Order.js
@@ -23,6 +23,7 @@ const orderSchema = new Schema({
orderId: {
type: String,
},
+ date_purchased: Date,
});
module.exports = mongoose.model("Order", orderSchema);