Add basic functionality
This commit is contained in:
126
server/router/account/index.js
Normal file
126
server/router/account/index.js
Normal file
@@ -0,0 +1,126 @@
|
||||
/**
|
||||
* This router handles things related to the web browser experience...
|
||||
*/
|
||||
|
||||
// This is the mock data we working with...
|
||||
module.exports = function (options) {
|
||||
var express = options.express;
|
||||
var db = options.db;
|
||||
var passport = options.passport;
|
||||
|
||||
var router = express.Router();
|
||||
|
||||
router.route('/')
|
||||
.get(function(request, response, next) {
|
||||
if (request.user) {
|
||||
response.display("account", {
|
||||
user: request.user,
|
||||
pageTitle: "Home - Mantra"
|
||||
})
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
});
|
||||
|
||||
router.route('/authenticate') // TODO: Might have a unique identifier for this endpoint...
|
||||
.get(function (request, response, next) {
|
||||
if (request.user == null) {
|
||||
response.display("login-username", {
|
||||
user: request.user,
|
||||
pageTitle: "Login - Mantra",
|
||||
});
|
||||
} else {
|
||||
response.redirect('/');
|
||||
}
|
||||
})
|
||||
.post(function (request, response, next) {
|
||||
if (request.user == null) {
|
||||
var username = "" + request.body.username;
|
||||
username = username.trim().toLowerCase();
|
||||
if(request.body.password == null) {
|
||||
const email = db.Email.build({
|
||||
address: username
|
||||
})
|
||||
email.validate()
|
||||
.then((email)=> {
|
||||
response.display("login-password", {
|
||||
user: request.user,
|
||||
username: email.address,
|
||||
pageTitle: "Login - Mantra",
|
||||
});
|
||||
}).catch(error => {
|
||||
response.display("login-username", {
|
||||
user: request.user,
|
||||
username: username,
|
||||
pageTitle: "Login - Mantra",
|
||||
data: {
|
||||
message: "Enter a valid email"
|
||||
}
|
||||
});
|
||||
})
|
||||
} else {
|
||||
passport.authenticate('local', (error, user, info) => {
|
||||
console.error("Error: ", error)
|
||||
if(info) {
|
||||
console.log("Info: ", info)
|
||||
response.display("login-username", {
|
||||
user: request.user,
|
||||
username: username,
|
||||
pageTitle: "Login - Mantra",
|
||||
data: info
|
||||
})
|
||||
} else if(user) {
|
||||
|
||||
if(request.body.rememberMe) {
|
||||
var now = new Date();
|
||||
var expiresAt = new Date();
|
||||
expiresAt.setFullYear(expiresAt.getFullYear()+5);
|
||||
// request.session.cookie.expires = expiresAt;
|
||||
request.session.cookie.maxAge = expiresAt;
|
||||
|
||||
// TODO: Add the remember me cookie...
|
||||
} else {
|
||||
// TODO: Set that the remember me cookie wasn't selected...
|
||||
}
|
||||
|
||||
request.logIn(user, function(err) {
|
||||
if (err) { return next(err); }
|
||||
return response.redirect('/');
|
||||
});
|
||||
} else {
|
||||
response.redirect('/account/authenticate')
|
||||
}
|
||||
})(request, response, next);
|
||||
}
|
||||
} else {
|
||||
response.redirect("/");
|
||||
}
|
||||
})
|
||||
|
||||
router.route('/logout')
|
||||
.post(function(request, response, next) {
|
||||
if (request.user) {
|
||||
request.logout();
|
||||
return db.Session.destroy({
|
||||
where: {
|
||||
sid: request.sessionID
|
||||
}
|
||||
}).then(result => {
|
||||
response.redirect('/');
|
||||
}).catch(error => {
|
||||
response.redirect('/');
|
||||
console.error("Log out error: ", error);
|
||||
})
|
||||
} else {
|
||||
response.redirect('/');
|
||||
}
|
||||
});
|
||||
|
||||
// var passwordResetRouter = require('./password-reset/')(options);
|
||||
var libraryRouter = require('../library')(options);
|
||||
|
||||
// router.use('/password-reset', passwordResetRouter);
|
||||
router.use('/library', libraryRouter);
|
||||
|
||||
return router;
|
||||
};
|
||||
182
server/router/account/password-reset/index.js
Normal file
182
server/router/account/password-reset/index.js
Normal file
@@ -0,0 +1,182 @@
|
||||
const express = require('express')
|
||||
const emailAPI = require('../../../email/email-api')
|
||||
|
||||
module.exports = function (options) {
|
||||
const db = options.db;
|
||||
var router = express.Router();
|
||||
|
||||
router.route('/')
|
||||
.get(function(request, response, next) {
|
||||
response.display("password-reset-initiation", {
|
||||
user: request.user,
|
||||
pageTitle: "Password Reset - Mantra"
|
||||
})
|
||||
}).post(function(request, response, next) {
|
||||
// TODO: Create UserPasswordReset object.
|
||||
// TODO: Send email with link to /account/password-reset/:id
|
||||
db.User.findOne({
|
||||
include: [
|
||||
{
|
||||
association: db.User.UserEmails,
|
||||
required: true,
|
||||
where: {
|
||||
emailAddress: request.body.email
|
||||
}
|
||||
},
|
||||
{
|
||||
association: db.User.UserPasswordReset
|
||||
}
|
||||
// TODO: Include user.UserPasswordReset
|
||||
]
|
||||
}).then(user => {
|
||||
if (user) {
|
||||
// TODO: Check if user already created a password reset entry to save on a db transaction
|
||||
return Promise.all([
|
||||
user.userEmails[0],
|
||||
user.userPasswordReset ? user.userPasswordReset : db.UserPasswordReset.create({
|
||||
userId: user.id
|
||||
})
|
||||
])
|
||||
} else {
|
||||
return [null, null]
|
||||
}
|
||||
}).then(async (results) => {
|
||||
userEmail = results[0]
|
||||
userPasswordReset = results[1]
|
||||
if (userPasswordReset) {
|
||||
await userPasswordReset.increment('sent')
|
||||
// Send password reset email...
|
||||
return emailAPI.sendPasswordResetEmail(userPasswordReset.token, userEmail.emailAddress)
|
||||
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
}).then(emailResult => {
|
||||
if (emailResult) {
|
||||
response.display("password-reset-initiated", {
|
||||
user: request.user,
|
||||
pageTitle: "Password Reset Initiated - Mantra"
|
||||
})
|
||||
} else {
|
||||
// TODO: Check if email is an immigrant
|
||||
db.Immigrant.findOne({
|
||||
where: {
|
||||
emailAddress: request.body.email
|
||||
},
|
||||
include: [
|
||||
{
|
||||
association: db.Immigrant.User,
|
||||
},
|
||||
{
|
||||
association: db.Immigrant.Email,
|
||||
required: true,
|
||||
}
|
||||
]
|
||||
}).then(async (immigrant) => {
|
||||
if (immigrant && immigrant.user == null) {
|
||||
// Resend invitation
|
||||
await emailAPI.sendImmigrationInvitationEmail(
|
||||
immigrant.id, immigrant.emailAddress, immigrant.displayName
|
||||
)
|
||||
|
||||
response.display("password-reset-initiated", {
|
||||
user: request.user,
|
||||
pageTitle: "Password Reset Initiated - Mantra"
|
||||
})
|
||||
} else {
|
||||
next(`Failed to create a user password reset entry (user ${request.body.email} doesn't exist)`)
|
||||
}
|
||||
}).catch (error => {
|
||||
next(error)
|
||||
})
|
||||
// TODO: Create password reset error page with possible reasons...
|
||||
|
||||
}
|
||||
}).catch(reason => {
|
||||
console.error("Something went wrong with reset: ", reason)
|
||||
// TODO: Tell user
|
||||
next(reason)
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
router.route('/:token')
|
||||
.get(function(request, response, next) {
|
||||
if (request.user) {
|
||||
// TODO:
|
||||
response.display("logout-to-continue", {
|
||||
user: request.user,
|
||||
pageTitle: "Logout Before Continue - Mantra"
|
||||
})
|
||||
} else {
|
||||
db.UserPasswordReset.findByPk(request.params.token, {
|
||||
include: [
|
||||
{
|
||||
association: db.UserPasswordReset.User
|
||||
}
|
||||
]
|
||||
})
|
||||
.then(userPasswordReset => {
|
||||
if (userPasswordReset) {
|
||||
response.display("password-reset", {
|
||||
user: request.user,
|
||||
pageTitle: "Password Reset - Mantra",
|
||||
userPasswordReset: userPasswordReset
|
||||
})
|
||||
} else {
|
||||
next()
|
||||
}
|
||||
}).catch(error => {
|
||||
next(error)
|
||||
})
|
||||
}
|
||||
|
||||
}).post(function(request, response, next) {
|
||||
if (Boolean(request.body.password) && request.body.password == request.body.confirmPassword) {
|
||||
db.UserPasswordReset.findByPk(request.params.token, {
|
||||
include: [
|
||||
{
|
||||
association: db.UserPasswordReset.User,
|
||||
required: true,
|
||||
include: [
|
||||
{
|
||||
association: db.User.Passwords,
|
||||
required: true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}).then(userPasswordReset => {
|
||||
if (userPasswordReset) {
|
||||
var password = userPasswordReset.user.passwords[0]
|
||||
password.password = request.body.password // Password will be hashed...
|
||||
return Promise.all([userPasswordReset, password.save()])
|
||||
} else {
|
||||
return [null, null]
|
||||
}
|
||||
}).then(results => {
|
||||
userPasswordReset = results[0]
|
||||
password = results[1]
|
||||
if (password) {
|
||||
// Password reset success invite user to reset...
|
||||
response.redirect("/account")
|
||||
// Cleanup...
|
||||
userPasswordReset.destroy({
|
||||
force: true
|
||||
}).then(() => {})
|
||||
.catch(reason => console.error("Failed to destroy userPasswordReset", reason))
|
||||
} else {
|
||||
// TODO: Give user failed password page...
|
||||
next("Failed to reset password")
|
||||
}
|
||||
}).catch(error => {
|
||||
next(error)
|
||||
})
|
||||
} else {
|
||||
// TODO: Tell user password reset failed..
|
||||
next("Passwords do not match")
|
||||
}
|
||||
|
||||
})
|
||||
return router;
|
||||
};
|
||||
15
server/router/campaigns/index.js
Normal file
15
server/router/campaigns/index.js
Normal file
@@ -0,0 +1,15 @@
|
||||
const express = require('express')
|
||||
|
||||
module.exports = function (options) {
|
||||
const db = options.db;
|
||||
var router = express.Router();
|
||||
|
||||
router.route('/')
|
||||
.get(function(request, response, next) {
|
||||
response.display("campaigns", {
|
||||
user: request.user,
|
||||
pageTitle: "Library - Mantra"
|
||||
})
|
||||
})
|
||||
return router;
|
||||
};
|
||||
@@ -17,5 +17,15 @@ module.exports = function (options) {
|
||||
})
|
||||
});
|
||||
|
||||
var accountRouter = require('./account/')(options);
|
||||
var libraryRouter = require('./library')(options);
|
||||
var pledgesRouter = require('./pledges/')(options);
|
||||
var campaignsRouter = require('./campaigns/')(options);
|
||||
|
||||
router.use('/library', libraryRouter);
|
||||
router.use('/pledges', pledgesRouter);
|
||||
router.use('/campaigns', campaignsRouter);
|
||||
router.use('/account', accountRouter);
|
||||
|
||||
return router;
|
||||
};
|
||||
88
server/router/library/index.js
Normal file
88
server/router/library/index.js
Normal file
@@ -0,0 +1,88 @@
|
||||
const express = require('express');
|
||||
const req = require('express/lib/request');
|
||||
|
||||
module.exports = function (options) {
|
||||
const db = options.db;
|
||||
var router = express.Router();
|
||||
|
||||
router.route('/')
|
||||
.get(function(request, response, next) {
|
||||
db.Entry.findAll({
|
||||
|
||||
}).then(entries => {
|
||||
response.display("library", {
|
||||
user: request.user,
|
||||
pageTitle: "Library - Mantra",
|
||||
entries: entries
|
||||
})
|
||||
}).catch(error => {
|
||||
next(error)
|
||||
})
|
||||
})
|
||||
|
||||
router.route('/add')
|
||||
.get(function(request, response, next) {
|
||||
if (request.user) {
|
||||
response.display("library-form", {
|
||||
user: request.user,
|
||||
pageTitle: "Add Library - Mantra",
|
||||
entry: { }
|
||||
})
|
||||
} else {
|
||||
next()
|
||||
}
|
||||
})
|
||||
.post(function(request, response, next) {
|
||||
if (request.user) {
|
||||
db.Dialect.findOne({
|
||||
where: {
|
||||
languageId: "en",
|
||||
countryId: "int"
|
||||
}
|
||||
}).then(dialect => {
|
||||
if (dialect) {
|
||||
return db.Entry.create({
|
||||
name: request.body.name,
|
||||
url: request.body.url,
|
||||
dialectId: dialect.id,
|
||||
licenseId: "copyright"
|
||||
})
|
||||
} else {
|
||||
response.redirect("/library/add") // TODO: Show error message on missing dialect...
|
||||
}
|
||||
|
||||
}).then(entry => {
|
||||
if (entry) {
|
||||
response.redirect(`/library/${entry.id}`)
|
||||
} else {
|
||||
next()
|
||||
}
|
||||
}).catch(error => {
|
||||
next(error)
|
||||
})
|
||||
} else {
|
||||
next()
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
router.route('/:id')
|
||||
.get(function(request, response, next) {
|
||||
db.Entry.findByPk(request.params.id, {
|
||||
include: [
|
||||
{
|
||||
association: db.Entry.EntryApproval
|
||||
}
|
||||
]
|
||||
}).then(entry => {
|
||||
response.display("entry", {
|
||||
user: request.user,
|
||||
pageTitle: "Library - Mantra",
|
||||
entry: entry
|
||||
})
|
||||
}).catch(error => {
|
||||
next(error)
|
||||
})
|
||||
})
|
||||
return router;
|
||||
};
|
||||
15
server/router/pledges/index.js
Normal file
15
server/router/pledges/index.js
Normal file
@@ -0,0 +1,15 @@
|
||||
const express = require('express')
|
||||
|
||||
module.exports = function (options) {
|
||||
const db = options.db;
|
||||
var router = express.Router();
|
||||
|
||||
router.route('/')
|
||||
.get(function(request, response, next) {
|
||||
response.display("pledges", {
|
||||
user: request.user,
|
||||
pageTitle: "Library - Mantra"
|
||||
})
|
||||
})
|
||||
return router;
|
||||
};
|
||||
Reference in New Issue
Block a user