finalmente adapte todo a svelte y más

Signed-off-by: fede <federico.nicolas.polidoro@gmail.com>
This commit is contained in:
2024-11-03 04:49:54 -03:00
parent 735cdfc344
commit b1952399fa
19 changed files with 300 additions and 87 deletions

View File

@@ -6,12 +6,17 @@ namespace AlquilaFacil.Controllers;
[ApiController] [ApiController]
public class GruposController: ControllerBase { public class GruposController: ControllerBase {
[HttpPost("api/admin/grupos")] [HttpPost("api/admin/grupos")]
public IActionResult CrearPermisos([FromBody] AdminGrupo grupo) { public IActionResult CrearGrupo([FromBody] AdminGrupo grupo) {
if (String.IsNullOrEmpty(grupo.descripcion)) return BadRequest(); if (String.IsNullOrEmpty(grupo.descripcion)) return BadRequest();
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

@@ -4,6 +4,7 @@ using Entidades;
using Entidades.Dto; using Entidades.Dto;
using Modelo; using Modelo;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Security.Cryptography;
namespace AlquilaFacil.Controllers; namespace AlquilaFacil.Controllers;
@@ -30,7 +31,17 @@ public class InquilinoController: ControllerBase
var ret = verificarCrearUsuario(cid); var ret = verificarCrearUsuario(cid);
if (ret != "") return BadRequest(ret); if (ret != "") return BadRequest(ret);
bool ret2 = RepositorioUsuarios.Singleton.AltaCliente(cid); var cli = new Cliente {
Dni = cid.dni,
Nombre = cid.nombre,
Domicilio = cid.domicilio,
Apellido = cid.apellido,
Celular = cid.celular,
Email = cid.email,
Contraseña = Encoding.UTF8.GetBytes(HacerHash(cid.contraseña))
};
bool ret2 = RepositorioUsuarios.Singleton.AltaInquilino(cli);
return (ret2) ? Ok() : BadRequest(ret); return (ret2) ? Ok() : BadRequest(ret);
} }
@@ -48,5 +59,8 @@ public class InquilinoController: ControllerBase
return msg; return msg;
} }
private string HacerHash(string pass){
var buf = SHA256.HashData(Encoding.UTF8.GetBytes(pass));
return BitConverter.ToString(buf).Replace("-","");
}
} }

View File

@@ -1,4 +1,5 @@
#if DEBUG #if DEBUG
using System.Text.Json;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Modelo; using Modelo;
namespace AlquilaFacil.Controllers; namespace AlquilaFacil.Controllers;

View File

@@ -0,0 +1,59 @@
using System.Security.Cryptography;
using System.Text;
using Entidades;
using Entidades.Dto;
using Microsoft.AspNetCore.Mvc;
using Modelo;
namespace AlquilaFacil.Controllers;
[ApiController]
public class PropietarioController: ControllerBase {
[HttpGet("api/propietario")]
public IActionResult ListarPropietarios([FromHeader(Name = "Auth")] string Auth) {
return Ok();
}
[HttpPost("api/propietarios")]
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();
string validacion2 = verificarCrearUsuario(Propietario);
if (validacion2 != "") return BadRequest(validacion2);
var cli = new Cliente {
Dni = Propietario.dni,
Nombre = Propietario.nombre,
Domicilio = Propietario.domicilio,
Apellido = Propietario.apellido,
Celular = Propietario.celular,
Email = Propietario.email,
Contraseña = Encoding.UTF8.GetBytes(HacerHash(Propietario.contraseña))
};
bool ret = RepositorioUsuarios.Singleton.AltaPropietario(cli);
return ret ?
Ok(new {message = "Se añadio el propietario exitosamente"}) : BadRequest();
}
private string verificarCrearUsuario(CrearClienteDto cid) {
string msg = "";
if (cid.email == string.Empty) msg += "Falta ingresar el email\n";
if (cid.contraseña.Length < 8) msg += "Por lo menos 8 caracteres en la contraseña\n";
if (cid.apellido == string.Empty) msg += "Falta Ingresar apellido\n";
if (cid.nombre == string.Empty) msg += "Falta Ingresar nombre\n";
if (cid.dni <= 0) msg += "Falta Ingresar dni o elejiste un numero negativo\n";
if (cid.celular == string.Empty) msg += "Falta Ingresar Numero de Contacto\n";
if (cid.domicilio == string.Empty) msg += "Falta Ingresar Domicilio Legal";
return msg;
}
private string HacerHash(string pass){
var buf = SHA256.HashData(Encoding.UTF8.GetBytes(pass));
return BitConverter.ToString(buf).Replace("-","");
}
}

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Entidades; namespace Entidades;
@@ -9,5 +10,6 @@ public partial class Permiso
public string? Descripcion { get; set; } public string? Descripcion { get; set; }
[JsonIgnore]
public virtual ICollection<Grupo> Idgrupos { get; set; } = new List<Grupo>(); public virtual ICollection<Grupo> Idgrupos { get; set; } = new List<Grupo>();
} }

