2022-02-17 13:20:42 +00:00
"use strict" ;
const _ = require ( "lodash" ) ;
const moment = require ( "moment" ) ;
const httpStatus = require ( "http-status" ) ;
const controllerHelper = require ( "../../helpers/controller.helper" ) ;
const crypto = require ( "crypto" ) ;
const securityHelper = require ( "../../helpers/security.helper" ) ;
const authService = require ( "./auth.service" ) ;
const userService = require ( "./user.service" ) ;
2022-12-05 14:29:14 +00:00
const marketing = require ( "../../helpers/sendinblue.helper" ) ;
2022-12-05 14:47:52 +00:00
const marketingService = require ( "../events/marketing_list.service" ) ;
2022-02-17 13:20:42 +00:00
const eventInscriptionService = require ( "../events/events_inscriptions.service" ) ;
const { RequestContactImportNewList } = require ( "sib-api-v3-sdk" ) ;
moment . locale ( "es" ) ;
2019-04-24 21:01:54 +00:00
////////////////////////////////////////////////////////////////////////////////
// CONSTANTS
////////////////////////////////////////////////////////////////////////////////
// Module Name
2022-02-17 13:20:42 +00:00
const MODULE _NAME = "[auth.controller]" ;
2019-04-24 21:01:54 +00:00
////////////////////////////////////////////////////////////////////////////////
// PUBLIC METHODS
////////////////////////////////////////////////////////////////////////////////
async function login ( req , res , next ) {
2022-02-17 13:20:42 +00:00
try {
const data = {
id : req . user . id ,
email : req . user . email ,
phone : req . user . phoneNumber ,
fbuid : req . user . uid ,
} ;
const tokens = securityHelper . generateToken ( data ) ;
const response = {
token : tokens . token ,
refreshToken : tokens . refreshToken ,
user : req . user ,
} ;
return controllerHelper . handleResultResponse (
response ,
null ,
req . params ,
res ,
httpStatus . OK
) ;
} catch ( error ) {
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 ) {
2022-02-17 13:20:42 +00:00
try {
const appVersion =
req && req . headers && req . headers [ "accept-version" ]
? req . headers [ "accept-version" ]
: null ;
console . log ( "loginWithPhone - appVersion: " , appVersion ) ;
console . log ( req . user ) ;
const findOptions = {
phone : req . user . phoneNumber ,
fbuid : req . user . uid ,
} ;
//Comprobamos si el usuario ya existe en nuestro sistema
let _user = await authService . extraMethods . findUserByPhone (
req . user . phoneNumber
) ;
if ( _user ) {
_user = _user . toJSON ( ) ;
if ( appVersion ) {
if ( _user . app _version != appVersion ) {
2022-03-16 09:08:33 +00:00
userService . _updateLastLoginAndVersionUser (
2022-02-17 13:20:42 +00:00
_user . id ,
appVersion
) ;
_user . app _version = appVersion ;
2019-08-09 11:35:09 +00:00
}
2022-02-17 13:20:42 +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 ;
//Recuperamos el número de tickets para los proximos eventos
try {
const result =
await eventInscriptionService . _getInscriptionsOfNextEventsUser (
_user . id
) ;
console . log ( "Entradas del usuario" , result ) ;
_user . nextTicketsCount = result ;
} catch ( error ) {
2019-10-14 14:59:55 +00:00
console . error ( error ) ;
2022-02-18 19:32:30 +00:00
return controllerHelper . handleErrorResponse (
2022-02-17 13:20:42 +00:00
MODULE _NAME ,
"getInscriptionsOfNextEventsCount" ,
error ,
res
) ;
}
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
}
2022-02-17 13:20:42 +00:00
} catch ( error ) {
console . error ( error ) ;
return controllerHelper . handleErrorResponse (
MODULE _NAME ,
login . name ,
error ,
res
) ;
}
2019-08-03 17:11:32 +00:00
}
2019-06-21 08:40:28 +00:00
async function register ( req , res , next ) {
2022-02-17 13:20:42 +00:00
function cleanAdminData ( user ) {
let cUser = user ;
delete cUser . lastLogin ;
delete cUser . state ;
delete cUser . createdAt ;
delete cUser . updatedAt ;
return cUser ;
}
const values = {
phone : req . body . phone ,
fbuid : req . body . fbuid ,
} ;
const appVersion =
req && req . headers && req . headers [ "accept-version" ]
? req . headers [ "accept-version" ]
: null ;
console . log ( "register - appVersion: " , appVersion ) ;
//Comprobamos si el usuario ya existe en nuestro sistema
2022-03-12 11:03:31 +00:00
console . log ( "COMPROBAMOS SI EXISTE EN NUESTRO SISTEMA" , values . phone ) ;
2022-02-17 13:20:42 +00:00
let newUser = await authService . extraMethods . findUserByPhone ( values . phone ) ;
2022-03-12 11:03:31 +00:00
2022-12-05 14:29:14 +00:00
const data = {
//refresh_token: tokens.refreshToken,
phone : req . body . phone ,
fbuid : req . body . fbuid ,
email : req . body . email ,
name : req . body . name ,
surname : req . body . surname ,
entityId : req . body . entityid ,
accessibility : req . body . accessibility ,
profile : req . body . profile ,
app _version : appVersion ,
lastlogin : moment ( ) . utc ( ) ,
} ;
2022-02-17 13:20:42 +00:00
if ( ! newUser ) {
2022-03-12 11:03:31 +00:00
console . log ( "NO EXISTE" ) ;
2022-02-17 13:20:42 +00:00
try {
newUser = await authService . extraMethods . createUser ( data ) ;
console . log ( "CREAMOS EL USUARIO EN NUESTRO SISTEMA" , newUser ) ;
} catch ( error ) {
console . error ( error ) ;
return controllerHelper . handleErrorResponse (
MODULE _NAME ,
register . name ,
error ,
res
) ;
}
2022-12-05 14:29:14 +00:00
} else {
console . log ( "EXISTE" ) ;
try {
const oldUserData = newUser ;
newUser = await authService . extraMethods . updateUser ( newUser . id , data ) ;
2022-12-05 14:47:52 +00:00
const userDTO = marketingService . userToMarktingDTO ( newUser ) ;
console . log ( userDTO ) ;
marketing . updateMemberByEmail ( oldUserData . email , userDTO ) ;
2022-12-05 14:29:14 +00:00
console . log ( "MODIFICAMOS EL USUARIO EN NUESTRO SISTEMA" , newUser ) ;
} catch ( error ) {
console . error ( error ) ;
return controllerHelper . handleErrorResponse (
MODULE _NAME ,
register . name ,
error ,
res
) ;
}
2022-02-17 13:20:42 +00:00
}
if ( newUser ) {
newUser = newUser . toJSON ( ) ;
newUser = cleanAdminData ( newUser ) ;
if ( appVersion ) {
if ( newUser . app _version != appVersion ) {
2022-03-16 09:08:33 +00:00
const result = await userService . _updateLastLoginAndVersionUser (
2022-02-17 13:20:42 +00:00
newUser . id ,
appVersion
) ;
newUser . app _version = appVersion ;
}
}
2019-09-09 14:36:45 +00:00
2022-02-17 13:20:42 +00:00
const tokenData = {
phone : values . phone ,
fbuid : values . fbuid ,
id : newUser . id ,
email : newUser . email ,
2019-07-09 13:59:58 +00:00
} ;
2022-02-17 13:20:42 +00:00
const tokens = securityHelper . generateToken ( tokenData ) ;
newUser . token = tokens . token ;
console . log ( "COMO YA EXISTE CREAMOS EL TOKEN Y LO ASIGNAMOS" , newUser ) ;
}
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 13:20:42 +00:00
const refreshToken = req . body . token ;
const phone = req . body . phone ;
const email = req . body . email ;
const user = await authService . extraMethods . findUserByRefreshToken (
refreshToken
) ;
console . debug ( user , req . body ) ;
if ( user && user . phone === phone && user . email === email ) {
const tokenData = {
phone : user . phone ,
fbuid : user . fbuid ,
id : user . id ,
email : user . email ,
} ;
2019-06-21 08:40:28 +00:00
2022-02-17 13:20:42 +00:00
try {
const tokens = securityHelper . generateToken ( tokenData ) ;
await authService . extraMethods . updateUserRefreshToken (
user . id ,
tokens . refreshToken
) ;
const result = { token : tokens . token } ;
return controllerHelper . handleResultResponse (
result ,
null ,
req . params ,
res ,
httpStatus . OK
) ;
} catch ( error ) {
return controllerHelper . handleErrorResponse (
MODULE _NAME ,
regenerateToken . name ,
error ,
res
) ;
2019-07-09 10:55:45 +00:00
}
2022-02-17 13:20:42 +00:00
} else {
return controllerHelper . handleResultResponse (
null ,
null ,
req . params ,
res ,
httpStatus . UNAUTHORIZED
) ;
}
2019-07-09 10:55:45 +00:00
}
2022-02-17 13:20:42 +00:00
async function rejectToken ( req , res , next ) {
const refreshToken = req . body . refreshToken ;
const user = await authService . extraMethods . findUserByRefreshToken (
refreshToken
) ;
2019-08-14 11:50:28 +00:00
2022-02-17 13:20:42 +00:00
if ( user && user . token === refreshToken ) {
2019-08-14 11:50:28 +00:00
try {
2022-02-17 13:20:42 +00:00
await authService . extraMethods . deleteRefreshToken ( refreshToken ) ;
return controllerHelper . handleResultResponse (
2022-02-18 19:32:30 +00:00
null ,
2022-02-17 13:20:42 +00:00
null ,
req . params ,
res ,
httpStatus . OK
) ;
2019-08-14 11:50:28 +00:00
} catch ( error ) {
2022-02-17 13:20:42 +00:00
return controllerHelper . handleErrorResponse (
MODULE _NAME ,
rejectToken . name ,
error ,
res
) ;
2019-08-14 11:50:28 +00:00
}
2022-02-17 13:20:42 +00:00
} else {
return controllerHelper . handleResultResponse (
null ,
null ,
req . params ,
res ,
httpStatus . NOT _FOUND
) ;
}
}
2019-08-14 11:50:28 +00:00
2022-02-17 13:20:42 +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" ) ,
} ;
2019-08-14 11:50:28 +00:00
2022-02-17 13:20:42 +00:00
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
2022-02-18 19:32:30 +00:00
function adminVerify ( req , res , next ) {
return controllerHelper . handleResultResponse (
"OK" ,
null ,
req . params ,
res ,
httpStatus . OK
) ;
}
2019-09-13 14:45:02 +00:00
function verify ( req , res , next ) {
2022-02-17 13:20:42 +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 ) {
2022-02-17 13:20:42 +00:00
const params = controllerHelper . extractParamsFromRequest ( req , res , { } ) ;
let dataInscription = res . locals . dataInscription ;
if ( ! dataInscription )
2022-02-18 19:32:30 +00:00
return controllerHelper . handleResultResponse (
2022-03-11 11:37:03 +00:00
"Error getOrCreateUser, prepareDataInscription, recuperateReservationByCode requerida" ,
2022-02-17 13:20:42 +00:00
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
2022-02-18 19:32:30 +00:00
return controllerHelper . handleResultResponse (
2022-02-17 13:20:42 +00:00
"No se ha podido crear o encontrar el usuario dado" ,
null ,
params ,
res ,
httpStatus . NOT _FOUND
) ;
}
} catch ( error ) {
2022-02-18 19:32:30 +00:00
return controllerHelper . handleErrorResponse (
MODULE _NAME ,
2022-03-11 11:37:03 +00:00
"getOrCreateUser" ,
2022-02-18 19:32:30 +00:00
error ,
res
) ;
2022-02-17 13:20:42 +00:00
}
2022-03-11 11:37:03 +00:00
//console.log(">>>>>>>>>>>>>>>>>>>> getOrCreateUser", dataUser.userResult.user.Entity);
//Refrescamos datos que nos interesan
2022-03-12 11:03:31 +00:00
dataUser . id = dataUser . userResult . user . id ;
2022-02-17 13:20:42 +00:00
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 ;
2022-03-11 11:37:03 +00:00
2022-03-12 11:03:31 +00:00
dataUser . email = dataUser . userResult . user ? dataUser . userResult . user . email : null ;
2022-03-11 11:37:03 +00:00
dataUser . phone = dataUser . userResult . user ? dataUser . userResult . user . phone : null ; //((req.body.phone != '+34') ? req.body.phone : null), lo quitamos de momento por la de movistar
dataUser . name = dataUser . userResult . user ? dataUser . userResult . user . name : null ;
dataUser . surname = dataUser . userResult . user ? dataUser . userResult . user . surname : null ;
2022-03-12 11:03:31 +00:00
;
2022-03-11 11:37:03 +00:00
//Reasignamos a variable de entorno
2022-02-17 13:20:42 +00:00
res . locals . dataUser = dataUser ;
next ( ) ;
2022-02-17 12:12:13 +00:00
}
2019-07-09 10:55:45 +00:00
2022-12-05 14:29:14 +00:00
async function deleteUser ( req , res , next ) {
const params = controllerHelper . extractParamsFromRequest ( req , res , { } ) ;
let dataUser = {
id : req . body ? req . body . id : null ,
phone : req . body ? req . body . phone : null , //((req.body.phone != '+34') ? req.body.phone : null), lo quitamos de momento por la de movistar
email : req . body ? req . body . email : null ,
} ;
const resultCount = await authService . deleteUser ( dataUser . id , dataUser . email , dataUser . phone ) ;
if ( resultCount < 1 ) {
// No se ha encontrado
return controllerHelper . handleResultResponse (
"No se ha podido encontrar el usuario" , null , params , res , httpStatus . NOT _FOUND ) ;
}
return controllerHelper . handleResultResponse ( resultCount , resultCount , params , res , httpStatus . OK ) ;
}
2019-04-24 21:01:54 +00:00
module . exports = {
2022-02-17 13:20:42 +00:00
login ,
loginWithPhone ,
register ,
regenerateToken ,
rejectToken ,
singup ,
2022-02-18 19:32:30 +00:00
adminVerify ,
2022-02-17 13:20:42 +00:00
verify ,
getOrCreateUser ,
2022-12-05 14:29:14 +00:00
deleteUser ,
2022-02-17 13:20:42 +00:00
MODULE _NAME ,
} ;