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" ) ;
2024-05-31 10:06:36 +00:00
const marketing = require ( "../../helpers/hubspot.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 ,
} ;
2023-06-14 09:34:19 +00:00
return controllerHelper . handleResultResponse ( response , null , req . params , res , httpStatus . OK ) ;
2022-02-17 13:20:42 +00:00
} catch ( error ) {
2023-06-14 09:34:19 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , login . name , error , res ) ;
2022-02-17 13:20:42 +00:00
}
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 {
2023-06-14 09:34:19 +00:00
const appVersion = req && req . headers && req . headers [ "accept-version" ] ? req . headers [ "accept-version" ] : null ;
2022-02-17 13:20:42 +00:00
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
2023-06-14 09:34:19 +00:00
let _user = await authService . extraMethods . findUserByPhone ( req . user . phoneNumber ) ;
2022-02-17 13:20:42 +00:00
if ( _user ) {
_user = _user . toJSON ( ) ;
if ( appVersion ) {
if ( _user . app _version != appVersion ) {
2023-06-14 09:34:19 +00:00
userService . _updateLastLoginAndVersionUser ( _user . id , appVersion ) ;
2022-02-17 13:20:42 +00:00
_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 {
2023-06-14 09:34:19 +00:00
const result = await eventInscriptionService . _getInscriptionsOfNextEventsUser ( _user . id ) ;
2022-02-17 13:20:42 +00:00
console . log ( "Entradas del usuario" , result ) ;
_user . nextTicketsCount = result ;
} catch ( error ) {
2019-10-14 14:59:55 +00:00
console . error ( error ) ;
2023-06-14 09:34:19 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , "getInscriptionsOfNextEventsCount" , error , res ) ;
2022-02-17 13:20:42 +00:00
}
2023-06-14 09:34:19 +00:00
return controllerHelper . handleResultResponse ( _user , null , req . params , res , httpStatus . OK ) ;
2022-02-17 13:20:42 +00:00
} else {
2023-06-14 09:34:19 +00:00
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 ) ;
2023-06-14 09:34:19 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , login . name , error , res ) ;
2022-02-17 13:20:42 +00:00
}
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 ,
} ;
2023-06-14 09:34:19 +00:00
const appVersion = req && req . headers && req . headers [ "accept-version" ] ? req . headers [ "accept-version" ] : null ;
2022-02-17 13:20:42 +00:00
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 ,
2023-06-14 09:34:19 +00:00
country : req . body . country ? req . body . country : "ES" ,
2022-12-05 14:29:14 +00:00
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 ) ;
2023-06-14 09:34:19 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , register . name , error , res ) ;
2022-02-17 13:20:42 +00:00
}
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
2022-12-05 17:34:22 +00:00
try {
2022-12-12 11:29:05 +00:00
const userDTO = marketingService . userToMarketingDTO ( newUser ) ;
if ( await marketing . getMemberByEmail ( newUser . email ) ) {
marketing . updateMemberByEmail ( oldUserData . email , userDTO ) ;
} else {
// No mandar a Sendinblue hasta que no se inscriba en un congreso.
}
2022-12-05 17:34:22 +00:00
} catch ( err ) {
console . error ( err ) ;
}
2022-12-05 14:29:14 +00:00
console . log ( "MODIFICAMOS EL USUARIO EN NUESTRO SISTEMA" , newUser ) ;
} catch ( error ) {
console . error ( error ) ;
2023-06-14 09:34:19 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , register . name , error , res ) ;
2022-12-05 14:29:14 +00:00
}
2022-02-17 13:20:42 +00:00
}
if ( newUser ) {
newUser = newUser . toJSON ( ) ;
newUser = cleanAdminData ( newUser ) ;
if ( appVersion ) {
if ( newUser . app _version != appVersion ) {
2023-06-14 09:34:19 +00:00
const result = await userService . _updateLastLoginAndVersionUser ( newUser . id , appVersion ) ;
2022-02-17 13:20:42 +00:00
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 ) ;
}
2023-06-14 09:34:19 +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 13:20:42 +00:00
const refreshToken = req . body . token ;
const phone = req . body . phone ;
const email = req . body . email ;
2023-06-14 09:34:19 +00:00
const user = await authService . extraMethods . findUserByRefreshToken ( refreshToken ) ;
2022-02-17 13:20:42 +00:00
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 ) ;
2023-06-14 09:34:19 +00:00
await authService . extraMethods . updateUserRefreshToken ( user . id , tokens . refreshToken ) ;
2022-02-17 13:20:42 +00:00
const result = { token : tokens . token } ;
2023-06-14 09:34:19 +00:00
return controllerHelper . handleResultResponse ( result , null , req . params , res , httpStatus . OK ) ;
2022-02-17 13:20:42 +00:00
} catch ( error ) {
2023-06-14 09:34:19 +00:00
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 {
2023-06-14 09:34:19 +00:00
return controllerHelper . handleResultResponse ( null , null , req . params , res , httpStatus . UNAUTHORIZED ) ;
2022-02-17 13:20:42 +00:00
}
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 ;
2023-06-14 09:34:19 +00:00
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 ) ;
2023-06-14 09:34:19 +00:00
return controllerHelper . handleResultResponse ( null , null , req . params , res , httpStatus . OK ) ;
2019-08-14 11:50:28 +00:00
} catch ( error ) {
2023-06-14 09:34:19 +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 {
2023-06-14 09:34:19 +00:00
return controllerHelper . handleResultResponse ( null , null , req . params , res , httpStatus . NOT _FOUND ) ;
2022-02-17 13:20:42 +00:00
}
}
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 ,
2023-06-14 09:34:19 +00:00
password : crypto . createHash ( "sha512" ) . update ( req . body . password ) . digest ( "hex" ) ,
2022-02-17 13:20:42 +00:00
} ;
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 ) ;
2023-06-14 09:34:19 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , register . name , error , res ) ;
2022-02-17 13:20:42 +00:00
}
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 ;
}
2023-06-14 09:34:19 +00:00
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 ) {
2023-06-14 09:34:19 +00:00
return controllerHelper . handleResultResponse ( "OK" , null , req . params , res , httpStatus . OK ) ;
2022-02-18 19:32:30 +00:00
}
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 ;
2023-06-14 09:34:19 +00:00
if ( user && user . phone === phone && user . email === email && user . fbuid === fbuid ) {
return controllerHelper . handleResultResponse ( user , null , req . params , res , httpStatus . OK ) ;
2022-02-17 13:20:42 +00:00
} else {
2023-06-14 09:34:19 +00:00
return controllerHelper . handleResultResponse ( null , null , req . params , res , httpStatus . UNAUTHORIZED ) ;
2022-02-17 13:20:42 +00:00
}
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.
2024-08-30 09:14:50 +00:00
let dataUser ;
//OJO API V4 El relleno lo hago dentro de _getOrCreateUserWEBV4
if ( _ . isEmpty ( req . user ) )
dataUser = { }
else {
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 ,
} ;
}
2022-02-17 13:20:42 +00:00
//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 {
2024-08-30 09:14:50 +00:00
2024-08-30 10:09:39 +00:00
if ( req . user )
2024-08-29 16:40:13 +00:00
{
2024-08-29 17:19:31 +00:00
//MAPEO SALIDA API4
//Caso API V4 user {}
2024-08-29 16:46:05 +00:00
if ( _ . isEmpty ( req . user ) )
2024-08-30 08:18:03 +00:00
dataUser . userResult = await userService . _getOrCreateUserWEBV4 ( dataUser , req ) ;
2024-08-30 09:14:50 +00:00
//Si viene user relleno viene por APP
2024-08-29 17:19:31 +00:00
else dataUser . userResult = await userService . _getOrCreateUser ( dataUser ) ;
2024-08-30 09:14:50 +00:00
} //Caso Formulario web página actual
//CHAPUZA SE PERMITE DAR DE ALTA USUARIOS CON EL MISMO CORREO ELECTRONICO, PERO DISTINTO NOMBRE Y APELLIDO.
2022-02-17 13:20:42 +00:00
else dataUser . userResult = await userService . _getOrCreateUserWEB ( dataUser ) ;
2024-08-29 16:22:22 +00:00
console . log ( 'CHAPUZAAAAAAAAAA2>>>' , dataUser . userResult ) ;
2022-02-17 13:20:42 +00:00
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 ) {
2024-08-30 08:27:04 +00:00
console . log ( "error>>>>" , error ) ;
2023-06-14 09:34:19 +00:00
return controllerHelper . handleErrorResponse ( MODULE _NAME , "getOrCreateUser" , error , res ) ;
2022-02-17 13:20:42 +00:00
}
2022-03-11 11:37:03 +00:00
2023-06-14 09:34:19 +00:00
//console.log(">>>>>>>>>>>>>>>>>>>> getOrCreateUser", dataUser.userResult.user.Entity);
2022-03-11 11:37:03 +00:00
//Refrescamos datos que nos interesan
2022-03-12 11:03:31 +00:00
dataUser . id = dataUser . userResult . user . id ;
2023-06-14 09:34:19 +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 ;
//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 ,
} ;
2022-12-05 17:34:22 +00:00
const resultCount = await authService . extraMethods . deleteUser ( dataUser . id , dataUser . email , dataUser . phone ) ;
2022-12-05 14:29:14 +00:00
if ( resultCount < 1 ) {
// No se ha encontrado
return controllerHelper . handleResultResponse (
2023-06-14 09:34:19 +00:00
"No se ha podido encontrar el usuario" ,
null ,
params ,
res ,
httpStatus . NOT _FOUND
) ;
2022-12-05 14:29:14 +00:00
}
2022-12-05 17:34:22 +00:00
// Delete in Sendinblue
try {
2022-12-12 11:29:05 +00:00
const userDTO = marketingService . userToMarketingDTO ( dataUser ) ;
2022-12-05 17:34:22 +00:00
marketing . deleteMemberByEmail ( userDTO . email ) ;
2022-12-07 12:45:54 +00:00
} catch ( error ) {
2022-12-15 11:20:14 +00:00
console . log ( error ) ;
//return controllerHelper.handleErrorResponse(MODULE_NAME, "deleteUser", error, res);
2022-12-05 17:34:22 +00:00
}
2022-12-05 14:29:14 +00:00
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 ,
} ;