From d2adb7733e70dee7bec8e745ef37af484235be14 Mon Sep 17 00:00:00 2001 From: fede Date: Sun, 17 Nov 2024 02:04:26 -0300 Subject: [PATCH] =?UTF-8?q?nom=C3=A1s=20me=20faltan=20los=20put=20para=20p?= =?UTF-8?q?ropiedades?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fede --- Aspnet/Controllers/AccionesController.cs | 2 +- Aspnet/Controllers/PropiedadesController.cs | 89 +++++++++++++++++++++ Aspnet/Controllers/PropietarioController.cs | 14 +++- Aspnet/makefile | 2 +- Entidades/Alquilafacilcontext.cs | 4 + Entidades/Cliente.cs | 2 + Entidades/Dto/AltaPropiedadDto.cs | 9 +++ Entidades/Dto/PropiedadDto.cs | 9 --- Entidades/Dto/PropiedadesDto.cs | 9 +++ Modelo/RepositorioPropiedades.cs | 56 ++++++++++++- Modelo/RepositorioPropietario.cs | 31 ++++++- Modelo/RepositorioUsuarios.cs | 7 +- 12 files changed, 211 insertions(+), 23 deletions(-) create mode 100644 Entidades/Dto/AltaPropiedadDto.cs delete mode 100644 Entidades/Dto/PropiedadDto.cs create mode 100644 Entidades/Dto/PropiedadesDto.cs diff --git a/Aspnet/Controllers/AccionesController.cs b/Aspnet/Controllers/AccionesController.cs index 240f30c..4772e51 100644 --- a/Aspnet/Controllers/AccionesController.cs +++ b/Aspnet/Controllers/AccionesController.cs @@ -7,10 +7,10 @@ namespace AlquilaFacil.Controllers; [ApiController] public class AccionesController: ControllerBase { + //Reutilizo el loginDto pero no lleno el campo de contraseña [HttpPost("api/acciones")] public IActionResult ListarAccionesPorUsuario([FromBody] LoginDto email, [FromHeader(Name = "Auth")] string Auth) { if (email.Email == "" || email.Email == null) return BadRequest(); - if (Auth == "") return Unauthorized(new { esValido = false}); diff --git a/Aspnet/Controllers/PropiedadesController.cs b/Aspnet/Controllers/PropiedadesController.cs index 2c35437..77d05a0 100644 --- a/Aspnet/Controllers/PropiedadesController.cs +++ b/Aspnet/Controllers/PropiedadesController.cs @@ -1,3 +1,6 @@ +using Entidades; +using Entidades.Dto; +using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Modelo; @@ -12,5 +15,91 @@ public class PropiedadesController: ControllerBase { if (validacion1 == false) return Unauthorized(); var ret = RepositorioPropiedades.Singleton.ListarPropiedades(); + return Ok(ret); + } + + [HttpGet("api/propiedad")] + public IActionResult ObtenerPropiedadPorId(int Id, [FromHeader(Name = "Auth")] string Auth) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, Request.Path); + if (validacion1 == false) return Unauthorized(); + + if (Id < 0) return BadRequest("la id de propiedad no puede ser negativa"); + + var ret = RepositorioPropiedades.Singleton.ObtenerPropiedadPorId(Id); + if (ret == null) return BadRequest("No existe la propiedad"); + return Ok(ret); + } + + [HttpGet("api/propiedades/Propietario")] + public IActionResult ObtenerPropiedadesPorPropietario( + [FromBody] string email, + [FromHeader(Name = "Auth")] string Auth) { + + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, Request.Path); + if (validacion1 == false) return Unauthorized(); + + email = email.Trim(); + if (String.IsNullOrEmpty(email)) return BadRequest("falta campo email"); + + var ret = RepositorioPropiedades.Singleton.ObtenerPropiedadesPorEmail(email); + + return Ok(ret); + } + + [HttpPost("api/propiedad")] + public IActionResult AltaPropiedad([FromBody] AltaPropiedadDto propiedad, [FromHeader(Name = "Auth")] string Auth) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, Request.Path); + if (validacion1 == false) return Unauthorized(); + + string validacion2 = ValidarPropiedad(propiedad); + if (validacion2 != "") return BadRequest(new { message = validacion2 }); + + Cliente? cli = RepositorioPropietario.Singleton.ObtenerPropietarioPorEmail(propiedad.Email); + if (cli == null) return BadRequest("El email no corresponde a un propietario"); + + Propiedade Prop = new Propiedade{ + Canthabitaciones = propiedad.Canthabitaciones, + Dnipropietario = cli.Dni, + Idtipropiedad = propiedad.Idtipropiedad, + Ubicacion = propiedad.Ubicacion, + Letra = propiedad.Letra != null ? propiedad.Letra : null, + Piso = propiedad.Piso != null ? propiedad.Piso : null, + }; + + var ret = RepositorioPropiedades.Singleton.AñadirPropiedad(Prop); + return (ret)? + Ok("Fue Cargado Correctamente") : + BadRequest("Fallo al momento de añadir la propiedad a la base de datos"); + } + + [HttpDelete("api/propiedad")] + public IActionResult BajaPropiedad(int id, [FromHeader(Name = "Auth")] string Auth){ + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, "/accion/2"); + if (validacion1 == false) return Unauthorized(); + + if (id <= 0) return BadRequest("No es una id valida"); + + var ret = RepositorioPropiedades.Singleton.BajaPropiedad(id); + + return ret ? + Ok(new {message = $"la propiedad con id {id} fue dada de baja"}): + BadRequest("Fallo al dar de baja la propiedad"); + } + + private string ValidarPropiedad(AltaPropiedadDto prop) { + if (prop == null) return "Esta mal formado el body de la request"; + + string ret = ""; + if (String.IsNullOrEmpty(prop.Email)) ret += "Falta Definir un email de propietario\n"; + if (prop.Canthabitaciones < 0) ret += "No se puede tener una cantidad de habitaciones negativa\n"; + if (prop.Idtipropiedad <= 0) ret += "No tiene un tipo de propiedad asociada"; + if (String.IsNullOrEmpty(prop.Ubicacion)) ret += "Tiene que definir la ubicacion de la propiedad\n"; + + return ret; + } } \ No newline at end of file diff --git a/Aspnet/Controllers/PropietarioController.cs b/Aspnet/Controllers/PropietarioController.cs index 84a54d4..0023501 100644 --- a/Aspnet/Controllers/PropietarioController.cs +++ b/Aspnet/Controllers/PropietarioController.cs @@ -2,6 +2,7 @@ using System.Security.Cryptography; using System.Text; using Entidades; using Entidades.Dto; +using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Modelo; @@ -10,8 +11,19 @@ namespace AlquilaFacil.Controllers; [ApiController] public class PropietarioController: ControllerBase { + [HttpGet("api/propietario")] + public IActionResult ObtenerPropietarioPorDni(long Dni, [FromHeader(Name ="Auth")] string Auth) { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, Request.Path); + if (validacion1 == false) return Unauthorized(); + + var ret = RepositorioPropietario.Singleton.ObtenerPropietarioPorDni(Dni); + return Ok(ret); + } + [HttpPost("api/propietarios")] - public IActionResult AltaPropietario([FromBody]CrearClienteDto Propietario,[FromHeader(Name = "Auth")] string Auth) { + public IActionResult AltaPropietario([FromBody]CrearClienteDto Propietario, + [FromHeader(Name = "Auth")] string Auth) { if (String.IsNullOrEmpty(Auth)) return Unauthorized(); var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, Request.Path); if (validacion1 == false) return Unauthorized(); diff --git a/Aspnet/makefile b/Aspnet/makefile index 46aa736..e528264 100644 --- a/Aspnet/makefile +++ b/Aspnet/makefile @@ -1,2 +1,2 @@ run: - dotnet watch run + dotnet watch run --project AlquilaFacil.csproj diff --git a/Entidades/Alquilafacilcontext.cs b/Entidades/Alquilafacilcontext.cs index 74288dc..2966b4e 100644 --- a/Entidades/Alquilafacilcontext.cs +++ b/Entidades/Alquilafacilcontext.cs @@ -101,6 +101,10 @@ public partial class AlquilaFacilContext : DbContext entity.Property(e => e.Email) .HasMaxLength(50) .HasColumnName("email"); + entity.Property(e => e.Habilitado) + .HasDefaultValueSql("b'1'") + .HasColumnType("bit(1)") + .HasColumnName("habilitado"); entity.Property(e => e.Nombre) .HasMaxLength(20) .HasColumnName("nombre"); diff --git a/Entidades/Cliente.cs b/Entidades/Cliente.cs index e4a2b2d..ef52593 100644 --- a/Entidades/Cliente.cs +++ b/Entidades/Cliente.cs @@ -21,6 +21,8 @@ public partial class Cliente public string? Token { get; set; } + public ulong Habilitado { get; set; } + public virtual ICollection ContratoDniinquilinoNavigations { get; set; } = new List(); public virtual ICollection ContratoDnipropietarioNavigations { get; set; } = new List(); diff --git a/Entidades/Dto/AltaPropiedadDto.cs b/Entidades/Dto/AltaPropiedadDto.cs new file mode 100644 index 0000000..86865ce --- /dev/null +++ b/Entidades/Dto/AltaPropiedadDto.cs @@ -0,0 +1,9 @@ +namespace Entidades.Dto; +public class AltaPropiedadDto { + public string Ubicacion { get; set; } = null!; + public int Canthabitaciones { get; set; } + public int? Piso { get; set; } = null; + public string? Letra { get; set; } = null; + public string Email { get; set; } = string.Empty; + public int Idtipropiedad { get; set; } +} \ No newline at end of file diff --git a/Entidades/Dto/PropiedadDto.cs b/Entidades/Dto/PropiedadDto.cs deleted file mode 100644 index fef97c8..0000000 --- a/Entidades/Dto/PropiedadDto.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Entidades.Dto; -public class PropiedadDto { - public string Ubicacion { get; set; } = null!; - public int Canthabitaciones { get; set; } - public int? Piso { get; set; } - public string? Letra { get; set; } - public string Email { get; set; } - public int Idtipropiedad { get; set; } -} \ No newline at end of file diff --git a/Entidades/Dto/PropiedadesDto.cs b/Entidades/Dto/PropiedadesDto.cs new file mode 100644 index 0000000..d63e3a9 --- /dev/null +++ b/Entidades/Dto/PropiedadesDto.cs @@ -0,0 +1,9 @@ +namespace Entidades.Dto; +public class PropiedadesDto { + public int id { get; set; } + public string Ubicacion { get; set; } = ""; + public int canthabitaciones { get; set; } + public string piso { get; set; } = ""; + public string letra { get; set; } = ""; + public string TipoPropiedad { get; set; } = ""; +} \ No newline at end of file diff --git a/Modelo/RepositorioPropiedades.cs b/Modelo/RepositorioPropiedades.cs index 3375117..ab6b5d1 100644 --- a/Modelo/RepositorioPropiedades.cs +++ b/Modelo/RepositorioPropiedades.cs @@ -1,15 +1,43 @@ +using System; +using System.Reflection.Metadata.Ecma335; using Entidades; +using Entidades.Dto; using Microsoft.EntityFrameworkCore; using Modelo; public class RepositorioPropiedades: RepositorioBase { - public IQueryable ListarPropiedades(){ - var con = Context; - return con.Propiedades.AsQueryable(); + + public IQueryable ListarPropiedades(){ + FormattableString sqlq = $""" + SELECT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS TipoPropiedad FROM Propiedades p + JOIN EstadoPropiedad ep ON p.idestado = 1 + JOIN TipoPropiedad tp ON p.idtipropiedad = tp.id + """; + + var ret = Context.Database.SqlQuery(sqlq); + return ret; } - public bool AñadirPropiedad(Propiedade prop){ + public Propiedade? ObtenerPropiedadPorId(int Id) { + + FormattableString sqlq = $""" + SELECT * FROM Propiedades p + WHERE p.id = {Id} + LIMIT 1 + """; + + Propiedade? prop = Context.Database.SqlQuery(sqlq).First(); + if (prop == null || prop.Id == 0) { + return null; + } + + return prop; + } + + public bool AñadirPropiedad(Propiedade? prop){ + if (prop == null) return false; + var con = Context; int count = con.Propiedades.Count()+1; @@ -19,4 +47,24 @@ public class RepositorioPropiedades: RepositorioBase con.Propiedades.Add(prop); return Guardar(con); } + + public IQueryable ObtenerPropiedadesPorEmail(string email) { + FormattableString sqlq = $""" + SELECT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion as TipoPropiedad From Propiedades p + JOIN Clientes c ON c.dni = p.dnipropietario + JOIN TipoPropiedad tp ON tp.id = p.idtipropiedad + WHERE c.email = {email} + """; + var ret = Context.Database.SqlQuery(sqlq); + return ret; + } + + public bool BajaPropiedad(int id) { + var con = Context; + Propiedade prop = con.Propiedades.Find(id); + prop.Idestado = 3; + + return Guardar(con); + + } } \ No newline at end of file diff --git a/Modelo/RepositorioPropietario.cs b/Modelo/RepositorioPropietario.cs index 56e8510..5b02fd5 100644 --- a/Modelo/RepositorioPropietario.cs +++ b/Modelo/RepositorioPropietario.cs @@ -1,13 +1,38 @@ +using System; using Entidades; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; using Modelo; public class RepositorioPropietario: RepositorioBase { - public Cliente? ObtenerClientePorEmail(string email){ - var con = Context; + public Cliente? ObtenerPropietarioPorDni(long Dni){ + + if (Dni < 1) return null; - Cliente? cli = con.Clientes.FirstOrDefault(c => c.Email == email); + FormattableString sqlq = $""" + SELECT * FROM Clientes c + JOIN cliente_Grupos cg ON cg.idgrupo = 1 + WHERE c.dni = {Dni} + LIMIT 1 + """; + + Cliente? cli = Context.Database.SqlQuery(sqlq).First(); + if (cli.Dni == 0 || cli == null) return null; return cli; + } + public Cliente? ObtenerPropietarioPorEmail(string email){ + + FormattableString sqlq = $""" + SELECT * FROM Clientes c + JOIN cliente_Grupos cg ON cg.idgrupo = 1 + WHERE c.email = {email} + LIMIT 1 + """; + + Cliente? cli = Context.Database.SqlQuery(sqlq).First(); + if (cli.Dni == 0 || cli == null) return null; + return cli; + } } diff --git a/Modelo/RepositorioUsuarios.cs b/Modelo/RepositorioUsuarios.cs index 1a0a657..9ec7cd3 100644 --- a/Modelo/RepositorioUsuarios.cs +++ b/Modelo/RepositorioUsuarios.cs @@ -1,10 +1,8 @@ -using System.Collections.ObjectModel; using System.Security.Cryptography; using System.Text; using Entidades.Dto; using Entidades; -using System.Reflection.Metadata.Ecma335; - + namespace Modelo; public class RepositorioUsuarios: RepositorioBase { @@ -60,9 +58,10 @@ public class RepositorioUsuarios: RepositorioBase { var con = Context; Cliente? cliOld = con.Clientes.Find(cli.Dni); if (cliOld == null) return false; + if (cli.Dni != cliOld.Dni) return false; cliOld = cli; - + return Guardar(con); }