FEAT: hecho el arreglo de los botones y empecé con el registro de propiedades

This commit is contained in:
2024-11-24 22:47:38 -03:00
parent d2a7368dee
commit 50bb59e15f
28 changed files with 299 additions and 51 deletions

View File

@@ -1,24 +1,40 @@
using System.ComponentModel.DataAnnotations;
using Entidades.Dto; using Entidades.Dto;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Modelo; using Modelo;
using System.Text.Json;
namespace AlquilaFacil.Controllers; namespace AlquilaFacil.Controllers;
[ApiController] [ApiController]
public class AccionesController: ControllerBase { public class AccionesController: ControllerBase {
//Reutilizo el loginDto pero no lleno el campo de contraseña [HttpGet("api/acciones")]
[HttpPost("api/acciones")] public IActionResult ListarAccionesPorUsuario([FromHeader(Name ="Email")] string Email, [FromHeader(Name = "Auth")] string Auth) {
public IActionResult ListarAccionesPorUsuario([FromBody] LoginDto email, [FromHeader(Name = "Auth")] string Auth) { if (Email == "" || Email == null) return BadRequest();
if (email.Email == "" || email.Email == null) return BadRequest();
if (Auth == "") return Unauthorized(new { esValido = false}); if (Auth == "") return Unauthorized(new { esValido = false});
bool esValido = RepositorioUsuarios.Singleton.CheckToken(email.Email, Auth); bool esValido = RepositorioUsuarios.Singleton.CheckToken(Email, Auth);
if (!esValido) return Unauthorized(); if (!esValido) return Unauthorized();
var Permisos = RepositorioPermisos.Singleton.ListarPermisos(email.Email); var Permisos = RepositorioPermisos.Singleton.ListarPermisos(Email);
Response.Headers["Content-Type"] = "application/json"; Response.Headers["Content-Type"] = "application/json";
return Ok(Permisos); return Ok(Permisos);
} }
[HttpPost("api/acciones/grupo")]
public IActionResult ListarAccionesPorGrupo([FromHeader(Name = "Auth")] string Auth,
[FromBody] AccionesPorGrupoDto req) {
if (string.IsNullOrEmpty(Auth)) return BadRequest();
bool esValido = RepositorioUsuarios.Singleton.CheckToken(req.Email, Auth);
if (esValido == false) return BadRequest(esValido);
bool tieneGrupo = RepositorioUsuarios.Singleton.CheckGrupo(req.Email, req.Grupo);
if (tieneGrupo == false) return Unauthorized();
var permisos = RepositorioGrupos.Singleton.ListarPermisosDeGrupo(req.Grupo);
return Ok(permisos);
}
} }

View File

@@ -16,11 +16,6 @@ public class GruposController: ControllerBase {
bool ret = RepositorioGrupos.Singleton.CrearGrupo(grupo.descripcion); bool ret = RepositorioGrupos.Singleton.CrearGrupo(grupo.descripcion);
return (ret) ? Ok(ret) : BadRequest(); return (ret) ? Ok(ret) : BadRequest();
} }
[HttpGet("api/admin/grupos")]
public IActionResult ListarGrupo(){
return Ok(RepositorioGrupos.Singleton.Listar());
}
} }
public record AdminGrupo(string descripcion); public record AdminGrupo(string descripcion);

View File

@@ -0,0 +1,2 @@
namespace Entidades.Dto;
public record AccionesPorGrupoDto(string Email, string Grupo);

View File

