Skip to content

Commit

Permalink
session
Browse files Browse the repository at this point in the history
  • Loading branch information
El-khamisi committed Jun 5, 2022
1 parent 5d3fb89 commit 58f1ea0
Show file tree
Hide file tree
Showing 10 changed files with 38 additions and 45 deletions.
4 changes: 2 additions & 2 deletions src/config/seeder.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const User = require('../services/user/user.model');
const { Admin } = require('./roles');
const bcrypt = require('bcrypt');
const { premiumPlan } = require('./membership');
const {plansNames} = require('../services/plans/plans.model');
const { plansNames } = require('../services/plans/plans.model');

const superAdmin = async () => {
await User.findOneAndDelete({
Expand All @@ -16,7 +16,7 @@ const superAdmin = async () => {
role: Admin,
membership: premiumPlan,
memberplan: plansNames.Biannual,
quizzes: []
quizzes: [],
};
try {
const saved = new User(prototype);
Expand Down
17 changes: 2 additions & 15 deletions src/index.routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const role = require('./services/role/role.routes');
const profile = require('./services/user/profile.routes');
const plans = require('./services/plans/plans.routes');

const { sign, serialize } = require('./utils/cookie');

const { initPlans } = require('./services/plans/plans.model');

module.exports = async (app) => {
Expand Down Expand Up @@ -72,20 +72,7 @@ module.exports = async (app) => {
secure: NODE_ENV == 'dev' ? false : true,
httpOnly: false,
},
}),
(req, res, next) => {

const signed = 's:' + sign(req.sessionID, TOKENKEY);
let data = serialize('s_id', signed, req.session.cookie.data);
//
if (NODE_ENV != 'dev') data += '; Secure; SameSite=None';
const prev = res.getHeader('Set-Cookie') || [];
var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];

res.setHeader('Set-Cookie', header);

return next();
}
})
);
const unless = function (paths, middleware) {
let flag = false;
Expand Down
5 changes: 3 additions & 2 deletions src/services/login/login.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const bcrypt = require('bcrypt');
const { successfulRes, failedRes } = require('../../utils/response');
const {premiumPlan, freePlan} = require('../../config/membership');
const {plansNames} = require('../plans/plans.model');
const { setS_id } = require('../../utils/cookie');

exports.regUser = async (req, res) => {
try {
Expand All @@ -24,7 +25,7 @@ exports.regUser = async (req, res) => {
saved.inprogress = undefined;
saved.password = undefined;
saved.quizzes = undefined;

setS_id(req, res);
return successfulRes(res, 201, { user: saved, token });
} catch (e) {
return failedRes(res, 500, e);
Expand Down Expand Up @@ -68,7 +69,7 @@ exports.logUser = async (req, res) => {
user.inprogress = undefined;
user.quizzes = undefined;


setS_id(req, res);
return successfulRes(res, 200, { user: user, token });
}
} catch (e) {
Expand Down
3 changes: 1 addition & 2 deletions src/services/quiz/quiz.controllers.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,7 @@ exports.submitQuiz = async (req, res) => {
});
response.total = parseFloat(((5 / doc.length) * response.total).toFixed(1));
const usr = await User.findById(user_id).exec();



let flag = false;
for (let i = 0; i < usr.quizzes.length; i++) {
if (usr.quizzes[i]._id == quiz_id) {
Expand Down
2 changes: 1 addition & 1 deletion src/services/quiz/quiz.model.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const quizSchema = new mongoose.Schema(
{
question_name: { type: String },
options: { type: Map, of: String },
answer: { type: String, required: true},
answer: { type: String, required: true },
},
],
},
Expand Down
2 changes: 1 addition & 1 deletion src/services/reading/reading.controllers.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ exports.getReading = async (req, res) => {
try {
const _id = req.params.id;
const user = req.session.user;
console.log(req.session);
console.log(req.session);
const doc = await Reading.findById(_id).populate('quizzes').sort('-createdAt');

if (doc && doc.membership == premiumPlan && user.membership == freePlan) {
Expand Down
9 changes: 3 additions & 6 deletions src/services/user/profile.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,8 @@ exports.sendMail = async (req, res) => {
});

let user = 'Guest User';
if(req.session && req.session.user ){
user = req.session.user.last_name
? `${req.session.user.first_name} ${req.session.user.last_name}`
: 'Guest User';
if (req.session && req.session.user) {
user = req.session.user.last_name ? `${req.session.user.first_name} ${req.session.user.last_name}` : 'Guest User';
}

let info = await transport.sendMail({
Expand All @@ -155,8 +153,7 @@ exports.sendMail = async (req, res) => {
html: `<p>${text}</p>`,
});

return successfulRes(res, 200, {response: info.response, from: info.envelope.from,
to: info.envelope.to[0]});
return successfulRes(res, 200, { response: info.response, from: info.envelope.from, to: info.envelope.to[0] });
} catch (e) {
return failedRes(res, 500, e);
}
Expand Down
23 changes: 10 additions & 13 deletions src/services/user/user.controllers.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const User = require('./user.model');
const { successfulRes, failedRes } = require('../../utils/response');
const { upload_image } = require('../../config/cloudinary');
const { plansNames } = require('../plans/plans.model');
const {subscribe} = require('../../utils/subscribe');
const { subscribe } = require('../../utils/subscribe');
const { premiumPlan, freePlan } = require('../../config/membership');

exports.verify = (req, res) => {
Expand All @@ -15,11 +15,11 @@ exports.getUsers = async (req, res) => {

const response = await User.aggregate([
{
$sort: {createdAt: -1}
$sort: { createdAt: -1 },
},
{
$project: {first_name: 1, last_name: 1, email: 1, membership: 1, memberplan: 1}
}
$project: { first_name: 1, last_name: 1, email: 1, membership: 1, memberplan: 1 },
},
]);
return successfulRes(res, 200, response);
} catch (e) {
Expand All @@ -45,12 +45,11 @@ exports.addUser = async (req, res) => {
const { first_name, last_name, email, phone, password, role, membership, memberplan } = req.body;
const photo = req.file?.path;

if(membership == premiumPlan && Object.values(plansNames).includes(memberplan)
&& memberplan != plansNames.None){
if (membership == premiumPlan && Object.values(plansNames).includes(memberplan) && memberplan != plansNames.None) {
doc.membership = premiumPlan;
doc.memberplan = memberplan;
doc.end_of_membership = subscribe(memberplan, doc.end_of_membership);
}else{
} else {
await doc.save();
throw new Error(`Provide valid plan name-${memberplan}`);
}
Expand Down Expand Up @@ -98,15 +97,13 @@ exports.updateUser = async (req, res) => {
doc.phone = phone ? phone : doc.phone;
doc.role = role ? role : doc.role;
// doc.membership = membership ? membership : doc.membership;
if(membership == freePlan){
doc.membership = freePlan
}
else if(membership == premiumPlan && Object.values(plansNames).includes(memberplan)
&& memberplan != plansNames.None){
if (membership == freePlan) {
doc.membership = freePlan;
} else if (membership == premiumPlan && Object.values(plansNames).includes(memberplan) && memberplan != plansNames.None) {
doc.membership = premiumPlan;
doc.memberplan = memberplan;
doc.end_of_membership = subscribe(memberplan, doc.end_of_membership);
}else{
} else {
await doc.save();
throw new Error(`Provide valid plan name-${memberplan}`);
}
Expand Down
2 changes: 1 addition & 1 deletion src/services/user/user.model.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const userSchema = new mongoose.Schema(
password: { type: String, required: [true, 'Password is required'] },
role: { type: String, enum: [...Object.values(roles), 'Invalid role title'], default: roles.Student },
membership: { type: String, enum: [...Object.values(membership), 'Invalid membership plan'], default: membership.freePlan },
memberplan: {type: String, enum: [...Object.values(plansNames), 'Invalid memberplan name'], default: plansNames.None},
memberplan: { type: String, enum: [...Object.values(plansNames), 'Invalid memberplan name'], default: plansNames.None },
end_of_membership: { type: Date },
inprogress: [{ course: { type: mongoose.Schema.Types.ObjectId, ref: 'Course' }, quizzes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Quiz' }] }],
completed: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Course' }],
Expand Down
16 changes: 14 additions & 2 deletions src/utils/cookie.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
const crypto = require('crypto');
const { TOKENKEY, NODE_ENV } = require('../config/env');
var decode = decodeURIComponent;
var encode = encodeURIComponent;
var fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;
var pairSplitRegExp = /; */;

exports.serialize = function (name, val, options) {
serialize = function (name, val, options) {
var opt = options || {};
var enc = opt.encode || encode;

Expand Down Expand Up @@ -90,8 +91,19 @@ exports.serialize = function (name, val, options) {
return str;
};

exports.sign = function (val, secret) {
sign = function (val, secret) {
if ('string' != typeof val) throw new TypeError('Cookie value must be provided as a string.');
if ('string' != typeof secret) throw new TypeError('Secret string must be provided.');
return val + '.' + crypto.createHmac('sha256', secret).update(val).digest('base64').replace(/\=+$/, '');
};

exports.setS_id = (req, res) => {
const signed = 's:' + sign(req.sessionID, TOKENKEY);
let data = serialize('s_id', signed, req.session.cookie.data);
//
if (NODE_ENV != 'dev') data += '; Secure; SameSite=None';
const prev = res.getHeader('Set-Cookie') || [];
var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];

res.setHeader('Set-Cookie', header);
};

0 comments on commit 58f1ea0

Please sign in to comment.