Files
AlquilaFacil/Aspnet/Controllers/UsuarioController.cs

104 lines
4.4 KiB
C#

using AlquilaFacil.Builder;
using Microsoft.AspNetCore.Mvc;
using Modelo;
using Entidades;
using AlquilaFacil.Emailer.Sender;
namespace AlquilaFacil.Controllers;
[ApiController]
public class UsuarioController : ControllerBase
{
[HttpGet("/api/usuario")]
public IActionResult ObtenerInfoUsuario([FromHeader(Name = "Auth")] string Auth)
{
Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
if (cli == null) return BadRequest(new { message = "No hay un usuari por ese token" });
var usu = new UsuarioDtoBuilder()
.SetNombre(cli.Nombre).SetApellido(cli.Apellido)
.SetEmail(cli.Email).SetCelular(cli.Celular)
.SetDni(cli.Dni).SetDomicilio(cli.Domicilio)
.SetEmailRecuperacion(cli.EmailRecuperacion)
.Build();
return Ok(usu);
}
public class bodyCambiarContraseña
{
public string contraseña { get; set; } = "";
}
[HttpPatch("/api/usuario")]
public IActionResult CambiarPass([FromHeader(Name = "Auth")] string Auth, [FromBody] bodyCambiarContraseña body)
{
Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
if (cli == null) return BadRequest(new { message = "No hay un usuario por ese token" });
if (body.contraseña.Length < 8) return BadRequest(new { message = "Tiene que tener por lo menos 8 caracteres" });
bool ret = RepositorioUsuarios.Singleton.CambiarContraseña(body.contraseña, cli);
return ret ? Ok(new { message = "Contraseña cambiada con éxito" }) : BadRequest(new { message = "No se pudo cambiar la contraseña" });
}
public record setemail(string EmailRecuperacion);
[HttpPut("/api/usuario/emailrecuperacion")]
public IActionResult CambiarPass([FromHeader(Name = "Auth")] string Auth, [FromBody] setemail setemail)
{
Cliente? cli = RepositorioUsuarios.Singleton.ObtenerClientePorToken(Auth);
if (cli == null) return BadRequest(new { message = "No hay un usuario por ese token" });
string emailrecuperacion = setemail.EmailRecuperacion;
if (!emailrecuperacion.Contains("@")) return BadRequest(new { message = "Tiene que ser un email" });
bool ret = RepositorioUsuarios.Singleton.SetEmailRecuperacion(emailrecuperacion, cli);
if (ret == false) return BadRequest(new { message = "No se pudo actualizar el email de recuperación" });
Task.Run(() =>
{
AvisoEmailSender s = new();
s.Send(cli.Email, setemail.EmailRecuperacion);
});
return Ok(new { message = "Email de recuperación actualizado con éxito" });
}
public record recuperarusuario(string Email, string EmailRecuperacion);
[HttpPost("/api/recuperarUsuario")]
public IActionResult RecuperarUsuario([FromBody] recuperarusuario mails)
{
bool check = RepositorioUsuarios.Singleton.CheckEmailRecuperacion(mails.Email, mails.EmailRecuperacion);
if (check == false) return BadRequest(new { message = "El email no corresponde al email de recuperacion" });
string pin = "";
var ran = new Random();
for (int i = 0; i < 6; i++) pin += ran.Next(0, 10);
bool ret = RepositorioUsuarios.Singleton.SetF2aPin(pin, mails.Email);
if (ret == false) return BadRequest(new { message = "no se pudo generar/guardar el codigo 2fa" });
OtpEmailSender s = new();
s.Send(mails.EmailRecuperacion, mails.Email, pin);
return Ok(new { message = $"Se envio un email de recuperacion a {mails.EmailRecuperacion}" });
}
public record ingreso2fa(string Pin, string Email);
[HttpPost("/api/ingresar2fa")]
public IActionResult IngresarUsuario([FromBody] ingreso2fa data)
{
if (!data.Email.Contains("@")) return BadRequest(new { message = "Tiene que ser un email" });
if (data.Pin.Length != 6) return BadRequest(new { message = "el pin tiene que tener 6 digitos" });
(bool check, long Dni) = RepositorioUsuarios.Singleton.Check2fa(data.Email, data.Pin);
if (check == false) return BadRequest(new { message = "El pin es incorrecto" });
var cli = RepositorioUsuarios.Singleton.ObtenerClientePorDni(Dni);
//esto literalmente no se puede triggerear pero lo pongo para evitar una warning
if (cli == null) return BadRequest(new { message = "El usuario no existe" });
return Ok(new { token = cli.Token });
}
}