@@ -1,15 +1,25 @@
<script lang="ts"> <script lang="ts">
import Login from "./login/loginPage.svelte"; import Login from "./paginas/login.svelte";
import { Router, Route, link } from 'svelte-routing'; import { Router, Route, link } from 'svelte-routing';
import MenuPage from './Menu/page.svelte'; import MenuPage from './paginas/menu.svelte';
import ProteRoute from './lib/RutaProtegida.svelte'; import ProteRoute from './Componentes/RutaProtegida.svelte';
import InfoPage from './Info/page.svelte'; import InfoPage from './paginas/info.svelte';
import InqPage from "./Inquilino/page.svelte"; import InqPage from "./paginas/inquilino.svelte";
import PropPage from "./Propietario/page.svelte"; import PropPage from "./paginas/propietario.svelte";
import FrontAdmin from "./paginas/grupos/AdminG.svelte";
import FrontEstadistica from "./paginas/grupos/EstadisticaG.svelte";
import FrontInquilino from "./paginas/grupos/InquilinoG.svelte";
import FrontPropietario from "./paginas/grupos/PropietarioG.svelte";
import PublicarPropiedad from "./paginas/PublicarPropiedad.svelte";
</script> </script>
<Router> <Router>
<!-- Plantilla path
<Route path="">
<ProteRoute componente={}/>
</Route>
-->
<Route path="/" component={Login} /> <Route path="/" component={Login} />
<Route path="/Info" component={InfoPage} /> <Route path="/Info" component={InfoPage} />
@@ -18,6 +28,11 @@
<ProteRoute componente={MenuPage} /> <ProteRoute componente={MenuPage} />
</Route> </Route>
<!--Publicar Propiedad-->
<Route path="/accion/1">
<ProteRoute componente={PublicarPropiedad}/>
</Route>
<!--Crear Cuenta Inquilino--> <!--Crear Cuenta Inquilino-->
<Route path="/accion/4"> <Route path="/accion/4">
<ProteRoute componente={InqPage}/> <ProteRoute componente={InqPage}/>
@@ -27,5 +42,19 @@
<Route path="/accion/5"> <Route path="/accion/5">
<ProteRoute componente={PropPage}/> <ProteRoute componente={PropPage}/>
</Route> </Route>
<Route path="/grupo/Inquilino">
<ProteRoute componente={FrontInquilino}/>
</Route>
<Route path="/grupo/Propietario">
<ProteRoute componente={FrontPropietario}/>
</Route>
<Route path="/grupo/Admin">
<ProteRoute componente={FrontAdmin}/>
</Route>
<Route path="/grupo/Estadistica">
<ProteRoute componente={FrontEstadistica}/>
</Route>
</Router> </Router>

View File

