feat: [TESIS-29] add internal admin panel for API service templates - #34
Open
TomasMartin2004 wants to merge 7 commits into
Open
feat: [TESIS-29] add internal admin panel for API service templates#34TomasMartin2004 wants to merge 7 commits into
TomasMartin2004 wants to merge 7 commits into
Conversation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…dation Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Avo 4 is the definitive backoffice: precompiled assets (no Node), Rails 8 native, one resource file per future admin table. JSON mapper validation moved into the Service model so it holds for every write path. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The browser basic-auth popup is replaced by a real session login at /admin/sign_in backed by a new admin_users table (Devise scope independent from the API JWT). Avo shows the signed-in admin and a sign-out action. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The API-only app had no asset pipeline, so Avo rendered unstyled raw HTML. Propshaft serves the engine's precompiled CSS/JS with zero build step. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ticket de Jira
https://proyectofinalfrlp.atlassian.net/browse/TESIS-29
Descripción
Backoffice interno en
/adminpara administrar las plantillas globales de APIs (tablaservices) sin tocar SQL a mano, implementado con Avo 4 como panel definitivo del proyecto.Decisión de librería (evaluadas las 4 alternativas):
sassc, gema C sin mantenimiento desde 2020 — riesgo alto de no compilar en Ruby 4.0.2 + Rails 8 API-only. Descartada.codepara editar JSON (el "componente visual de editor JSON" que pide la card), desarrollo activo, Community tier gratis cubre todo el alcance. Cada tabla administrable futura = un archivo de resource (~15 líneas) — sin retrabajo.Implementación:
/admincon login propio en/admin/sign_in(página HTML con sesión — sin popup de HTTP Basic), respaldado por el nuevo modeloAdminUser(tablaadmin_users, scope Devise independiente del JWT de la API, tal como sugiere la card). LosUserde las PyMEs no acceden. Logout desde el menú de Avo. Admin inicial por seeds:admin@backoffice.com/admin123.Service: index con columnas clave (id,service_name,type,uri) — los 4 mappers quedan ocultos del listado y se editan en show/forms como camposcode(JSON pretty-printed).Service: los writers de los mappers aceptan String (formulario) además de Hash; JSON inválido o que no sea un objeto ⇒ registro inválido, error visible, no se persiste nada y se conserva el valor anterior. Al vivir en el modelo, la garantía aplica a cualquier vía de escritura futura (no solo al panel).application.rb(Cookies,Session::CookieStore,Flash,MethodOverride). La API JWT sigue stateless (navigational_formats = [:html]solo habilita el redirect al login del scope admin; la API sigue devolviendo 401 JSON).services— el resource deUserque scaffoldeó el instalador fue eliminado (la card prohíbe exponer datos de clientes).Evidencia visual
Cómo probar
bundle install && bundle exec rails db:migrate && bundle exec rails db:seedbundle exec rails servery abrirhttp://localhost:3000/admin→ redirige a la página de login/admin/sign_in.admin@backoffice.com/admin123→ entra al panel.{"customer_zip_code": "destino.codigoPostal"}→ Save → detalle con los JSON persistidos.{esto no es jsonen un mapper → Save → error "no es un JSON válido", nada se persiste.bundle exec rspec spec/requests/admin/ spec/models/service_spec.rb spec/models/admin_user_spec.rb— cubre el flujo de login (redirect sin sesión, credenciales inválidas, acceso OK), listado, alta con JSON válido, rechazo de JSON inválido/escalar, edición y la coerción de mappers a nivel modelo.Impacto y consideraciones
¿Introduce breaking changes?
No. La API REST no cambia; los middlewares agregados no afectan requests JWT.
¿Requiere nuevas variables de entorno?
No. Los administradores viven en la tabla
admin_users(alta vía seeds o consola).¿Afecta la arquitectura o genera un nuevo patrón?
Sí — Avo queda como el backoffice definitivo: recursos administrables futuros se agregan creando
app/avo/resources/<entidad>.rb+ su controller enapp/controllers/avo/. Nuevo scope de autenticaciónadmin_user(Devise, sesión) separado del scopeuser(JWT).