Skip to content

Revisión técnica: autorización del panel, validación y datos de arranque - #2

Merged
briend17 merged 5 commits into
mainfrom
mejoras/revision-tecnica
Aug 10, 2026
Merged

Revisión técnica: autorización del panel, validación y datos de arranque#2
briend17 merged 5 commits into
mainfrom
mejoras/revision-tecnica

Conversation

@briend17

Copy link
Copy Markdown
Owner

Revisión del proyecto antes de compartirlo.

Cualquier usuario autenticado administraba a todos

Las rutas estaban tras auth + verified, pero eso solo comprueba que hay
sesión. Cualquier usuario podía listar, editar o borrar a cualquier otro. Añado
UserPolicy aplicada con authorizeResource, que además impide que un
administrador se borre a sí mismo y deje el panel sin acceso.

Solo entra lo validado

User::create($request->all()) dejaba pasar cualquier campo del formulario a
Eloquent, incluido password en texto plano. Ahora se usa validated().

Las reglas tampoco comprobaban lo que parecía: celular usaba min:10|max:10,
que sobre un valor numérico valida el VALOR y no la longitud, así que "999"
pasaba. Ahora es digits:10.

El administrador no existía

profile no estaba en $fillable, así que UserSeeder lo descartaba en
silencio: el usuario se creaba con perfil Cliente y User::getUserAdmin() no
encontraba a nadie, con lo que el correo de resumen fallaba al leer una propiedad
sobre null.

Datos de arranque deterministas

PaisSeeder consultaba api.first.org en tiempo de seeding y con la verificación
TLS desactivada: migrate --seed fallaba sin conexión o en CI, y los pais_id
fijos del seeder de usuarios dependían del orden de esa respuesta. Ahora la lista
es local y las relaciones se resuelven por nombre.

Además

  • El mismo catch (Exception $e) que no captura nada dentro de un namespace: la
    transacción nunca se revertía y el usuario recibía una redirección de éxito
    aunque la operación hubiera fallado.
  • Los listeners de correo implementan ShouldQueue: el alta ya no espera al
    servidor SMTP ni se cae con él.
  • El resumen por país usaba with y luego un COUNT por fila desde la vista
    (N+1) sobre una consulta que ya había cargado todos los usuarios en memoria.
    Ahora es una sola agregación con withCount.
  • Faltaba la migración de password_resets: el enlace de recuperar contraseña
    fallaba.
  • phpunit.xml tenía comentada la configuración de SQLite, así que la suite
    exigía un MySQL levantado.
  • El listado pagina, y se elimina una ruta show que apuntaba a un método
    inexistente.
  • Entorno con Docker Compose y workflow de CI sobre PHP 8.0 y 8.1.

Verificación

php artisan test23 pruebas, 38 aserciones, en verde, sobre SQLite en
memoria y sin conexión a internet.

Las rutas estaban tras auth+verified, pero cualquier usuario autenticado podia
listar, editar o borrar a cualquier otro.

- UserPolicy aplicada con authorizeResource; un administrador no puede borrarse
  a si mismo y dejar el panel sin acceso.
- store()/update() usan validated() en vez de $request->all(), que dejaba pasar
  cualquier campo del formulario a Eloquent, incluido password en texto plano.
- celular se valida con digits:10: 'max:10|min:10' sobre un valor numerico
  comprueba el VALOR, no la longitud.
- El listado pagina de 15 en 15 en lugar de traer la tabla entera.
- catch (Exception $e) dentro de un namespace resuelve a App\...\Exception y
  no capturaba nada: la transaccion nunca se revertia y el usuario recibia una
  redireccion de exito aunque la operacion hubiese fallado.
- Se elimina la ruta show, que apuntaba a un metodo inexistente.
- Los listeners implementan ShouldQueue: el alta de usuarios ya no espera al
  servidor SMTP ni se cae con el.
- El resumen cargaba en memoria todos los usuarios de todos los paises y la
  vista lanzaba ademas un COUNT por fila (N+1). Ahora es una sola agregacion.
- Si no existe administrador se registra un aviso en vez de reventar al leer
  una propiedad sobre null.
…word_resets

- 'profile' faltaba en $fillable, asi que UserSeeder lo descartaba en silencio:
  el administrador quedaba con perfil Cliente y getUserAdmin() no encontraba a
  nadie.
- PaisSeeder consultaba api.first.org con la verificacion TLS desactivada, de
  modo que migrate --seed fallaba sin conexion o en CI, y los pais_id fijos de
  UserSeeder dependian del orden de esa respuesta.
- Faltaba la migracion de password_resets: el enlace de recuperar clave fallaba.
- pais_id y categoria_id pasan a ser nullable, con lo que el registro publico de
  Breeze vuelve a funcionar.
- phpunit.xml tenia comentada la configuracion de SQLite y la suite exigia un
  MySQL levantado.
23 pruebas, 38 aserciones, en verde.
Workflow con matriz PHP 8.0/8.1 sobre SQLite en memoria; docker compose con
MySQL 8 y Mailhog. El README explica ahora que problema resuelve el proyecto y
por que esta construido asi.
@briend17
briend17 merged commit bcd0441 into main Aug 10, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant