Feature: Quiz
Introdução ao documento
Este documento cobre a feature de quiz por slug: carregamento do quiz, resolução do userId, resposta das questões, feedback e conclusão. Evidências: src/app/(protected-routes)/quiz/page.tsx:21-231, src/components/Quiz/QuizBackend.component.tsx:33-335, src/services/quizApi.ts:130-242.
Versionamento
- Documento criado em
2026-03-20. - Revisar quando mudarem
quiz/page.tsx,QuizBackend,useQuizouservices/quizApi.ts. Evidências:src/app/(protected-routes)/quiz/page.tsx:21-231,src/components/Quiz/QuizBackend.component.tsx:33-335,src/services/quizApi.ts:130-242.
Referencial teórico
O fluxo foi derivado da página client-side do quiz, do componente QuizBackend e do client HTTP da Quiz API. Evidências: src/app/(protected-routes)/quiz/page.tsx:35-105, src/components/Quiz/QuizBackend.component.tsx:50-335, src/services/quizApi.ts:130-242.
Visão geral
- A página resolve
sluga partir desearchParams, do curso da turma ou doclassId. Evidências:src/app/(protected-routes)/quiz/page.tsx:43-76. - O
userIdpode vir explicitamente na query string ou da sessão do usuário. Evidências:src/app/(protected-routes)/quiz/page.tsx:78-82. - Antes de iniciar, a UI busca os metadados do quiz e mostra uma tela introdutória com título, descrição e botão
Começar. Evidências:src/app/(protected-routes)/quiz/page.tsx:84-105,src/app/(protected-routes)/quiz/page.tsx:141-203.
Atores
- Participante ou facilitador respondendo quiz. Evidências:
src/components/Home/HomeAluno.component.tsx:177-185,src/components/Home/HomeFacilitador.component.tsx:142-149. - Quiz API externa. Evidências:
src/services/quizApi.ts:130-242.
Pré-condições
- Sessão carregada ou
userIdexplícito na query string. Evidências:src/app/(protected-routes)/quiz/page.tsx:23-35,src/app/(protected-routes)/quiz/page.tsx:78-82. slugválido para o curso/turma. Evidências:src/app/(protected-routes)/quiz/page.tsx:70-76,src/services/quizApi.ts:130-138.QUIZ_API_URLconfigurada no ambiente exposto por/api/envs. Evidências:src/app/api/envs/route.ts:23-25.
Fluxo principal
- A página resolve
slugeuserId. Evidências:src/app/(protected-routes)/quiz/page.tsx:70-82. - A UI busca
getQuizBySlug(slug)e carrega os metadados do quiz. Evidências:src/app/(protected-routes)/quiz/page.tsx:84-105,src/services/quizApi.ts:130-138. - Ao clicar em
Começar, a página renderizaQuizBackend. Evidências:src/app/(protected-routes)/quiz/page.tsx:193-208. QuizBackendusauseQuize a Quiz API para percorrer questões, salvar respostas e obter feedback. Evidências:src/components/Quiz/QuizBackend.component.tsx:50-60,src/services/quizApi.ts:143-217.
Fluxos alternativos
- Se a busca de quiz falhar, a página mostra um bloco de erro amarelo. Evidências:
src/app/(protected-routes)/quiz/page.tsx:128-139. - Se o usuário já tiver respostas salvas,
QuizBackendentra direto na tela de sucesso após buscar respostas e questões. Evidências:src/components/Quiz/QuizBackend.component.tsx:79-170. - Se o feedback final não puder ser carregado pelo
attemptId, o componente tenta recompor o resultado a partir das respostas já salvas. Evidências:src/components/Quiz/QuizBackend.component.tsx:306-325.
Regras de negócio
- A página prioriza
slugexplícito da query, depoisclassesData[slug], depoisclassIdatual. Evidências:src/app/(protected-routes)/quiz/page.tsx:43-76. - O quiz considera concluído quando já existem respostas para
slug + userId, mesmo antes da navegação manual pela UI. Evidências:src/components/Quiz/QuizBackend.component.tsx:79-170. - Ao salvar uma resposta, a API exige
userIdequestionIdcomo query string. Evidências:src/services/quizApi.ts:161-177. - O carregamento do feedback final usa
/answers/attempt/{attemptId}/final-feedback; quando isso falha, o frontend monta feedback básico comcorrectAnswers,incorrectAnswersescore. Evidências:src/services/quizApi.ts:205-217,src/components/Quiz/QuizBackend.component.tsx:149-169,src/components/Quiz/QuizBackend.component.tsx:239-255.
Estados possíveis
loading: sessão, classes ou quiz ainda carregando. Evidências:src/app/(protected-routes)/quiz/page.tsx:107-125.erro: falha em carregar o quiz. Evidências:src/app/(protected-routes)/quiz/page.tsx:128-139.pre_inicio: metadados carregados equizStarted === false. Evidências:src/app/(protected-routes)/quiz/page.tsx:141-203.em_execucao:QuizBackendrenderizado. Evidências:src/app/(protected-routes)/quiz/page.tsx:205-210.sucesso:QuizBackendmudacurrentStepparasuccess. Evidências:src/components/Quiz/QuizBackend.component.tsx:165-169,src/components/Quiz/QuizBackend.component.tsx:235-258.
Endpoints envolvidos
- Ver OpenAPI: a feature depende da Quiz API externa consumida por
quizApi.ts:/quizzes/slug/{slug},/questions/slug/{slug}/user/{userId}/next,/answers,/answers/slug/{slug}/user/{userId},/answers/attempt/{attemptId}/final-feedback,/questions. - Localmente, o ambiente expõe
QUIZ_API_URLemGET /api/envs. Evidências:src/app/api/envs/route.ts:23-25.
Dados impactados
- Ver model.md: o documento local cobre parcialmente
UsereClass, mas o modelo completo deQuiz,Question,AnswereAttemptvive fora deste repositório. - A feature impacta também estado client-side de progresso e respostas. Evidências:
src/components/Quiz/QuizBackend.component.tsx:37-46.
Pendências
- O schema completo da Quiz API não é versionado neste repositório.
- O hook
useQuizcentraliza parte da lógica de navegação de questões e não foi formalizado em documento próprio.