View File

@@ -3,7 +3,9 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/favicon.png" /> <link rel="icon" type="image/png" href="/favicon.png" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"/> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AlquilaFacil</title> <title>AlquilaFacil</title>
</head> </head>

13
Front/public/home.svg Normal file
View File

@@ -0,0 +1,13 @@
<!--
unicode: "fe2b"
version: "3.0"
-->
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="currentColor"
>
<path d="M12.707 2.293l9 9c.63 .63 .184 1.707 -.707 1.707h-1v6a3 3 0 0 1 -3 3h-1v-7a3 3 0 0 0 -2.824 -2.995l-.176 -.005h-2a3 3 0 0 0 -3 3v7h-1a3 3 0 0 1 -3 -3v-6h-1c-.89 0 -1.337 -1.077 -.707 -1.707l9 -9a1 1 0 0 1 1.414 0m.293 11.707a1 1 0 0 1 1 1v7h-4v-7a1 1 0 0 1 .883 -.993l.117 -.007z" />
</svg>

After

Width:  |  Height:  |  Size: 457 B

View File

@@ -4,7 +4,8 @@
import MenuPage from './Menu/page.svelte'; import MenuPage from './Menu/page.svelte';
import ProteRoute from './lib/RutaProtegida.svelte'; import ProteRoute from './lib/RutaProtegida.svelte';
import InfoPage from './Info/page.svelte'; import InfoPage from './Info/page.svelte';
import InqPage from "./Inquilinos/page.svelte"; import InqPage from "./Inquilino/page.svelte";
import PropPage from "./Propietario/page.svelte";
</script> </script>
<Router> <Router>
@@ -16,11 +17,17 @@
<Route path="/Menu"> <Route path="/Menu">
<ProteRoute component={MenuPage} /> <ProteRoute componente={MenuPage} />
</Route> </Route>
<Route path="/Inquilinos"> <!--Crear Cuenta Inquilino-->
<ProteRoute component={InqPage}/> <Route path="/accion/4">
<ProteRoute componente={InqPage}/>
</Route>
<!--Crear Cuenta Propietario-->
<Route path="/accion/5">
<ProteRoute componente={PropPage}/>
</Route> </Route>
</Router> </Router>

View File

