The DTP Sites web app development engine.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

83 lines
2.0 KiB

// session.js
// Copyright (C) 2022 DTP Technologies, LLC
// License: Apache-2.0
'use strict';
const util = require('util');
const passport = require('passport');
const { SiteError, SiteLog } = require('../../lib/site-lib');
class SessionService {
constructor (dtp) {
this.dtp = dtp;
this.log = new SiteLog(dtp, `svc:${module.exports.slug}`);
}
async start ( ) {
this.log.info(`starting ${module.exports.name} service`);
passport.serializeUser(this.serializeUser.bind(this));
passport.deserializeUser(this.deserializeUser.bind(this));
}
async stop ( ) {
this.log.info(`stopping ${module.exports.name} service`);
}
middleware ( ) {
return async (req, res, next) => {
res.locals.user = req.user;
res.locals.query = req.query;
if (req.user) {
if (req.user.flags.isAdmin) {
res.locals.config = this.dtp.config;
res.locals.session = req.session;
res.locals.util = util;
}
}
return next();
};
}
authCheckMiddleware (options) {
options = Object.assign({
requireLogin: true,
requireAdmin: false,
}, options);
return async (req, res, next) => {
if (options.requireLogin && !req.user) {
return next(new SiteError(403, 'Must sign in to proceed'));
}
if (options.requireAdmin && (!req.user || !req.user.flags.isAdmin)) {
return next(new SiteError(403, 'Administrator privileges are required'));
}
return next();
};
}
async serializeUser (user, done) {
return done(null, user._id);
}
async deserializeUser (userId, done) {
const { user: userService } = this.dtp.services;
try {
const user = await userService.getUserAccount(userId);
return done(null, user);
} catch (error) {
this.log.error('failed to deserialize user from session', { error });
return done(null, null);
}
}
}
module.exports = {
slug: 'session',
name: 'session',
create: (dtp) => { return new SessionService(dtp); },
};