Feature: Atividades Estratégicas
Introdução ao documento
Este documento descreve o fluxo de envio de atividades estratégicas e de recuperação: listagem de atividades, upload de arquivos, uso de templates e registro de submissão. Evidências: src/app/(protected-routes)/atividades-estrategicas/page.tsx:15-37, src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:81-223, src/components/EnvioDeAtividades/components/Upload.component.tsx:136-232.
Versionamento
- Documento criado em
2026-03-20. - Revisar quando mudarem a página
/atividades-estrategicas,StrategicActivitiesSlider,Upload.component.tsxou/api/submissionse/api/activity-template. Evidências:src/app/(protected-routes)/atividades-estrategicas/page.tsx:15-37,src/app/api/submissions/route.ts:4-91,src/app/api/activity-template/route.ts:3-200.
Referencial teórico
O fluxo foi derivado da página protegida de atividades, do slider de submissões, do upload de arquivos e do hook de templates. Evidências: src/app/(protected-routes)/atividades-estrategicas/page.tsx:24-36, src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:81-223, src/hooks/useActivityTemplates.ts:25-134.
Visão geral
- A página aceita query params para recuperação (
recoveryIndex,recoveryName,recoveryMode). Evidências:src/app/(protected-routes)/atividades-estrategicas/page.tsx:7-36. - O slider carrega submissões da turma e preenche posições vazias para atividades ainda não enviadas. Evidências:
src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:86-145. - O upload monta
FormDatacom dados do participante, curso, turma, ciclo, facilitador, arquivos estatus=submitted. Evidências:src/components/EnvioDeAtividades/components/Upload.component.tsx:149-182.
Atores
- Participante enviando atividades. Evidências:
src/app/(protected-routes)/atividades-estrategicas/page.tsx:18-36,src/components/EnvioDeAtividades/components/Upload.component.tsx:146-182. - Facilitador que recebe e avalia submissões. Evidências:
src/components/EnvioDeAtividades/components/Upload.component.tsx:166-176. - Serviço externo de submissões e storage de arquivos. Evidências:
src/app/api/submissions/route.ts:12-31,src/app/api/submissions/files/[...path]/route.ts:17-60.
Pré-condições
- Sessão válida e
classId/classesDatano contexto. Evidências:src/app/(protected-routes)/atividades-estrategicas/page.tsx:18-22,src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:71-79. courseId,cycleIdeclassIdválidos para buscar templates. Evidências:src/hooks/useActivityTemplates.ts:34-45,src/hooks/useActivityTemplates.ts:60-72.- Arquivos selecionados com MIME type permitido. Evidências:
src/components/EnvioDeAtividades/components/Upload.component.tsx:206-221.
Fluxo principal
- A página calcula o modo normal ou de recuperação a partir da query string. Evidências:
src/app/(protected-routes)/atividades-estrategicas/page.tsx:24-36. - O slider busca submissões com filtros
participant_id,course_ideclass_id. Evidências:src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:85-93. - A UI monta a sequência de atividades enviadas e vazias, ou reduz para uma única atividade em recuperação. Evidências:
src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:96-145. - O upload valida tipos de arquivo, monta
FormDatae chamacreateSubmission. Evidências:src/components/EnvioDeAtividades/components/Upload.component.tsx:136-203,src/components/EnvioDeAtividades/components/Upload.component.tsx:206-231. - Em sucesso, o fluxo registra log
Enviou ATIVIDADE ESTRATEGICA Xe atualiza o contexto de submissões. Evidências:src/components/EnvioDeAtividades/components/Upload.component.tsx:184-193,src/components/EnvioDeAtividades/components/Upload.component.tsx:121-128.
Fluxos alternativos
- Em modo de recuperação, a tela mostra apenas a atividade alvo e cria um placeholder
sent: falsequando ainda não existe submissão. Evidências:src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:96-115. - Se a busca de submissões falhar, a UI abre
NotifyModal. Evidências:src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:147-149,src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:216-223. - Se o arquivo tiver tipo inválido, o upload marca erro imediatamente. Evidências:
src/components/EnvioDeAtividades/components/Upload.component.tsx:211-221.
Regras de negócio
- O índice de recuperação recebido na URL é convertido para zero-based antes de alimentar o slider. Evidências:
src/app/(protected-routes)/atividades-estrategicas/page.tsx:24-26. - No modo normal, a quantidade final de slides é o máximo entre
strategic_activities_numbere o maioractivity_idjá submetido. Evidências:src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:117-145. - Apenas tipos de arquivo presentes em
allowedSubmitionTypessão aceitos. Evidências:src/components/EnvioDeAtividades/components/Upload.component.tsx:20,src/components/EnvioDeAtividades/components/Upload.component.tsx:211-221. - O upload sempre envia
status=submitted. Evidências:src/components/EnvioDeAtividades/components/Upload.component.tsx:177. - A API de templates exige
class_id,course_idecycle_idparaGET, e tambémactivity_idparaDELETE. Evidências:src/app/api/activity-template/route.ts:78-89,src/app/api/activity-template/route.ts:147-159.
Estados possíveis
nao_enviada: placeholdersent: false. Evidências:src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:108-113,src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:138-141.enviada: submissão existente transformada para o slider. Evidências:src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:93-105.erro_upload: erro mostrado porNotifyModal. Evidências:src/components/EnvioDeAtividades/components/Upload.component.tsx:193-200.modo_recuperacao: renderização de uma única atividade. Evidências:src/app/(protected-routes)/atividades-estrategicas/page.tsx:27-35,src/components/StrategicActivitiesSlider/StrategicActivitiesSlider.component.tsx:96-115.
Endpoints envolvidos
- Ver OpenAPI:
GET /api/submissions,POST /api/submissions,GET /api/submissions/api-token,GET /api/submissions/files/{path},GET /api/activity-template,POST /api/activity-template,DELETE /api/activity-template,POST /api/logs.
Evidências: src/app/services/bff/SubmissionService.ts:17-99, src/app/api/submissions/route.ts:4-91, src/app/api/submissions/files/[...path]/route.ts:3-68, src/hooks/useActivityTemplates.ts:34-118, src/app/api/logs/route.ts:20-40.
Dados impactados
- Ver model.md:
Submission,ActivityTemplate,Class,Course,Cyclee log de ação. - O fluxo também gera blobs temporários com
URL.createObjectURLno navegador. Evidências:src/components/EnvioDeAtividades/components/Upload.component.tsx:223-229.
Pendências
- O schema completo do retorno de templates não está formalizado além do tipo local
ActivityTemplate. - O código comenta uma regra de bloqueio por atividade anterior, mas ela está desativada. Evidências:
src/components/EnvioDeAtividades/components/Upload.component.tsx:136-140.