Skip to content

fix: [TESIS-159] say a tenant is unknown only when the API answers 404 - #73

Merged
LauAubert merged 2 commits into
masterfrom
TESIS-999028-tenant-gate-only-unknown-on-404
Oct 4, 2026
Merged

LauAubert merged 2 commits into
masterfrom
TESIS-999028-tenant-gate-only-unknown-on-404

Conversation

@LauAubert

@LauAubert LauAubert commented Oct 2, 2026 •

Copy link
Copy Markdown
Member

Ticket de Jira

https://proyectofinalfrlp.atlassian.net/browse/TESIS-159

ID provisorio: se reemplaza por la clave real al cargar la card en Jira. Card: cards/028.md. Sale de una auditoría de código del front (TESIS-89).


Descripción

El gate de arranque (TenantGate) mostraba «No encontramos esta empresa» ante cualquier falla de GET /tenant-config (if (slug === null || isError)). El contrato de tenant (TESIS-121, §3/§5) reserva esa pantalla para el 404, pero también la disparaban un 500 mientras la API se reinicia, un corte de red o una respuesta que no pasa el schema. Y tapaba la app entera aunque hubiera una config válida rehidratada de localStorage, sin forma de reintentar: la query tiene retry: false y staleTime: Infinity.

Repro en master: con la sesión abierta, recargar mientras la API se reinicia (o cerrar sesión: queryClient.clear() vuelve a pedir la config) → «La dirección desde la que entraste no corresponde a ninguna empresa configurada» hasta recargar a mano.

  • Sólo un 404 (o la falta de slug) muestra la pantalla de empresa desconocida.
  • Con config en el store, la app sigue aunque el pedido falle: el branding guardado es del mismo slug y la próxima carga lo vuelve a pedir.
  • Sin config y con otra falla, una pantalla nueva «No pudimos conectarnos» con Reintentar (refetch).
  • useTenantConfig reintenta una vez cualquier falla que no sea 404 (el 404 sigue sin reintento: no cambia el desenlace).
  • Tests: app en pie con config guardada ante un 500, pantalla de reintento sin config, el botón vuelve a pedir; el caso 404 existente sigue igual.

Evidencia visual

Pendiente de captura.


Cómo probar

  1. Con la API apagada y sin config guardada (ventana privada) → «No pudimos conectarnos» + «Reintentar». Prender la API y reintentar → entra.
  2. Con la sesión abierta, apagar la API y recargar → la app se ve con su marca (los datos fallan cada uno con su error), no la pantalla de empresa desconocida.
  3. ?tenant=ninguna → «No encontramos esta empresa», como siempre.

Verificación: npm run test (679 tests, 0 fallas), npm run lint, npm run format:check y npm run build limpios.


Impacto y consideraciones

¿Introduce breaking changes?
No

¿Requiere nuevas variables de entorno?
No

¿Afecta la arquitectura o genera un nuevo patrón?
No. Ajusta el gate a lo que ya decía el contrato de tenant.

🤖 Generated with Claude Code

… 404

The startup gate showed "No encontramos esta empresa" for any failure of
/tenant-config: a 500 while the API restarted, a network cut or a response
that does not validate covered the whole app, even with a valid config
rehydrated from localStorage, and with no way to retry since the query never
retried and never went stale.

Only a 404 now means the slug is not a company. With a config already in the
store the app keeps running; without one, a failure shows a "could not
connect" screen with a retry button. The config query retries once on
anything but a 404.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@TomasMartin2004

Copy link
Copy Markdown
Contributor

Revisado. Lo veo bien para implementar.

TenantGate mostraba «No encontramos esta empresa» ante cualquier falla de GET /tenant-config (if (slug === null || isError)), y encima tapaba la app entera aunque hubiera una config válida rehidratada de localStorage. El contrato de tenant (TESIS-121, §3/§5) reserva esa pantalla para el 404. Con el sistema desplegado en la VPS, un 500 mientras la API reinicia o un corte de red momentáneo son los modos de falla más probables en vivo, y los dos terminaban diciéndole al usuario que su empresa no existe. Es el peor mensaje posible: manda a buscar un problema que no está.