@@ -1,17 +1,13 @@
<script> <script>
import NavBarLogin from "../lib/NavBarLogin.svelte"; import NavBarLogin from "../lib/NavBarLogin.svelte";
import BarraTexto from "../lib/BarraHorizontalConTexto.svelte";
</script> </script>
<NavBarLogin/><br> <NavBarLogin/><br>
<div class="container text-justify"> <div class="container text-justify">
<h4>Preguntas Frecuentes:</h4> <h4>Preguntas Frecuentes:</h4>
<div class="row"> <BarraTexto text="Que es AlquilaFacil" />
<div class="col"><hr></div>
<div class="col-auto"><h5>Que es AlquilaFacil</h5></div>
<div class="col"><hr></div>
</div>
Es un sistema el cual desarrolle para la materia de ingenieria de software / trabajo de diploma. Es un sistema el cual desarrolle para la materia de ingenieria de software / trabajo de diploma.
En la cual se pueden publicar propiedades como un propietario y buscar propiedades para alquilar. En la cual se pueden publicar propiedades como un propietario y buscar propiedades para alquilar.
@@ -19,10 +15,8 @@
los pagos o visualizar los comprobantes de los pagos realizados. los pagos o visualizar los comprobantes de los pagos realizados.
<div class="row"> <BarraTexto text="Necesito una cuenta?" />
<div class="col"><hr></div>
<div class="col-auto"><h5>Necesito una cuenta?</h5></div> Sí es necesario comunicarse con un administrador para que se te creé una cuenta ya sea para inquilino,
<div class="col"><hr></div> propietario o ambas.
</div>
Sí es necesario comunicarse con un administrador para poder acceder.
</div> </div>

View File

@@ -0,0 +1,35 @@
<script lang="ts">
import FormPostInq from "../lib/FormPostCli.svelte";
import NavBarAutocompletable from "../lib/NavBarAutocompletable.svelte";
import TextBar from "../lib/BarraHorizontalConTexto.svelte";
</script>
<NavBarAutocompletable/>
<div class="container">
<div class="row align-items-start">
<div class="col">
<br><br>
<TextBar text="Formulario Alta Inquilino" />
Este es un formulario para crear una cuenta de Propietario.
Los campos con un asterisco (*) requieren ser completados
si o si.
<br><br>
<TextBar text="¿Porque querria crear una cuenta?" />
Crear una cuenta es necesario para poder acceder al menu de
inquilino donde se mostrarán los alquileres pendientes de pago
y donde podrá buscar propiedades para alquilar.
<br><br>
<TextBar text="¿Que pasa si ya tengo una cuenta de propietario?" />
Si tiene una cuenta de propietario rellene los campos igualmente y
se le añadirán las capacidades de buscar propiedades para alquilar
y ver el estado de los alquileres donde usted es inquilino.
</div>
<div class="col">
<br>
<FormPostInq url="http://127.0.0.1:5007/api/inquilino"/>
</div>
</div>
</div>

View File

@@ -1,15 +0,0 @@
<script lang="ts">
import { Col } from "@sveltestrap/sveltestrap";
import FormPostInq from "../lib/FormPostCli.svelte";
import NavBarAutocompletable from "../lib/NavBarAutocompletable.svelte";
</script>
<NavBarAutocompletable/>
<div class="container">
<div class="row align-items-start">
<div class="col">
<FormPostInq url="http://127.0.0.1:5007/api/inquilino"/>
</div>
</div>
</div>

View File

@@ -0,0 +1,34 @@
<script lang="ts">
import FormPostInq from "../lib/FormPostCli.svelte";
import NavBarAutocompletable from "../lib/NavBarAutocompletable.svelte";
import TextBar from "../lib/BarraHorizontalConTexto.svelte";
</script>
<NavBarAutocompletable/>
<div class="container">
<div class="row align-items-start">
<div class="col">
<br><br>
<TextBar text="Formulario Alta Propietario" />
Este es un formulario para crear una cuenta de Inquilino.
Los campos con un asterisco (*) requieren ser completados
si o si.
<br><br>
<TextBar text="¿Porque querria crear una cuenta?" />
Crear una cuenta es necesario para poder acceder al menu de
propietario donde se mostrarán tanto las propiedades sin alquilar
como las alquiladas y cual es la situacion con el inquilino.
<br><br>
<TextBar text="¿Que pasa si ya tengo una cuenta de Inquilino?" />
Si tiene una cuenta de Inquilino rellene los campos igualmente y
se le añadirán las capacidades de publicar propiedades y ver
el estado de los alquileres donde usted es Propietario.
</div>
<div class="col">
<br>
<FormPostInq url="http://127.0.0.1:5007/api/propietario"/>
</div>
</div>
</div>

View File

@@ -0,0 +1,11 @@
<script lang="ts">
let prop = $props();
</script>
<div class="row">
<div class="col"><hr></div>
<div class="col-auto"><h5>{prop.text}</h5></div>
<div class="col"><hr></div>
</div>

View File

@@ -8,15 +8,15 @@
let { url }: Props = $props(); let { url }: Props = $props();
let showAlert: boolean = $state(false); let showAlert: boolean = $state(false);
let errorMessage: string = $state() let errorMessage: string = $state("")
let dni: number = $state() let dni: number = $state(0)
let email: string = $state() let email: string = $state("")
let contraseña: string = $state() let contraseña: string = $state("")
let nombre: string = $state() let nombre: string = $state("")
let apellido: string = $state() let apellido: string = $state("")
let domicilio: string = $state() let domicilio: string = $state("")
let celular: string = $state() let celular: string = $state("")
async function submitForm(event: any) { async function submitForm(event: any) {
event.preventDefault(); event.preventDefault();
@@ -38,34 +38,52 @@
} }
} }
</script> </script>
<div class="card">
<div class="card-body">
<Form on:submit={submitForm}>
<FormGroup floating label="Dni*">
<Input type="number" min='1' bind:value={dni} required />
</FormGroup>
<Form on:submit={submitForm}> <div class="row">
<FormGroup floating label="Dni"> <div class="col">
<Input type="number" min='1' bind:value={dni} required /> <FormGroup floating label="Nombre*">
</FormGroup> <Input type="text" bind:value={nombre} required />
<FormGroup floating label="Email"> </FormGroup>
<Input type="email" placeholder="ejemplo@mail.com" bind:value={email} required /> </div>
</FormGroup> <div class="col">
<FormGroup floating label="Contraseña"> <FormGroup floating label="Apellido*">
<Input type="password" placeholder="*********" bind:value={contraseña} required /> <Input type="text" bind:value={apellido} required />
</FormGroup> </FormGroup>
<FormGroup floating label="Nombre"> </div>
<Input type="text" bind:value={nombre} required /> </div>
</FormGroup>
<FormGroup floating label="Apellido"> <FormGroup floating label="Email*">
<Input type="text" bind:value={apellido} required /> <Input type="email" placeholder="ejemplo@mail.com" bind:value={email} required />
</FormGroup> </FormGroup>
<FormGroup floating label="Domicilio"> <FormGroup floating label="Contraseña*">
<Input type="text" bind:value={domicilio} required /> <Input type="password" placeholder="*********" bind:value={contraseña} required />
</FormGroup> </FormGroup>
<FormGroup floating label="Celular">
<Input type="tel" bind:value={celular} required /> <div class="row">
</FormGroup> <div class="col">
<br> <FormGroup floating label="Domicilio*">
<FormGroup> <Input type="text" bind:value={domicilio} required />
<Button color="primary" type="submit">Ingresar</Button> </FormGroup>
</FormGroup> </div>
</Form> <div class="col">
<FormGroup floating label="Celular*">
<Input type="tel" bind:value={celular} required />
</FormGroup>
</div>
</div>
<FormGroup>
<Button color="primary" type="submit">Crear</Button>
</FormGroup>
</Form>
</div>
</div>
{#if showAlert} {#if showAlert}
<div class='alert alert-warning alert-dismissible fade show' role='alert'> <div class='alert alert-warning alert-dismissible fade show' role='alert'>
<strong>{errorMessage}</strong> <strong>{errorMessage}</strong>

View File

@@ -46,6 +46,11 @@
<NavbarBrand href="/"> <NavbarBrand href="/">
AlquilaFacil AlquilaFacil
</NavbarBrand> </NavbarBrand>
<div class="card">
<a href="/Menu">
<img src="/home.svg" alt="Volver al Menú"/>
</a>
</div>
<NavbarToggler on:click={() => (isOpen = !isOpen)} /> <NavbarToggler on:click={() => (isOpen = !isOpen)} />
<Collapse isOpen={isOpen} navbar expand="md"> <Collapse isOpen={isOpen} navbar expand="md">
<Nav class="ms-auto" navbar> <Nav class="ms-auto" navbar>

View File

@@ -2,8 +2,9 @@
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { navigate } from 'svelte-routing'; import { navigate } from 'svelte-routing';
import { writable } from 'svelte/store'; import { writable } from 'svelte/store';
export let component;
let { componente } = $props();
const isAuthenticated = writable(false); const isAuthenticated = writable(false);
const isVerified = writable(false); const isVerified = writable(false);
@@ -45,7 +46,7 @@
</div> </div>
{:else} {:else}
{#if $isAuthenticated} {#if $isAuthenticated}
<svelte:component this={component} /> {@render componente()}
{:else} {:else}
{navigate('/')} {navigate('/')}
{/if} {/if}

View File

@@ -1,6 +1,7 @@
#if DEBUG #if DEBUG
using Entidades; using Entidades;
using Microsoft.EntityFrameworkCore;
namespace Modelo; namespace Modelo;
public class RepositorioGrupos: RepositorioBase<RepositorioGrupos> { public class RepositorioGrupos: RepositorioBase<RepositorioGrupos> {
@@ -14,12 +15,14 @@ public class RepositorioGrupos: RepositorioBase<RepositorioGrupos> {
Nombre = descripcion, Nombre = descripcion,
}; };
con.Grupos.Add(gru); con.Grupos.Add(gru);
return Guardar(con); return Guardar(con);
} }
public object? Listar()
{
return Context.Grupos.Include(x => x.Idpermisos);
}
} }
#endif #endif

View File

@@ -50,7 +50,7 @@ public class RepositorioPermisos: RepositorioBase<RepositorioPermisos> {
int mx = con.Permisos.Max(x => x.Id); int mx = con.Permisos.Max(x => x.Id);
Permiso per = new Permiso{ Permiso per = new Permiso{
Id = mx, Id = mx+1,
Descripcion = descripcion Descripcion = descripcion
}; };
con.Permisos.Add(per); con.Permisos.Add(per);

View File

@@ -9,17 +9,15 @@ namespace Modelo;
public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios> public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios>
{ {
public bool AltaCliente(CrearClienteDto cid){ public bool AltaInquilino(Cliente cli){
var cli = new Cliente {
Dni = cid.dni,
Nombre = cid.nombre,
Domicilio = cid.domicilio,
Apellido = cid.apellido,
Celular = cid.celular,
Email = cid.email,
Contraseña = Encoding.UTF8.GetBytes(HacerHash(cid.contraseña))
};
var con = Context; var con = Context;
//check por si la cuenta ya existe (puede ser propietario)
Cliente? cli2 = con.Clientes.Find(cli.Dni);
if (cli2 != null) {
cli = cli2;
}
var grupo = con.Grupos.Find(2); var grupo = con.Grupos.Find(2);
if (grupo == null || grupo.Id == 0) return false; if (grupo == null || grupo.Id == 0) return false;
@@ -35,6 +33,31 @@ public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios>
} }
public bool AltaPropietario(Cliente cli)
{
var con = Context;
//check por si la cuenta ya existe (puede ser propietario)
Cliente? cli2 = con.Clientes.Find(cli.Dni);
if (cli2 != null) {
cli = cli2;
}
var grupo = con.Grupos.Find(1);
if (grupo == null || grupo.Id == 0) return false;
con.Clientes.Add(cli);
Guardar(con);
con = Context;
cli = con.Clientes.Find(cli.Dni) ?? new();
if (cli.Dni == 0) return false;
cli.Idgrupos.Add(grupo);
return Guardar(con);
}
public bool CheckUsuario(LoginDto logindto) { public bool CheckUsuario(LoginDto logindto) {
string Contraseña = HacerHash(logindto.Contraseña); string Contraseña = HacerHash(logindto.Contraseña);
@@ -73,4 +96,5 @@ public class RepositorioUsuarios: RepositorioBase<RepositorioUsuarios>
Guardar(con); Guardar(con);
} }
} }