1. Update first controller:

- Add new method `CaminarContraAdmin` for changing contrasection
- Include HTTP PATCH handler
- Use camelCase for class names
2. Update second controller:
- Update method name from `caminarContraseña` to `caminarContraAdmin`
- Fix message "contraseña" to be more precise ("contraseña correcta")
3. Update modal component:
- Change `handleSubmit` event from `submit` (JS) to `POST` (Svelte)
- Ensure form validation in JavaScript
4. Update page admin/users to use CardLink for links
This commit is contained in:
2025-05-22 15:23:49 -03:00
parent b4a1d5c0c5
commit 6f3d985960
3 changed files with 56 additions and 26 deletions

View File

@@ -41,6 +41,29 @@ public class UsuarioController : ControllerBase
return ret ? Ok(new { message = "Contraseña cambiada con éxito" }) : BadRequest(new { message = "No se pudo cambiar la contraseña" }); return ret ? Ok(new { message = "Contraseña cambiada con éxito" }) : BadRequest(new { message = "No se pudo cambiar la contraseña" });
} }
public class bodyCambiarContraAdmin : bodyCambiarContraseña
{
public long Dni { get; set; }
}
[HttpPatch("/api/admin/contraseña")]
public IActionResult CambiarPassAdmin([FromHeader(Name = "Auth")] string Auth, [FromBody] bodyCambiarContraAdmin body)
{
var ret = RepositorioPermisos.Singleton.CheckPermisos(Auth, 9);
if (!ret) return BadRequest(new { message = "No tienes permisos para cambiar contraseñas de usuario" });
if (body.contraseña.Length < 8 || string.IsNullOrWhiteSpace(body.contraseña)) return BadRequest(new { message = "La contraseña debe tener al menos 8 caracteres y no puede estar vacía" });
if (body.Dni <= 0) return BadRequest(new { message = "El DNI no puede estar vacío" });
Cliente? usu = RepositorioUsuarios.Singleton.ObtenerClientePorDni(body.Dni);
if (usu == null) return BadRequest(new { message = "No existe un usuario con ese DNI" });
ret = RepositorioUsuarios.Singleton.CambiarContraseña(body.contraseña, usu);
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); public record setemail(string EmailRecuperacion);
[HttpPut("/api/usuario/emailrecuperacion")] [HttpPut("/api/usuario/emailrecuperacion")]
public IActionResult CambiarPass([FromHeader(Name = "Auth")] string Auth, [FromBody] setemail setemail) public IActionResult CambiarPass([FromHeader(Name = "Auth")] string Auth, [FromBody] setemail setemail)

View File

@@ -4,6 +4,13 @@
submit, submit,
}: { close: () => void; submit: (e: Event, pass: string) => void } = }: { close: () => void; submit: (e: Event, pass: string) => void } =
$props(); $props();
let password: string = $state("");
function handleSubmit(e: Event) {
e.preventDefault();
submit(e, password);
}
</script> </script>
<div <div
@@ -23,27 +30,26 @@
></button> ></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form onsubmit={submit}> <form onsubmit={handleSubmit}>
<!--
<div class="mb-3"> <div class="mb-3">
<label for="nombre" class="form-label">Nombre</label> <label for="password" class="form-label"
<input type="text" id="nombre" class="form-control" bind:value={cli.nombre} required /> >Contraseña</label
>
<input
type="password"
id="password"
class="form-control"
minlength="8"
required
bind:value={password}
/>
<div class="form-text">
La contraseña debe tener al menos 8 caracteres.
</div>
</div> </div>
<div class="mb-3"> <button type="submit" class="btn btn-primary"
<label for="apellido" class="form-label">Apellido</label> >Guardar</button
<input type="text" id="apellido" class="form-control" bind:value={cli.apellido} required /> >
</div>
<div class="mb-3">
<label for="domicilio" class="form-label">Domicilio</label>
<input type="text" id="domicilio" class="form-control" bind:value={cli.domicilio} required />
</div>
<div class="mb-3">
<label for="celular" class="form-label">Celular</label>
<input type="tel" id="celular" class="form-control" bind:value={cli.celular} required />
</div>
<button type="submit" class="btn btn-primary" onclick={(e)=>handleConfirm(e)}>Guardar</button>
-->
</form> </form>
</div> </div>
</div> </div>

View File

@@ -7,7 +7,7 @@
import BarraHorizontalConTexto from "../Componentes/BarraHorizontalConTexto.svelte"; import BarraHorizontalConTexto from "../Componentes/BarraHorizontalConTexto.svelte";
import { fade, fly } from "svelte/transition"; import { fade, fly } from "svelte/transition";
import ModalModificarPropietarios from "../Componentes/ModalModificarPropietarios.svelte"; import ModalModificarPropietarios from "../Componentes/ModalModificarPropietarios.svelte";
import { CardLink } from "@sveltestrap/sveltestrap"; import { CardLink, Modal } from "@sveltestrap/sveltestrap";
import ModalRestablecerContra from "../Componentes/ModalRestablecerContra.svelte"; import ModalRestablecerContra from "../Componentes/ModalRestablecerContra.svelte";
let Clientes: Cliente[] = $state([]); let Clientes: Cliente[] = $state([]);
@@ -248,20 +248,21 @@
async function handleRestablecerContraseña(e: Event, pass: string) { async function handleRestablecerContraseña(e: Event, pass: string) {
e.preventDefault(); e.preventDefault();
try { try {
const req = await fetch($urlG + "", { const req = await fetch($urlG + "/api/admin/contraseña", {
method: "POST", method: "PATCH",
headers: { headers: {
Auth: token || "", Auth: token || "",
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
body: JSON.stringify({ body: JSON.stringify({
Dni: restablecercontracli?.dni, Dni: restablecercontracli?.dni,
Pass: pass, contraseña: pass,
}), }),
}); });
//WIP const js = await req.json();
if (req.ok) { showmodalrestablecercontra = false;
} restablecercontracli = null;
modaldata = js.message;
} catch { } catch {
modaldata = "Falla la conexion al servidor"; modaldata = "Falla la conexion al servidor";
} }