2019-04-24 21:01:54 +00:00
'use strict' ;
const _ = require ( 'lodash' ) ;
2019-09-09 14:36:45 +00:00
const moment = require ( 'moment' ) ;
2019-04-24 21:01:54 +00:00
const httpStatus = require ( 'http-status' ) ;
const controllerHelper = require ( '../../helpers/controller.helper' ) ;
2019-08-14 11:50:28 +00:00
const crypto = require ( 'crypto' ) ;
2019-04-24 21:01:54 +00:00
const securityHelper = require ( '../../helpers/security.helper' ) ;
2019-07-08 11:11:40 +00:00
const authService = require ( './auth.service' ) ;
2019-09-09 14:41:50 +00:00
const userService = require ( './user.service' ) ;
2019-09-03 17:57:28 +00:00
const eventInscriptionService = require ( '../events/events_inscriptions.service' ) ;
2022-02-17 12:12:13 +00:00
const { RequestContactImportNewList } = require ( 'sib-api-v3-sdk' ) ;
2019-09-09 14:36:45 +00:00
moment . locale ( 'es' ) ;
2019-04-24 21:01:54 +00:00
////////////////////////////////////////////////////////////////////////////////
// CONSTANTS
////////////////////////////////////////////////////////////////////////////////
// Module Name
const MODULE _NAME = '[auth.controller]' ;
////////////////////////////////////////////////////////////////////////////////
// PUBLIC METHODS
////////////////////////////////////////////////////////////////////////////////
async function login ( req , res , next ) {
try {
2019-04-25 09:25:33 +00:00
const data = {
id : req . user . id ,
2019-08-17 19:41:22 +00:00
email : req . user . email ,
phone : req . user . phoneNumber ,
fbuid : req . user . uid
2019-04-25 09:25:33 +00:00
} ;
2019-07-09 10:14:18 +00:00
const tokens = securityHelper . generateToken ( data ) ;
2019-08-17 19:41:22 +00:00
const response = {
2019-07-09 10:14:18 +00:00
token : tokens . token ,
refreshToken : tokens . refreshToken ,
2019-08-17 19:41:22 +00:00
user : req . user ,
} ;
return controllerHelper . handleResultResponse ( response , null , req . params , res , httpStatus . OK ) ;
2019-04-24 21:01:54 +00:00
} catch ( error ) {
2019-08-17 19:41:22 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , login . name , error , res )
2019-04-24 21:01:54 +00:00
}
}
2019-06-21 08:40:28 +00:00
2019-08-03 17:11:32 +00:00
async function loginWithPhone ( req , res , next ) {
try {
2019-09-09 14:36:45 +00:00
const appVersion = ( ( req && req . headers && req . headers [ 'accept-version' ] ) ? req . headers [ 'accept-version' ] : null ) ;
2019-10-03 19:37:56 +00:00
console . log ( 'loginWithPhone - appVersion: ' , appVersion ) ;
2019-09-09 14:36:45 +00:00
2019-08-03 17:11:32 +00:00
console . log ( req . user ) ;
2019-08-04 07:29:13 +00:00
const findOptions = {
2019-08-03 17:11:32 +00:00
phone : req . user . phoneNumber ,
fbuid : req . user . uid
} ;
//Comprobamos si el usuario ya existe en nuestro sistema
2019-08-30 15:21:40 +00:00
let _user = await authService . extraMethods . findUserByPhone ( req . user . phoneNumber ) ;
2019-08-09 11:35:09 +00:00
if ( _user ) {
_user = _user . toJSON ( ) ;
2019-09-09 14:36:45 +00:00
if ( appVersion ) {
2019-09-09 14:39:14 +00:00
if ( _user . app _version != appVersion ) {
2019-09-09 14:43:26 +00:00
const result = userService . _updateLastLoginAndVersionUser ( _user . id , appVersion ) ;
2019-09-09 14:36:45 +00:00
console . log ( 'PRUEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEBA>>>> ' , result ) ;
2019-09-09 14:39:14 +00:00
_user . app _version = appVersion ;
2019-09-09 14:36:45 +00:00
}
}
2019-08-09 11:35:09 +00:00
const tokenData = {
id : _user . id ,
email : _user . email ,
phone : _user . phone ,
fbuid : _user . fbuid ,
} ;
const tokens = securityHelper . generateToken ( tokenData ) ;
_user . token = tokens . token ;
2019-09-03 17:00:41 +00:00
2019-09-03 17:57:28 +00:00
//Recuperamos el número de tickets para los proximos eventos
try {
const result = await eventInscriptionService . _getInscriptionsOfNextEventsUser ( _user . id ) ;
2019-10-14 14:59:55 +00:00
console . log ( 'Entradas del usuario' , result ) ;
2019-09-03 17:57:28 +00:00
_user . nextTicketsCount = result ;
2019-09-03 17:00:41 +00:00
} catch ( error ) {
2019-10-14 14:59:55 +00:00
console . error ( error ) ;
2019-09-03 17:00:41 +00:00
return handleErrorResponse ( MODULE _NAME , 'getInscriptionsOfNextEventsCount' , error , res )
}
2019-08-09 11:35:09 +00:00
return controllerHelper . handleResultResponse ( _user , null , req . params , res , httpStatus . OK ) ;
} else {
return controllerHelper . handleResultResponse ( null , null , req . params , res , httpStatus . NOT _FOUND ) ;
}
2019-08-03 17:11:32 +00:00
} catch ( error ) {
2019-10-14 14:59:55 +00:00
console . error ( error ) ;
2019-08-03 17:11:32 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , login . name , error , res )
}
}
2019-06-21 08:40:28 +00:00
async function register ( req , res , next ) {
2019-07-09 13:36:11 +00:00
2019-07-09 11:36:09 +00:00
function cleanAdminData ( user ) {
let cUser = user ;
delete cUser . lastLogin ;
delete cUser . state ;
delete cUser . createdAt ;
delete cUser . updatedAt ;
return cUser ;
}
2019-07-09 13:36:11 +00:00
const values = {
phone : req . body . phone ,
2019-08-30 15:11:11 +00:00
fbuid : req . body . fbuid
2019-07-09 13:36:11 +00:00
} ;
2019-08-05 09:01:03 +00:00
2019-09-09 14:36:45 +00:00
const appVersion = ( ( req && req . headers && req . headers [ 'accept-version' ] ) ? req . headers [ 'accept-version' ] : null ) ;
2019-10-14 14:59:55 +00:00
console . log ( 'register - appVersion: ' , appVersion ) ;
2019-09-09 14:36:45 +00:00
2019-07-09 13:59:58 +00:00
//Comprobamos si el usuario ya existe en nuestro sistema
2019-08-30 15:11:11 +00:00
let newUser = await authService . extraMethods . findUserByPhone ( values . phone ) ;
2019-08-28 17:09:10 +00:00
console . log ( 'COMPROBAMOS IS EXISTE EN NUESTRO SISTEMA' , newUser ) ;
2019-07-09 13:59:58 +00:00
if ( ! newUser ) {
2019-10-14 14:59:55 +00:00
2019-07-09 13:36:11 +00:00
try {
const data = {
2019-08-09 11:53:06 +00:00
//refresh_token: tokens.refreshToken,
2019-07-09 13:36:11 +00:00
phone : req . body . phone ,
fbuid : req . body . fbuid ,
email : req . body . email ,
name : req . body . name ,
surname : req . body . surname ,
2019-10-14 14:59:55 +00:00
entityId : req . body . entityid ,
2019-09-09 14:36:45 +00:00
accessibility : req . body . accesssibility ,
2022-02-08 17:35:10 +00:00
profile : req . body . profile ,
2019-09-09 14:36:45 +00:00
app _version : appVersion ,
lastlogin : moment ( ) . utc ( ) ,
2019-07-09 13:36:11 +00:00
} ;
2019-06-21 08:40:28 +00:00
2019-08-05 10:55:24 +00:00
newUser = await authService . extraMethods . createUser ( data ) ;
2019-08-28 17:09:10 +00:00
console . log ( 'CREAMOS EL USUARIO EN NUESTRO SISTEMA' , newUser ) ;
2019-07-09 13:36:11 +00:00
} catch ( error ) {
2019-07-28 20:08:15 +00:00
console . error ( error ) ;
2019-08-05 09:01:03 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , register . name , error , res ) ;
2019-07-09 13:36:11 +00:00
}
2019-07-09 13:59:58 +00:00
} ;
2019-08-05 09:01:03 +00:00
if ( newUser ) {
2019-08-05 10:55:24 +00:00
newUser = newUser . toJSON ( ) ;
2019-08-05 09:01:03 +00:00
newUser = cleanAdminData ( newUser ) ;
2019-09-09 14:36:45 +00:00
if ( appVersion ) {
2019-09-09 14:50:03 +00:00
if ( newUser . app _version != appVersion ) {
const result = userService . _updateLastLoginAndVersionUser ( newUser . id , appVersion ) ;
2019-09-09 14:36:45 +00:00
console . log ( 'PRUEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEBA>>>> ' , result ) ;
newUser . app _version = appVersion ;
}
}
2019-08-09 11:50:39 +00:00
const tokenData = {
phone : values . phone ,
fbuid : values . fbuid ,
id : newUser . id ,
email : newUser . email ,
} ;
const tokens = securityHelper . generateToken ( tokenData ) ;
2019-08-05 09:01:03 +00:00
newUser . token = tokens . token ;
2019-08-28 17:09:10 +00:00
console . log ( 'COMO YA EXISTE CREAMOS EL TOKEN Y LO ASIGNAMOS' , newUser ) ;
2019-08-05 09:01:03 +00:00
}
2019-07-09 14:37:54 +00:00
return controllerHelper . handleResultResponse ( newUser , null , req . params , res , httpStatus . OK ) ;
2019-07-09 10:14:18 +00:00
}
async function regenerateToken ( req , res , next ) {
2022-02-17 12:12:13 +00:00
const refreshToken = req . body . token ;
2019-07-09 10:14:18 +00:00
const phone = req . body . phone ;
2022-02-17 12:12:13 +00:00
const email = req . body . email ;
2019-07-09 10:14:18 +00:00
const user = await authService . extraMethods . findUserByRefreshToken ( refreshToken ) ;
2022-02-17 12:12:13 +00:00
console . debug ( user , req . body ) ;
if ( user && user . phone === phone && user . email === email ) {
const tokenData = {
2019-07-09 10:14:18 +00:00
phone : user . phone ,
2019-08-09 11:50:39 +00:00
fbuid : user . fbuid ,
id : user . id ,
email : user . email ,
2019-07-09 10:14:18 +00:00
} ;
try {
2022-02-17 12:12:13 +00:00
const tokens = securityHelper . generateToken ( tokenData ) ;
2019-07-09 10:14:18 +00:00
await authService . extraMethods . updateUserRefreshToken ( user . id , tokens . refreshToken ) ;
2019-07-09 11:36:09 +00:00
const result = { token : tokens . token } ;
2019-07-09 10:14:18 +00:00
return controllerHelper . handleResultResponse ( result , null , req . params , res , httpStatus . OK ) ;
} catch ( error ) {
2019-08-03 17:11:32 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , regenerateToken . name , error , res ) ;
2019-07-09 10:14:18 +00:00
}
} else {
return controllerHelper . handleResultResponse ( null , null , req . params , res , httpStatus . UNAUTHORIZED ) ;
2019-06-21 08:40:28 +00:00
}
}
2019-07-09 10:55:45 +00:00
async function rejectToken ( req , res , next ) {
const refreshToken = req . body . refreshToken ;
const user = await authService . extraMethods . findUserByRefreshToken ( refreshToken ) ;
if ( user && user . token === refreshToken ) {
try {
await authService . extraMethods . deleteRefreshToken ( refreshToken ) ;
return controllerHelper . handleResultResponse ( result , null , req . params , res , httpStatus . OK ) ;
} catch ( error ) {
2019-08-05 09:01:03 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , rejectToken . name , error , res ) ;
2019-07-09 10:55:45 +00:00
}
} else {
return controllerHelper . handleResultResponse ( null , null , req . params , res , httpStatus . NOT _FOUND ) ;
}
}
2019-08-14 11:50:28 +00:00
// Registro por email y por password
async function singup ( req , res , next ) {
var newUser = undefined ;
try {
const data = {
email : req . body . email ,
name : req . body . name ,
surname : req . body . surname ,
level : 8 ,
password : crypto . createHash ( 'sha512' ) . update ( req . body . password ) . digest ( 'hex' )
} ;
newUser = await authService . extraMethods . createUser ( data ) ;
} catch ( error ) {
console . error ( error ) ;
return controllerHelper . handleErrorResponse ( MODULE _NAME , register . name , error , res ) ;
}
if ( newUser ) {
newUser = newUser . toJSON ( ) ;
const tokenData = {
phone : undefined ,
fbuid : undefined ,
id : newUser . id ,
email : newUser . email ,
} ;
const tokens = securityHelper . generateToken ( tokenData ) ;
newUser . token = tokens . token ;
}
return controllerHelper . handleResultResponse ( newUser , null , req . params , res , httpStatus . OK ) ;
2019-09-13 14:45:02 +00:00
}
2019-08-14 11:50:28 +00:00
2019-09-13 14:45:02 +00:00
function verify ( req , res , next ) {
2022-02-17 12:12:13 +00:00
const params = controllerHelper . extractParamsFromRequest ( req , res , { } ) ;
const phone = params . query . phone ;
const email = params . query . email ;
const fbuid = params . query . fbuid ;
const user = req . user ;
if ( user && user . phone === phone && user . email === email && user . fbuid === fbuid ) {
return controllerHelper . handleResultResponse ( user , null , req . params , res , httpStatus . OK ) ;
} else {
return controllerHelper . handleResultResponse ( null , null , req . params , res , httpStatus . UNAUTHORIZED ) ;
}
2019-08-14 11:50:28 +00:00
}
2022-02-17 12:12:13 +00:00
async function getOrCreateUser ( req , res , next ) {
console . log ( '>>>>>>>>>>>>>>>>>>>> getOrCreateUser' ) ;
const params = controllerHelper . extractParamsFromRequest ( req , res , { } ) ;
let dataInscription = res . locals . dataInscription ;
if ( ! dataInscription )
return handleResultResponse ( "Error getOrCreateUser, prepareInscription, recuperateEvent, recuperateReservation requerida" , null , params , res , httpStatus . NOT _FOUND ) ;
//Iniciamos el usuario relacionadas con la inscripción.
let dataUser = {
id : ( req . user ) ? req . user . id : null ,
phone : ( req . user ) ? req . user . phone : null , //((req.body.phone != '+34') ? req.body.phone : null), lo quitamos de momento por la de movistar
name : ( req . user ) ? req . user . name : req . body . name ,
surname : ( req . user ) ? req . user . surname : req . body . surname ,
email : ( req . user ) ? req . user . email : req . body . email ,
entityId : null ,
entityName : null ,
entityLevel : null ,
userResult : ( req . user ) ? req . user : null ,
} ;
//Asignamos a los datos del usuario a crear, el id de la entidad a la que pertenece, este caso solo es necesario cuando viene la inscripción por web ya que hay que crear un usuario nuevo
if ( dataInscription . reservation ) {
dataUser . entityId = dataInscription . reservation . entityId ;
} ;
//creamos o recuperamos el usuario teniendo en cuenta que pude venir por APP o WEB
//si viene por web se tendra en cuenta el email y si viene por APP el phone para buscar
try {
//CHAPUZA PARA PODER DAR DE ALTA USUARIOS CON EL MISMO CORREO ELECTRONICO, PERO DISTINTO NOMBRE Y APELLIDO.
if ( req . user ) //? 'app' : 'web', //En el caso de tener ya usuario viene por APP sino viene por web
dataUser . userResult = await userService . _getOrCreateUser ( dataUser )
else
dataUser . userResult = await userService . _getOrCreateUserWEB ( dataUser ) ;
if ( ! dataUser . userResult ) {
// No se ha encontrado
return handleResultResponse ( "No se ha podido crear o encontrar el usuario dado" , null , params , res , httpStatus . NOT _FOUND ) ;
} ;
} catch ( error ) {
return handleErrorResponse ( MODULE _NAME , 'createInscription' , error , res ) ;
} ;
console . log ( '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' , dataUser . userResult . user . Entity ) ;
dataUser . entityId = ( dataUser . userResult . user . Entity ) ? dataUser . userResult . user . Entity . id : null ;
dataUser . entityName = ( dataUser . userResult . user . Entity ) ? dataUser . userResult . user . Entity . name : 'DEFAULT' ;
dataUser . entityLevel = ( dataUser . userResult . user . Entity ) ? dataUser . userResult . user . Entity . level : null ;
res . locals . dataUser = dataUser ;
next ( ) ;
}
2019-07-09 10:55:45 +00:00
2019-04-24 21:01:54 +00:00
module . exports = {
login ,
2019-08-03 17:11:32 +00:00
loginWithPhone ,
2019-06-21 08:40:28 +00:00
register ,
2019-07-09 10:14:18 +00:00
regenerateToken ,
2019-07-09 10:55:45 +00:00
rejectToken ,
2019-08-14 11:50:28 +00:00
singup ,
2019-09-13 14:45:02 +00:00
verify ,
2022-02-17 12:12:13 +00:00
getOrCreateUser ,
2019-04-24 21:01:54 +00:00
MODULE _NAME
}