@scefira/dfw-nodejs
Version:
174 lines (141 loc) • 5.68 kB
text/typescript
import uuidv4 from "uuid/v4";
import dfw_user from "../../model/dfw_user.model";
import dfw_session from "../../model/dfw_session.model";
import DFWUtils from "../DFWUtils";
import dfw_credential from "../../model/dfw_credential.model";
import { DFWScheme } from "../..";
import DFWModule from "./DFWModule";
import { Op } from "sequelize";
import moment from "moment";
export default class SessionManager extends DFWModule{
public constructor(dfw){
super(dfw);
setInterval(()=>{ // Clear expired files each 6 hours
this.sweepSessionsAsync();
},1000*60*60*6);
}
/**
*
* @param dfw
*/
public async touchAsync(dfw:DFWScheme){
dfw.session = {
isLogged:false,
model:{} as any,
loginAsync: async (options:DFWLoginParams) => {
return await this.loginAsync(dfw,options)
},
logoutAsync: async ()=>{
return await this.logoutAsync(dfw);
}
}
if(dfw.request.cookies === undefined || dfw.request.cookies === null || dfw.request.cookies.sid === undefined || dfw.request.cookies.stk === undefined){
dfw.session.model = await this.regenerateSessionAsync(dfw);
}else{
dfw.session.sid = dfw.request.cookies.sid;
dfw.session.stk = dfw.request.cookies.stk;
let cSession:dfw_session|null = await dfw.db.retriveModel(dfw_session).findOne({
where : { id: dfw.session.sid as number },
include : [ { model: dfw.db.retriveModel(dfw_user) , include : [ dfw.db.retriveModel(dfw_credential) ]} ]
}) // Current session
if(cSession == null || cSession == undefined || cSession.token !== dfw.request.cookies.stk){
dfw.session.model = await this.regenerateSessionAsync(dfw);
}else{
dfw.session.model = cSession;
}
}
/// new session data
dfw.session.model.expire = moment().add(3,"days").toDate(); // Caducidad
dfw.session.model.agent = dfw.request.headers['user-agent']?dfw.request.headers['user-agent']:"";
dfw.session.model.ip = dfw.request.ip;
dfw.session.model.site = dfw.request.originalUrl;
dfw.session.model.expire = moment().add(3,"days").toDate();
dfw.session.model.save();
await this.setCurrentSessionData(dfw);
}
/**
*
* @param dfw
*/
private async setCurrentSessionData(dfw:DFWScheme){
dfw.session.sid = dfw.session.model.id;
dfw.session.stk = dfw.session.model.token;
dfw.session.isLogged = dfw.session.model.idUser !== 0 && dfw.session.model.idUser !== null && dfw.session.model.idUser !== undefined;
if(dfw.session.isLogged === false && dfw.session.model !== undefined){
dfw.session.model.idUser = null;
dfw.session.model.user = null;
}
}
/**
*
* @param dfw
*/
public async sweepSessionsAsync(){
this.DFWInstance.getDatabase().retriveModel(dfw_session).destroy({
where:{
expire: { [Op.lt] : moment().toDate() },
}
})
}
/**
*
* @param dfw
*/
private async regenerateSessionAsync(dfw:DFWScheme):Promise<dfw_session>{
var stk = uuidv4();
var session:dfw_session = await dfw.db.retriveModel(dfw_session).create({
token: stk,
})
dfw.response.cookie("sid",session.id);
dfw.response.cookie("stk",stk);
dfw.session = { sid : session.id , stk , isLogged: false , model : session } as any
return session;
}
/**
*
* @param dfw
* @param options
*/
public async loginAsync(dfw:DFWScheme,options:DFWLoginParams):Promise<boolean>{
if(options.user === null || options.user === undefined || options.password === undefined || options.password === null){ // Seguridad, validación de campos de identificador vacio
return false;
}
// Retrive user with credentials
var user = await dfw.db.entityHandler.dfw_user.findAsync(options.user, [ dfw.db.retriveModel(dfw_credential) ]);
if(user !== null){
if(user.checkPassword(options.password) === true){
dfw.session.model.user = user;
dfw.session.model.idUser = user.id;
dfw.session.model = await dfw.session.model.save();
await this.setCurrentSessionData(dfw);
return true;
}
}
await DFWUtils.sleepAsync(2500);
return false;
}
public async logoutAsync(dfw:DFWScheme):Promise<boolean>{
if( dfw.session.model !== undefined ){
dfw.session.model.idUser = null;
dfw.session.model.user = null;
await dfw.session.model.save();
await this.setCurrentSessionData(dfw);
return true;
}
await this.setCurrentSessionData(dfw);
return false;
}
}
export interface DFWSessionSchema{
sid?:number;
stk?:string;
isLogged:boolean;
model:dfw_session; // Modelo de la sessión
loginAsync:(params:DFWLoginParams)=>Promise<boolean>
logoutAsync:()=>Promise<boolean>
}
export interface DFWLoginParams{
user:string|number;
password:string;
remember?:boolean;
}