app2-api/modules/auth/auth.controller.js

428 lines
14 KiB
JavaScript
Raw Normal View History

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-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) {
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
}
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
try {
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.
}
} 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,
};
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);
2022-02-17 13:20:42 +00:00
if (user && user.token === refreshToken) {
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);
} catch (error) {
2023-06-14 09:34:19 +00:00
return controllerHelper.handleErrorResponse(MODULE_NAME, rejectToken.name, error, res);
}
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
}
}
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
};
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
}
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
}
}
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,
};
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
}
// Delete in Sendinblue
try {
const userDTO = marketingService.userToMarketingDTO(dataUser);
marketing.deleteMemberByEmail(userDTO.email);
2022-12-07 12:45:54 +00:00
} catch (error) {
console.log(error);
//return controllerHelper.handleErrorResponse(MODULE_NAME, "deleteUser", error, res);
}
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,
};