Add basic functionality

This commit is contained in:
2021-12-19 18:17:51 +02:00
parent 87c6ad9e6d
commit f259651ec9
18 changed files with 631 additions and 36 deletions

View 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;
};

View 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;
};

View 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;
};

View File

@@ -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;
};

View 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;
};

View 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;
};