From cb4f81432007d5e8d5eb0820184a9c5930aeaefe Mon Sep 17 00:00:00 2001 From: fede Date: Fri, 3 Jan 2025 21:41:50 -0300 Subject: [PATCH] paginacion arreglada --- Aspnet/Controllers/AdminController.cs | 36 ++++++------- Aspnet/Controllers/BusquedaControler.cs | 4 +- .../BusquedaAdmin/AdminBusquedaContext.cs | 29 ++++++++++ Aspnet/Strategy/BusquedaAdmin/Filtros.cs | 16 +++--- Front/public/bell.svg | 1 + Front/src/paginas/AdminPropiedades.svelte | 53 +++++++------------ Modelo/RepositorioPropiedades.cs | 43 ++++++++++++--- 7 files changed, 112 insertions(+), 70 deletions(-) create mode 100644 Aspnet/Strategy/BusquedaAdmin/AdminBusquedaContext.cs create mode 100644 Front/public/bell.svg diff --git a/Aspnet/Controllers/AdminController.cs b/Aspnet/Controllers/AdminController.cs index 2d00ac2..6255091 100644 --- a/Aspnet/Controllers/AdminController.cs +++ b/Aspnet/Controllers/AdminController.cs @@ -4,6 +4,8 @@ using Entidades.Admin; using Entidades.Dto; using Entidades; using System.Linq.Expressions; +using AlquilaFacil.StrategyBusquedaAdmin; +using System.Diagnostics; namespace AlquilaFacil.Controllers; [ApiController] @@ -129,26 +131,22 @@ public class AdminController: ControllerBase IQueryable? props = null; pag -= 1; - if (servicios == ""){ - //no hay parametros de busqueda - if (cantidadHabitaciones == 0 && tipoPropiedad == 0 ) props = RepositorioPropiedades.Singleton.ListarPropiedadesPorPaginaAdmin(pag); - //Solo Habitaciones - if (cantidadHabitaciones != 0 && tipoPropiedad == 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitacionesPaginado(cantidadHabitaciones, pag); - //Solo TipoPropiedad - if (cantidadHabitaciones == 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipoPaginado(tipoPropiedad, pag); - //Habitaciones y TipoPropiedad - if (cantidadHabitaciones != 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_TipoPaginado(cantidadHabitaciones, tipoPropiedad, pag); - } else { - //Solo se filtra por servicios - if (cantidadHabitaciones == 0 && tipoPropiedad == 0 ) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorServiciosPaginado(servicios, pag); - //Servicios y habitaciones - if (cantidadHabitaciones != 0 && tipoPropiedad == 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios_Paginado(cantidadHabitaciones, servicios, pag); - //Tipo y Servicios - if (cantidadHabitaciones == 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios_Paginado(tipoPropiedad, servicios, pag); - // Todos los parametros - if (cantidadHabitaciones != 0 && tipoPropiedad != 0) props = RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(cantidadHabitaciones, tipoPropiedad, servicios, pag); - } + + var clave = $"{(cantidadHabitaciones != 0 ? "1" : "0")}{(tipoPropiedad != 0 ? "1" : "0")}{(!string.IsNullOrEmpty(servicios) ? "1" : "0")}"; + var gen = AdminBusquedaContext.Singleton; + var estrategia = gen.ObtenerEstrategia(clave); + props = estrategia.Filtrar(servicios, cantidadHabitaciones, tipoPropiedad, pag); return Ok(props); } + + [HttpGet("api/admin/busqueda/cantPag")] + public IActionResult CantidadPaginas([FromHeader(Name = "Auth")]string Auth, int cantidadHabitaciones = 0, int tipoPropiedad = 0, [FromQuery]string servicios = "") { + if (String.IsNullOrEmpty(Auth)) return Unauthorized(); + var validacion1 = RepositorioPermisos.Singleton.CheckPermisos(Auth, 10); + if (validacion1 == false) return Unauthorized(); + + int ret = RepositorioPropiedades.Singleton.CuantasPaginasBusqueda(cantidadHabitaciones, servicios, tipoPropiedad); + return Ok(new { message = ret}); + } } \ No newline at end of file diff --git a/Aspnet/Controllers/BusquedaControler.cs b/Aspnet/Controllers/BusquedaControler.cs index efd224c..2a3eb20 100644 --- a/Aspnet/Controllers/BusquedaControler.cs +++ b/Aspnet/Controllers/BusquedaControler.cs @@ -18,8 +18,8 @@ public class BusquedaController: ControllerBase { var clave = $"{(cantidadHabitaciones != 0 ? "1" : "0")}{(tipoPropiedad != 0 ? "1" : "0")}{(!string.IsNullOrEmpty(servicios) ? "1" : "0")}"; - var context = BusquedaContext.Singleton; - var estrategia = context.ObtenerEstrategia(clave); + var gen = BusquedaContext.Singleton; + var estrategia = gen.ObtenerEstrategia(clave); props = estrategia.Filtrar(servicios, cantidadHabitaciones, tipoPropiedad); return Ok(props); diff --git a/Aspnet/Strategy/BusquedaAdmin/AdminBusquedaContext.cs b/Aspnet/Strategy/BusquedaAdmin/AdminBusquedaContext.cs new file mode 100644 index 0000000..801557b --- /dev/null +++ b/Aspnet/Strategy/BusquedaAdmin/AdminBusquedaContext.cs @@ -0,0 +1,29 @@ +namespace AlquilaFacil.StrategyBusquedaAdmin; + +public class AdminBusquedaContext +{ + private static readonly AdminBusquedaContext singleton = new(); + public static AdminBusquedaContext Singleton {get { return singleton; } } + + private readonly Dictionary _estrategias; + + public AdminBusquedaContext() + { + _estrategias = new Dictionary + { + { "000", new BusquedaSinParametros() }, + { "100", new BusquedaPorHabitaciones() }, + { "010", new BusquedaPorTipo() }, + { "001", new BusquedaPorServicios() }, + { "110", new BusquedaPorHabitacionesTipo() }, + { "101", new BusquedaPorHabitacionesServicios() }, + { "011", new BusquedaTipoServicios() }, + { "111", new BusquedaFull() } + }; + } + + public IAdminBusquedaStrategy ObtenerEstrategia(string clave) + { + return _estrategias.ContainsKey(clave) ? _estrategias[clave] : new BusquedaSinParametros(); + } +} \ No newline at end of file diff --git a/Aspnet/Strategy/BusquedaAdmin/Filtros.cs b/Aspnet/Strategy/BusquedaAdmin/Filtros.cs index e47106d..8506bd9 100644 --- a/Aspnet/Strategy/BusquedaAdmin/Filtros.cs +++ b/Aspnet/Strategy/BusquedaAdmin/Filtros.cs @@ -5,48 +5,48 @@ namespace AlquilaFacil.StrategyBusquedaAdmin; public class BusquedaSinParametros : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ListarPropiedades(); + return RepositorioPropiedades.Singleton.ListarPropiedadesPorPaginaAdmin(pag); } } public class BusquedaPorHabitaciones : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones(cantidadHabitaciones); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitacionesPaginado(cantidadHabitaciones, pag); } } public class BusquedaPorTipo : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo(tipoPropiedad); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipoPaginado(tipoPropiedad, pag); } } public class BusquedaPorServicios : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorServicios(servicios); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorServiciosPaginado(servicios, pag); } } public class BusquedaPorHabitacionesTipo : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo(cantidadHabitaciones, tipoPropiedad); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_TipoPaginado(cantidadHabitaciones, tipoPropiedad, pag); } } public class BusquedaPorHabitacionesServicios : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios(cantidadHabitaciones, servicios); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Servicios_Paginado(cantidadHabitaciones, servicios, pag); } } public class BusquedaTipoServicios : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios(tipoPropiedad, servicios); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorTipo_Servicios_Paginado(tipoPropiedad, servicios, pag); } } public class BusquedaFull : IAdminBusquedaStrategy { public IQueryable Filtrar(string servicios, int cantidadHabitaciones, int tipoPropiedad, int pag) { - return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios(cantidadHabitaciones, tipoPropiedad, servicios); + return RepositorioPropiedades.Singleton.ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(cantidadHabitaciones, tipoPropiedad, servicios, pag); } } \ No newline at end of file diff --git a/Front/public/bell.svg b/Front/public/bell.svg new file mode 100644 index 0000000..8a1f51e --- /dev/null +++ b/Front/public/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Front/src/paginas/AdminPropiedades.svelte b/Front/src/paginas/AdminPropiedades.svelte index fa9527c..d2b00a2 100644 --- a/Front/src/paginas/AdminPropiedades.svelte +++ b/Front/src/paginas/AdminPropiedades.svelte @@ -40,15 +40,25 @@ async function cargaPropiedades() { try{ - const response = await fetch($urlG+"/api/admin/busqueda/paginada?cantidadHabitaciones="+p.cantidadhabitaciones+"&tipoPropiedad="+p.tipopropiedad+"&servicios="+p.servicios+"&pag="+p.pag, { - method: "GET", - headers: { - "Auth": String(token) - } - }); - if (response.ok) { - let data = await response.json(); + const [response, response2] = await Promise.all([ + fetch($urlG+"/api/admin/busqueda/paginada?cantidadHabitaciones="+p.cantidadhabitaciones+"&tipoPropiedad="+p.tipopropiedad+"&servicios="+p.servicios+"&pag="+p.pag, { + method: "GET", + headers: { + "Auth": String(token) + } + }), + fetch($urlG+"/api/admin/busqueda/cantPag?cantidadHabitaciones="+p.cantidadhabitaciones+"&tipoPropiedad="+p.tipopropiedad+"&servicios="+p.servicios, { + method: "GET", + headers: { + "Auth": String(token) + } + }) + ]); + + if (response.ok && response2.ok) { + const [data, data2] = await Promise.all([response.json(),response2.json()]); Propiedades = data; + cantpag = data2.message; return; } modaldata = "Fallo la request"; @@ -56,31 +66,6 @@ modaldata = "Fallo al intentar obtener la lista de propiedades"; } } - async function obtenerCant(){ - - try{ - const response = await fetch($urlG+"/api/propiedad/cantPagina?estado="+0, { - method: "GET", - headers: { - "Auth": String(token) - } - }); - if (response.ok) { - let data = await response.json(); - cantpag = data.message; - return; - } - if (response.status === 400) { - let data = await response.json(); - modaldata=data.message; - return; - } - modaldata="Fallo al recibir la peticion de la cantidad de paginas de propiedades"; - } catch { - modaldata="Fallo al intentar hacer la peticion de cuantas paginas hay"; - } - } - function queryPag(a:number){ p.pag = a; @@ -107,7 +92,7 @@ modaldata = a} />
{/each} - +
diff --git a/Modelo/RepositorioPropiedades.cs b/Modelo/RepositorioPropiedades.cs index 8e05c02..e3a16c1 100644 --- a/Modelo/RepositorioPropiedades.cs +++ b/Modelo/RepositorioPropiedades.cs @@ -391,7 +391,7 @@ public class RepositorioPropiedades: RepositorioBase { } - public IQueryable? ObtenerPropiedesPorHabitacionesPaginado(int cantidadHabitaciones, int pag) { + public IQueryable ObtenerPropiedesPorHabitacionesPaginado(int cantidadHabitaciones, int pag) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado @@ -409,7 +409,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorTipoPaginado(int tipoPropiedad, int pag) { + public IQueryable ObtenerPropiedesPorTipoPaginado(int tipoPropiedad, int pag) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado @@ -427,7 +427,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorHabitaciones_TipoPaginado(int cantidadHabitaciones, int tipoPropiedad, int pag) { + public IQueryable ObtenerPropiedesPorHabitaciones_TipoPaginado(int cantidadHabitaciones, int tipoPropiedad, int pag) { FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, GROUP_CONCAT(DISTINCT s.descripcion SEPARATOR ', ') AS Servicios, p.monto as Monto, ep.descripcion AS Estado @@ -445,7 +445,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorServiciosPaginado(string servicios, int pag) { + public IQueryable ObtenerPropiedesPorServiciosPaginado(string servicios, int pag) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" @@ -471,7 +471,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorHabitaciones_Servicios_Paginado(int cantidadHabitaciones, string servicios, int pag) { + public IQueryable ObtenerPropiedesPorHabitaciones_Servicios_Paginado(int cantidadHabitaciones, string servicios, int pag) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, @@ -497,7 +497,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorTipo_Servicios_Paginado(int tipoPropiedad, string servicios, int pag) { + public IQueryable ObtenerPropiedesPorTipo_Servicios_Paginado(int tipoPropiedad, string servicios, int pag) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, @@ -523,7 +523,7 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } - public IQueryable? ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(int habitaciones, int tipo, string servicios, int pag) { + public IQueryable ObtenerPropiedesPorHabitaciones_Tipo_Servicios_Paginado(int habitaciones, int tipo, string servicios, int pag) { string serviciosEscapados = string.Join(",", servicios.Split(',').Select(s => s.Trim())); FormattableString sqlq = $""" SELECT DISTINCT p.id, p.ubicacion, p.canthabitaciones, p.piso, p.letra, tp.descripcion AS Tipo, @@ -564,4 +564,33 @@ public class RepositorioPropiedades: RepositorioBase { return ret; } + + public int CuantasPaginasBusqueda(int habitaciones, string servicios, int tipoPropiedad) { + int registrosPorPagina = 10; + + var query = Context.Propiedades + .Include(p => p.IdestadoNavigation) + .Include(p => p.IdtipropiedadNavigation) + .Include(p => p.IdServicios) + .AsQueryable(); + + if (habitaciones > 0) { + query = query.Where(p => p.Canthabitaciones == habitaciones); + } + + if (tipoPropiedad > 0) { + query = query.Where(p => p.Idtipropiedad == tipoPropiedad); + } + + if (!string.IsNullOrWhiteSpace(servicios)) { + var listaServicios = servicios.Split(',').Select(s => s.Trim()).ToList(); + query = query.Where(p => + p.IdServicios.Any(sp => + listaServicios.Contains(sp.Descripcion))); + } + + int totalRegistros = query.Distinct().Count(); + + return (int)Math.Ceiling((double)totalRegistros / registrosPorPagina); + } } \ No newline at end of file