Lo que verifiqué

  • Ahora distingue por status y sólo el 404 dice «no encontramos esta empresa». Confirmé que el cliente HTTP efectivamente expone status en el error (client.test.ts lo afirma con rejects.toMatchObject({ status: 401 })), así que la comprobación es contra algo que existe y no contra la forma que asume el mock.
  • Una falla sin status (red, respuesta que no pasa el schema) cae también en «No pudimos conectarnos», que es lo correcto: no se sabe nada sobre si la empresa existe.
  • Con una config ya rehidratada, la app sigue andando en vez de taparse. Ese es el caso que más vale en una demo: la API parpadea y la pantalla no se cae.
  • «Reintentar» llama a refetch de verdad, con test. Antes el botón existía y no podía cambiar nada.

@LauAubert LauAubert changed the title fix: [TESIS-999028] say a tenant is unknown only when the API answers 404 fix: [TESIS-159] say a tenant is unknown only when the API answers 404 Oct 3, 2026
@LauAubert LauAubert closed this Oct 3, 2026
@LauAubert
LauAubert deleted the TESIS-999028-tenant-gate-only-unknown-on-404 branch October 3, 2026 23:19
@LauAubert
LauAubert restored the TESIS-999028-tenant-gate-only-unknown-on-404 branch October 3, 2026 23:23
@LauAubert LauAubert reopened this Oct 3, 2026
@LauAubert
LauAubert marked this pull request as ready for review October 3, 2026 23:26
@LauAubert
LauAubert requested a review from a team as a code owner October 3, 2026 23:26
@LauAubert
LauAubert requested review from Sanntinat and removed request for a team October 3, 2026 23:26

@TomasMartin2004 TomasMartin2004 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revisión del diff completo. El código es idéntico al que leí cuando los PRs estaban en draft —ningún commit nuevo—, así que lo que sigue es el veredicto formal.

✅ Aprobado

TenantGate mostraba «No encontramos esta empresa» ante cualquier falla de GET /tenant-config, y encima tapaba la app entera aunque hubiera una config válida rehidratada de localStorage. El contrato de tenant (TESIS-121, §3/§5) reserva esa pantalla para el 404.

Con el sistema desplegado en la VPS, un 500 mientras la API reinicia o un corte de red son los modos de falla más probables en vivo, y los dos terminaban diciéndole al usuario que su empresa no existe. Es el peor mensaje posible: manda a buscar un problema que no está.

Lo que verifiqué

  • Ahora distingue por status y sólo el 404 dice «no encontramos esta empresa». Confirmé que el cliente HTTP efectivamente expone status en el error (client.test.ts lo afirma con rejects.toMatchObject({ status: 401 })), así que la comprobación es contra algo que existe y no contra la forma que asume el mock.
  • Una falla sin status —red, respuesta que no pasa el schema— cae también en «No pudimos conectarnos», que es correcto: no se sabe nada sobre si la empresa existe.
  • Con una config ya rehidratada, la app sigue andando en vez de taparse. Ese es el caso que más vale en una demo.
  • «Reintentar» llama a refetch de verdad, con test. Antes el botón existía y no podía cambiar nada.

@LauAubert
LauAubert merged commit 569045b into master Oct 4, 2026
4 checks passed
LauAubert added a commit that referenced this pull request Oct 5, 2026
#73)

The startup gate showed "No encontramos esta empresa" for any failure of
/tenant-config: a 500 while the API restarted, a network cut or a response
that does not validate covered the whole app, even with a valid config
rehydrated from localStorage, and with no way to retry since the query never
retried and never went stale.

Only a 404 now means the slug is not a company. With a config already in the
store the app keeps running; without one, a failure shows a "could not
connect" screen with a retry button. The config query retries once on
anything but a 404.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants