Pular para o conteúdo principal

Feature: Conteúdo Público Por Slug

Introdução ao documento

Este documento cobre a feature de entrada pública por slug, usada para montar uma experiência de login contextual por curso, marca e tipo de usuário inferido pelo host. Evidências: src/app/(public-routes)/[slug]/page.tsx:7-52.

Versionamento

  • Documento criado em 2026-03-20.
  • Revisar quando mudarem src/app/(public-routes)/[slug]/page.tsx ou getHomeData. Evidências: src/app/(public-routes)/[slug]/page.tsx:7-52.

Referencial teórico

O comportamento foi derivado da página dinâmica pública e do reaproveitamento do componente Login. Evidências: src/app/(public-routes)/[slug]/page.tsx:7-52, src/components/Login/Login.component.tsx:77-237.

Visão geral

  • A página busca pageData com getHomeData(params.slug). Evidências: src/app/(public-routes)/[slug]/page.tsx:33.
  • O host define userType contextual (participante, supervisor ou facilitador). Evidências: src/app/(public-routes)/[slug]/page.tsx:11-30.
  • Se a página do curso estiver em manutenção, a UI rende MaintenancePage; se não houver conteúdo, redireciona para /. Evidências: src/app/(public-routes)/[slug]/page.tsx:35-52.

Atores

  • Visitante público. Evidências: src/app/(public-routes)/[slug]/page.tsx:7-52.
  • Participante, supervisor ou facilitador inferidos pelo domínio. Evidências: src/app/(public-routes)/[slug]/page.tsx:11-30.
  • Serviço de conteúdo do backend, consumido por getHomeData. Evidências: src/app/(public-routes)/[slug]/page.tsx:2, src/app/(public-routes)/[slug]/page.tsx:33.

Pré-condições

  • A rota pública deve receber um slug válido. Evidências: src/app/(public-routes)/[slug]/page.tsx:7, src/app/(public-routes)/[slug]/page.tsx:33.
  • O backend precisa retornar pageData; se retornar vazio, a página não prossegue. Evidências: src/app/(public-routes)/[slug]/page.tsx:35-52.

Fluxo principal

  1. A página lê o cabeçalho host. Evidências: src/app/(public-routes)/[slug]/page.tsx:8-10.
  2. O código infere o tipo de usuário a partir do domínio. Evidências: src/app/(public-routes)/[slug]/page.tsx:11-30.
  3. A página busca os dados de home/login com getHomeData(slug). Evidências: src/app/(public-routes)/[slug]/page.tsx:33.
  4. Em sucesso, renderiza Login com pageData, userType e host. Evidências: src/app/(public-routes)/[slug]/page.tsx:46-48.

Fluxos alternativos

  • Se maintenance_mode_course_hub_active estiver ligado, a página pública entra em manutenção. Evidências: src/app/(public-routes)/[slug]/page.tsx:35-45.
  • Se pageData não vier, o usuário é redirecionado para a raiz /. Evidências: src/app/(public-routes)/[slug]/page.tsx:49-52.
  • Se o host não corresponder a nenhuma convenção, userType fica null. Evidências: src/app/(public-routes)/[slug]/page.tsx:11-30.

Regras de negócio

  • Hosts com hub são tratados como participante. Evidências: src/app/(public-routes)/[slug]/page.tsx:14-16.
  • Hosts com supervisor são tratados como supervisor. Evidências: src/app/(public-routes)/[slug]/page.tsx:18-20.
  • Hosts com facilitador ou dhedalos são tratados como facilitador. Evidências: src/app/(public-routes)/[slug]/page.tsx:22-28.
  • O conteúdo de manutenção usa campos específicos do pageData (title, message, description, banner). Evidências: src/app/(public-routes)/[slug]/page.tsx:36-43.

Estados possíveis

  • carregado: login contextual renderizado. Evidências: src/app/(public-routes)/[slug]/page.tsx:46-48.
  • manutencao: MaintenancePage renderizada. Evidências: src/app/(public-routes)/[slug]/page.tsx:35-45.
  • nao_encontrado: redirect para /. Evidências: src/app/(public-routes)/[slug]/page.tsx:49-52.

Endpoints envolvidos

  • Ver OpenAPI: a feature usa o backend externo acessado por getHomeData, mas esse contrato não é exposto por rota App Router local.
  • O login subsequente reutiliza os endpoints da feature autenticacao-e-acesso.md e o OpenAPI.

Dados impactados

  • Ver model.md: dados de curso, branding, course_id e contexto de turma usados depois no login.
  • O documento local não formaliza o schema de pageData; ele é observado pelo uso de banner, logo, course_id, title e excerpt. Evidências: src/components/Login/Login.component.tsx:25-32, src/components/Login/Login.component.tsx:98.

Pendências

  • O contrato completo de getHomeData(slug) não está tipado no repositório.
  • Não há lista oficial de hosts suportados além das convenções inferidas no código.