Feature: Submissão de Atividades
Introdução ao documento
Documenta o fluxo de submissão de atividades entregáveis pelo participante (aluno) via aplicativo mobile.
Versionamento
- Versão do documento: 1.0.0
- Última atualização: 2026-03-04
- Responsável: Time Dhedalos
Referencial teórico
Visão geral
O participante (aluno) submete uma atividade entregável junto com arquivos anexos. O sistema persiste a submissão, armazena os arquivos no S3/local e envia notificações ao próprio participante e ao facilitador responsável.
Atores
- Participante (aluno) — author da submissão, autenticado via JWT
- Facilitador (professor) — destinatário da notificação de nova submissão
- Sistema (Novu) — envia notificações
Pré-condições
- O app mobile possui uma API Key válida — Evidência:
app/Http/Middleware/ApiKeyMiddleware.php:15 - O participante obteve JWT via
GET /api/submissions/token— Evidência:app/Http/Controllers/Api/SubmissionController.php:755 - O workflow Novu
send-submissionesubmission-receivedexistem na tabelanovu_keys— Evidência:app/Services/NotificationService.php:23
Fluxo principal
- App mobile envia
GET /api/submissions/tokencom API Key → recebe JWT (validade 1h)- Evidência:
routes/api.php:15,app/Http/Controllers/Api/SubmissionController.php:755
- Evidência:
- App mobile envia
POST /api/submissionscom JWT + dados + arquivos multipart- Evidência:
routes/api.php:34,app/Http/Controllers/Api/SubmissionController.php:187
- Evidência:
- Controller valida campos obrigatórios via
DeliverableSubmissionRequest- Evidência:
app/Http/Requests/DeliverableSubmissionRequest.php
- Evidência:
- Sistema verifica unicidade
(participant_id, class_id, activity_id, cycle_id)- Evidência:
database/migrations/2025_07_28_132021_add_unique_submission_constraint_to_deliverable_submissions.php:16
- Evidência:
SubmissionFileService::replaceFiles()faz upload dos arquivos para S3/local- Evidência:
app/Services/SubmissionFileService.php:14
- Evidência:
- Submissão é criada com status
submitted- Evidência:
app/Models/DeliverableSubmission.php:15
- Evidência:
NotificationService::sendNotification()envia notificaçãosend-submissionao participante- Evidência:
app/Services/NotificationService.php:23
- Evidência:
NotificationService::sendNotification()envia notificaçãosubmission-receivedao facilitador- Evidência:
app/Services/NotificationService.php:23
- Evidência:
- Retorna JSON da submissão criada (HTTP 201)
Fluxos alternativos
- Submissão duplicada: Se já existe submissão ativa para
(participant_id, class_id, activity_id, cycle_id), retorna HTTP 422 (unique constraint violation). - MIME type inválido: Se arquivo não está na lista de tipos permitidos, retorna HTTP 422.
- Evidência:
app/Helpers/MimeTypes.php:7
- Evidência:
- JWT expirado: Retorna HTTP 401. Participante deve obter novo token.
- Evidência:
app/Http/Middleware/JwtAuthenticate.php:13
- Evidência:
- Falha Novu: Submissão é criada mesmo que notificação falhe (fire-and-forget). Erro é registrado em logs.
- Evidência:
app/Services/NotificationService.php:23
- Evidência:
Regras de negócio
- Unicidade: Uma submissão por participante/atividade/turma/ciclo (soft delete considerado).
- Evidência:
database/migrations/2025_07_28_132021_add_unique_submission_constraint_to_deliverable_submissions.php:16
- Evidência:
- Status inicial: Submissões criadas via JWT recebem status
submitted.- Evidência:
app/Http/Controllers/Api/SubmissionController.php:187
- Evidência:
- MIME types: Apenas tipos listados em
MimeTypes::allowed()são aceitos (imagens, vídeos, áudios, documentos Office/PDF).- Evidência:
app/Helpers/MimeTypes.php:7
- Evidência:
- Notificação dupla: Duas notificações são enviadas: uma para participante (
send-submission) e outra para facilitador (submission-received).- Evidência:
app/Http/Controllers/Api/SubmissionController.php:187
- Evidência:
Estados possíveis
| Estado | Descrição |
|---|---|
pending | Aguardando submissão (criada externamente) |
submitted | Submetida pelo participante via JWT |
submitted_external | Submetida externamente via API Key |
evaluated | Avaliada pelo facilitador |
- Evidência:
database/migrations/2025_06_10_000000_update_status_enum_in_deliverable_submissions_table.php:12
Endpoints envolvidos
GET /api/submissions/token— obter JWT (openapi.yaml)POST /api/submissions— criar submissão (openapi.yaml)- Evidência:
routes/api.php:15,34
Dados impactados
deliverable_submissions— novo registro criado (model.md)submission_files— novos registros de arquivos (model.md)- Storage S3/local — arquivos físicos na pasta
submissions/
Pendências
- ⚠️ PENDÊNCIA: Validar tamanho máximo de arquivo permitido (não encontrada configuração explícita no código).
- ⚠️ PENDÊNCIA: Documentar comportamento de retry em caso de falha de upload S3.