@@ -0,0 +1,48 @@
<script lang="ts">
import { onMount } from "svelte";
import { writable } from "svelte/store";
type Permiso = {
id: number;
descripcion: string;
};
let permisos = writable<Permiso[]>([]);
onMount(()=> {
HandlePermisos();
});
const email = localStorage.getItem("email");
const path = location.pathname;
const token = sessionStorage.getItem("token");
async function HandlePermisos() {
const match = path.match(/\/grupo\/(.+)/);
const grupo = match ? match[1] : null;
try {
const response = await fetch("http://localhost:5007/api/acciones/grupo",{
method: 'POST',
headers: {
'Auth' : String(token),
'Content-Type' : "application/json"
},
body: JSON.stringify({email, grupo}),
});
if (response.ok) {
const json = await response.json();
permisos.set(json);
}
} catch (e) {
console.error(e);
}
}
</script>
<div class="list-group">
{#each $permisos as item}
<a href="/accion/{item.id}" class="list-group-item list-group-item-action">
{item.descripcion}
</a>
{/each}
</div>

View File

@@ -23,12 +23,12 @@
async function obtenerPermisos(){ async function obtenerPermisos(){
try { try {
const response = await fetch("http://localhost:5007/api/acciones",{ const response = await fetch("http://localhost:5007/api/acciones",{
method: 'POST', method: 'GET',
headers: { headers: {
'Auth' : String(token), 'Auth' : String(token),
'Email' : String(email),
'Content-Type' : "application/json" 'Content-Type' : "application/json"
}, },
body: JSON.stringify({email})
}); });
if (response.ok){ if (response.ok){
const json = await response.json(); const json = await response.json();
@@ -45,7 +45,10 @@
obtenerPermisos(); obtenerPermisos();
}) })
function redirijir(path: string){
location.replace(path);
}
</script> </script>
<Navbar container="xxl" expand="md" color="dark-subtle"> <Navbar container="xxl" expand="md" color="dark-subtle">
@@ -63,7 +66,7 @@
{#each $permisos as item } {#each $permisos as item }
<div class="dropdown"> <div class="dropdown">
<div class="btn-group" style="margin-left: 3px; margin-top: 3px"> <div class="btn-group" style="margin-left: 3px; margin-top: 3px">
<button class="btn btn-secondary">{item.nombre}</button> <button class="btn btn-secondary" onclick={() => redirijir("/grupo/"+item.nombre)} >{item.nombre}</button>
<button class="btn btn-secondary dropdown-toggle dropdown-toggle-split" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <button class="btn btn-secondary dropdown-toggle dropdown-toggle-split" type="button" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Toggle Dropdown</span> <span class="visually-hidden">Toggle Dropdown</span>
</button> </button>

View File

@@ -1,6 +0,0 @@
<script>
import NavBarAuto from "../lib/NavBarAutocompletable.svelte";
</script>
<NavBarAuto/>
hol

View File

@@ -1,10 +0,0 @@
<script lang="ts">
import Login from "../lib/login.svelte"
import Navbar from "../lib/NavBarLogin.svelte";
</script>
<Navbar/>
<div class="position-relative">
<br>
<Login/>
</div>

View File

@@ -0,0 +1,91 @@
<script lang="ts">
import NavBarAutocompletable from "../Componentes/NavBarAutocompletable.svelte";
type Propiedad = {
ubicacion: string,
canthabitaciones: number,
piso: number,
letra: string,
email: string,
idtipropiedad: number,
}
let propiedad: Propiedad = {
ubicacion: "",
canthabitaciones: 1,
piso: 0,
letra: "",
email: "",
idtipropiedad: 1,
};
const submitForm = () => {
console.log("Formulario enviado:", propiedad);
};
</script>
<NavBarAutocompletable/>
<div class="container mt-4">
<h2>Registrar Propiedad</h2>
<form on:submit|preventDefault={submitForm}>
<div class="form-floating mb-3">
<input
type="text"
id="ubicacion"
class="form-control"
bind:value={propiedad.ubicacion}
placeholder="Ubicación"
required
/>
<label for="ubicacion">Ubicación</label>
</div>
<div class="form-floating mb-3">
<input
type="number"
id="canthabitaciones"
class="form-control"
bind:value={propiedad.canthabitaciones}
min="1"
placeholder="Cantidad de Habitaciones"
required
/>
<label for="canthabitaciones">Cantidad de Habitaciones</label>
</div>
<div class="form-floating mb-3">
<input
type="number"
id="piso"
class="form-control"
bind:value={propiedad.piso}
min="0"
placeholder="Piso"
/>
<label for="piso">Piso</label>
</div>
<div class="form-floating mb-3">
<input
type="text"
id="letra"
class="form-control"
bind:value={propiedad.letra}
maxlength="1"
placeholder="Letra"
/>
<label for="letra">Letra</label>
</div>
<div class="form-floating mb-3">
<select
id="idtipropiedad"
class="form-select"
bind:value={propiedad.idtipropiedad}
required
>
<option value="1">Casa</option>
<option value="2">Departamento</option>
<option value="3">Oficina</option>
</select>
<label for="idtipropiedad">Tipo de Propiedad</label>
</div>
<button type="submit" class="btn btn-primary">Enviar</button>
</form>
</div>

View File

@@ -0,0 +1,14 @@
<script lang="ts">
import ListaAcciones from "../../Componentes/ListaAcciones.svelte";
import NavBarAutocompletable from "../../Componentes/NavBarAutocompletable.svelte";
</script>
<NavBarAutocompletable/>
<div class="container mt-5">
<div class="text-center mb-4">
<h1>Perfil del Administrador</h1>
<p>Gestiona las cuentas de usuarios, propiedades y permisos desde aquí.</p>
</div>
<ListaAcciones/>
</div>

View File

@@ -0,0 +1,5 @@
<script lang="ts">
import NavBarAutocompletable from "../../Componentes/NavBarAutocompletable.svelte";
</script>
<NavBarAutocompletable/>

View File

@@ -0,0 +1,14 @@
<script lang="ts">
import ListaAcciones from "../../Componentes/ListaAcciones.svelte";
import NavBarAutocompletable from "../../Componentes/NavBarAutocompletable.svelte";
</script>
<NavBarAutocompletable/>
<div class="container mt-5">
<div class="text-center mb-4">
<h1>Perfil del Inquilino</h1>
<p>Gestiona tus Pagos y Busca Propiedades desde aquí.</p>
</div>
<ListaAcciones/>
</div>

View File

@@ -0,0 +1,13 @@
<script lang="ts">
import ListaAcciones from "../../Componentes/ListaAcciones.svelte";
import NavBarAutocompletable from "../../Componentes/NavBarAutocompletable.svelte";
</script>
<NavBarAutocompletable/>
<div class="container mt-5">
<div class="text-center mb-4">
<h1>Perfil del Propietario</h1>
<p>Gestiona tus propiedades y servicios desde aquí.</p>
</div>
<ListaAcciones/>
</div>

View File

@@ -1,6 +1,6 @@
<script> <script>
import NavBarLogin from "../lib/NavBarLogin.svelte"; import NavBarLogin from "../Componentes/NavBarLogin.svelte";
import BarraTexto from "../lib/BarraHorizontalConTexto.svelte"; import BarraTexto from "../Componentes/BarraHorizontalConTexto.svelte";
</script> </script>
<NavBarLogin/><br> <NavBarLogin/><br>

View File

@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import FormPostInq from "../lib/FormPostCli.svelte"; import FormPostInq from "../Componentes/FormPostCli.svelte";
import NavBarAutocompletable from "../lib/NavBarAutocompletable.svelte"; import NavBarAutocompletable from "../Componentes/NavBarAutocompletable.svelte";
import TextBar from "../lib/BarraHorizontalConTexto.svelte"; import TextBar from "../Componentes/BarraHorizontalConTexto.svelte";
</script> </script>
<NavBarAutocompletable/> <NavBarAutocompletable/>

View File

@@ -0,0 +1,10 @@
<script lang="ts">
import Login from "../Componentes/login.svelte"
import Navbar from "../Componentes/NavBarLogin.svelte";
</script>
<Navbar/>
<div class="position-relative">
<br>
<Login/>
</div>

View File

@@ -0,0 +1,6 @@
<script>
import NavBarAuto from "../Componentes/NavBarAutocompletable.svelte";
</script>
<NavBarAuto/>
hol

View File

@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import FormPostInq from "../lib/FormPostCli.svelte"; import FormPostInq from "../Componentes/FormPostCli.svelte";
import NavBarAutocompletable from "../lib/NavBarAutocompletable.svelte"; import NavBarAutocompletable from "../Componentes/NavBarAutocompletable.svelte";
import TextBar from "../lib/BarraHorizontalConTexto.svelte"; import TextBar from "../Componentes/BarraHorizontalConTexto.svelte";
</script> </script>
<NavBarAutocompletable/> <NavBarAutocompletable/>

View File

@@ -19,9 +19,9 @@ public class RepositorioGrupos: RepositorioBase<RepositorioGrupos> {
return Guardar(con); return Guardar(con);
} }
public object? Listar() public IQueryable<Permiso> ListarPermisosDeGrupo(string grupo) {
{ var con = Context;
return Context.Grupos.Include(x => x.Idpermisos); return con.Grupos.Where(x=>x.Nombre == grupo).SelectMany(x => x.Idpermisos);
} }
} }

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Reflection.Metadata.Ecma335; using System.Reflection.Metadata.Ecma335;
using System.Runtime.ConstrainedExecution;
using Entidades; using Entidades;
using Entidades.Dto; using Entidades.Dto;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@@ -76,7 +77,8 @@ public class RepositorioPropiedades: RepositorioBase<RepositorioPropiedades>
public bool BajaPropiedad(int id) { public bool BajaPropiedad(int id) {
var con = Context; var con = Context;
Propiedade prop = con.Propiedades.Find(id); Propiedade? prop = con.Propiedades.Find(id);
if (prop == null) return false;
prop.Idestado = 3; prop.Idestado = 3;
return Guardar(con); return Guardar(con);

View File

@@ -2,7 +2,8 @@ using System.Security.Cryptography;
using System.Text; using System.Text;
using Entidades.Dto; using Entidades.Dto;
using Entidades; using Entidades;
using Microsoft.EntityFrameworkCore;
namespace Modelo; namespace Modelo;
public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> { public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> {
@@ -102,5 +103,20 @@ public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> {
Guardar(con); Guardar(con);
} }
public bool CheckGrupo(string email, string grupo) {
var con = Context;
var usu = con.Clientes.Include(x=>x.Idgrupos).FirstOrDefault(x=>x.Email == email);
bool ret = false;
if (usu != null && usu.Idgrupos != null) {
Parallel.ForEach(usu.Idgrupos, (idGrupo, state) => {
if (idGrupo.Nombre == grupo) {
ret = true;
state.Break();
}
});
}
return ret;
}
} }