Feature: Course Details
Introdução ao documento
Este documento descreve a feature de detalhe do curso, exposta na rota /{slug} e responsável por apresentar contexto, disponibilidade e CTA de inscrição.
Evidências:
../../app/[slug]/page.tsx#L16-L47../../src/features/components/CourseDetails/CourseDetails.component.tsx#L5-L8../../src/features/components/CourseDetails/components/CourseDetailsLayout/CourseDetailsLayout.component.tsx#L11-L66
Versionamento
Atualizar este documento quando mudarem:
- os campos de customização do curso;
- a regra de disponibilidade e CTA;
- o desvio para manutenção ou
notFound.
Evidências:
../../app/[slug]/page.tsx#L23-L45../../src/features/api/getCourseDetails/getCourseDetails.ts#L3-L19../../src/features/api/external/wp/getCourseStatus/getCourseStatus.ts#L5-L35
Referencial teórico
O mapeamento desta feature foi derivado da rota server-side /{slug}, do componente visual de detalhe e dos adapters de customização/status.
Evidências:
../../app/[slug]/page.tsx#L16-L47../../src/features/components/CourseDetails/components/CourseDetailsLayout/CourseDetailsLayout.component.tsx#L22-L63../../src/features/api/getCourseDetails/getCourseDetails.ts#L3-L19
Visão geral
- A rota recebe
slug, busca status e customização do curso e decide entrenotFound, manutenção ou renderização do detalhe (page.tsx#L20-L45). - A UI exibe título, descrição sanitizada, contagem de inscritos e CTA para
/{slug}/inscricao(CourseDetailsLayout.component.tsx#L37-L63).
Atores
- Participante visitante (CourseDetailsLayout.component.tsx#L58-L63).
- App Next.js server-side (page.tsx#L16-L45).
- Backend WordPress de customização/status (getCourseDetails.ts#L3-L19, getCourseStatus.ts#L17-L30).
Pré-condições
- A rota precisa receber um
slugválido (page.tsx#L20-L25). getCourseDetails(slug)precisa retornar pelo menoslogo; sem isso a página cai emnotFound(page.tsx#L25-L29).- A disponibilidade do CTA depende de
status.available(page.tsx#L23-L24, CourseDetailsLayout.component.tsx#L58-L63).
Fluxo principal
- A rota lê
slugesearchParams(page.tsx#L16-L21). - Busca
statusecourseDetails(page.tsx#L23-L25). - Renderiza
CourseDetailscomstatuseameiFallback(page.tsx#L43-L46). - O layout sanitiza a descrição, mostra metadados e monta o CTA de inscrição (CourseDetailsLayout.component.tsx#L22-L27, CourseDetailsLayout.component.tsx#L37-L63).
Fluxos alternativos
- Sem
logo, a feature retornanotFound(page.tsx#L27-L29). - Se
maintenance_mode_course_register_activeestiver ativo na customização, a feature renderiza a tela de manutenção (page.tsx#L31-L40). - Se
available = false, o CTA mostraInscrições encerradase fica desabilitado (CourseDetailsLayout.component.tsx#L58-L63). - Se
ameiFallback = true, o CTA adiciona?fallback=1na navegação para inscrição (CourseDetailsLayout.component.tsx#L35-L36).
Regras de negócio
- A descrição do curso só é renderizada após hidratação e passa por sanitização com
DOMPurify(CourseDetailsLayout.component.tsx#L19-L27, CourseDetailsLayout.component.tsx#L43-L45). - O texto de inscritos varia entre
Nenhuma inscrição,InscritoeInscritosconforme a quantidade (CourseDetailsLayout.component.tsx#L29-L33). - O bloco visual de inscritos só aparece quando
subscribersé truthy; com0, o texto calculado não é renderizado porque o bloco inteiro não entra em tela (CourseDetailsLayout.component.tsx#L29-L33, CourseDetailsLayout.component.tsx#L47-L57). - O fallback para login sem AMEI só é propagado quando
TOGGLE_INSCRIPTION_FALLBACK = trueefallbackvier comotrueou1(inscriptionFallback.ts#L1-L5, page.tsx#L43-L46).
Estados possíveis
- Curso encontrado / curso não encontrado (page.tsx#L27-L29).
- Curso em manutenção / curso navegável (page.tsx#L31-L40).
- Inscrições disponíveis / encerradas (getCourseStatus.ts#L27-L30, CourseDetailsLayout.component.tsx#L58-L63).
- Descrição hidratada / não hidratada (CourseDetailsLayout.component.tsx#L19-L27).
Endpoints envolvidos
- Fluxo principal server-side: adapters externos ao OpenAPI local
getCourseDetailsegetCourseStatus(getCourseDetails.ts#L3-L19, getCourseStatus.ts#L17-L30). - Endpoint interno correlato exposto pelo repositório:
OpenAPIpath/v1/cursos/{slug}(pages/api/v1/cursos/[slug].ts#L5-L29).
Dados impactados
- A feature consome
CourseCustomizationeCourseCycleStatuscomo fontes lógicas de customização e disponibilidade (getCourseDetails.ts#L7-L19, getCourseStatus.ts#L27-L30).
Pendências
- Confirmar se a ausência de bloco de inscritos para
subscribers = 0é decisão intencional ou efeito colateral da checagem truthy. - Confirmar se o endpoint interno
/v1/cursos/{slug}deveria substituir o adapter direto em algum fluxo futuro.
Evidências: