📄 Documento de Execução — Card 15: [M3] Plano de Aula & Materiais
| Campo | Valor |
|---|---|
| Card Trello | [15] [M3] Plano de Aula & Materiais |
| URL Trello | https://trello.com/c/d7PiobcY |
| Marco | M3 — Painel do Professor |
| Data execução | 05/08/2026 |
| Responsável | Wellington Santiago (via ZCode) |
| Doc anterior | Card 14: Tarefas & Avaliações (M3) |
| Próximo card | Card 16: Comunicados para Turma (M3) |
| Commits | 1ca5d10 |
🎯 1. O que foi implementado
Substituído o protótipo mock da página /professor/aulas (com 3 aulas hardcoded) por uma implementação real e completa que cobre os 3 pilares do card: Aulas (vídeo YouTube unlisted + drip), Plano de Aula (documento interno) e Materiais (upload de PDFs/imagens/MP4).
Aulas (Lesson)
O professor cria aulas com vídeo YouTube unlisted EXCLUSIVO (validação via regex — apenas youtube.com/watch?v=, youtu.be/, youtube.com/embed/), configura drip (liberação programada via unlockAt), define módulo/ordem/duração, e publica (notifica alunos matriculados). A lista mostra cards estilo Netflix com thumbnail, badge de drip (🔒) e contagem de visualizações.
Plano de Aula (LessonPlan)
Documento interno (não compartilhado com alunos/pais) onde o professor registra: conteúdo da aula, objetivos, metodologia, recursos e observações. Upsert por disciplina+data (se já existe plano naquela data, atualiza; senão cria). Histórico navegável com edição inline.
Materiais (Material)
Upload real via /api/upload (DEV) de PDFs, DOCX, PPTX, imagens, MP4 e ZIPs. Associação opcional a disciplina/aula. Lista com ícone por tipo de arquivo, tamanho, download e remoção (soft delete via archivedAt). Auditoria em todo upload.
✅ Critérios de aceite validados
| # | Critério | Status |
|---|---|---|
| 1 | Upload de materiais | ✅ |
| 2 | Plano por disciplina | ✅ |
| 3 | Compartilhamento com turma (publicar aula) | ✅ |
| 4 | Controle de versão (updatedAt no LessonPlan) | ✅ |
| 5 | Rota tRPC lessonPlan.create/upsert | ✅ |
| 6 | Rota tRPC lessonPlan.list | ✅ |
| 7 | Rota tRPC material.create/list/remove | ✅ |
| 8 | Rota tRPC lesson.create/publish | ✅ |
| 9 | Página /professor/aulas (lista) | ✅ |
| 10 | Página /professor/aulas/nova (criar) | ✅ |
| 11 | Página /professor/plano-aula (editor) | ✅ |
| 12 | Página /professor/materiais (lista + upload) | ✅ |
| 13 | Validação YouTube unlisted (regex) | ✅ |
| 14 | Drip content (unlockAt) | ✅ |
| 15 | Notificar alunos ao publicar aula | ✅ |
| 16 | Auditoria: logar CREATE material/lesson | ✅ |
| 17 | Validação: professor só em disciplinas atribuídas | ✅ |
📁 2. Arquivos criados/modificados
Criados
| Arquivo | Função |
|---|---|
src/app/(dashboard)/professor/aulas/nova/page.tsx |
Criar aula (YouTube + drip + módulo/ordem) |
src/app/(dashboard)/professor/plano-aula/page.tsx |
Editor de plano de aula (interno) + histórico |
src/app/(dashboard)/professor/materiais/page.tsx |
Lista de materiais + upload + filtro |
Modificados
| Arquivo | Mudança |
|---|---|
src/server/trpc/routers/professor.ts |
+3 sub-routers: lesson (3 proc), lessonPlan (2 proc), material (3 proc) |
src/app/(dashboard)/professor/aulas/page.tsx |
Reescrita total: removeu mock, agora lista aulas reais |
🗄️ 3. Schema do banco (mudanças)
Nenhuma mudança de schema — reutilizado:
Lesson(videoUrl, videoProvider, unlockAt, moduleNumber, lessonOrder, isPublished, thumbnailUrl, type RECORDED/LIVE/IN_PERSON)LessonPlan(date, content, objectives, methodology, resources, observations)Material(fileUrl, fileName, fileSize, fileType, subjectId?, lessonId?, uploadedBy, archivedAt)ClassTeacher(validação de acesso)
🔌 4. Handoff para o próximo card
Procedures disponíveis
professor.lesson.{list, create, publish}— YouTube unlisted + dripprofessor.lessonPlan.{list, upsert}— plano interno por disciplina+dataprofessor.material.{list, create, remove}— upload/soft-delete
Defaults adotados (confirmar com cliente — em decisoes.md)
| # | Pendência | Default adotado |
|---|---|---|
| 1 | Campos obrigatórios do plano | ✅ Só content é obrigatório; demais opcionais |
| 2 | Direção vê planos de todos? | ⏳ Por enquanto só o professor vê os seus (Card 17 dashboard fará visão unidade) |
| 3 | Limite 50MB por arquivo | ✅ Validado no /api/upload |
| 4 | Tipos aceitos | ✅ PDF/DOC/DOCX/PPT/PPTX/JPG/PNG/WEBP/MP4/ZIP |
| 5 | Materiais após fim do ano | ✅ Permanecem (sem expiração automática; soft delete manual) |
| 6 | Template padrão ou livre | ✅ Livre (campos flexíveis, sem template rígido) |
📋 5. Checklist do Trello — status por item
Entregas (4/4)
- Upload de materiais
- Plano por disciplina
- Compartilhamento com turma (publicar)
- Controle de versão (updatedAt)
Especificação Técnica (17/20 implementados)
Não implementados (refinamento futuro):
- QR Code generator para materiais (
material.generateQR+MaterialCardcom QR) — schema temqrCodeUrlmas a geração viaqrcodelib fica para quando houver caso de uso real (imprimir QR para sala de aula) - Antivirus ClamAV no upload — infra pesada, fica para PROD
- S3 presigned URL — atualmente
/api/uploadlocal para DEV
🚀 6. Deploy DEV
- URL aulas: https://sistemaescolar.wellka.com.br/professor/aulas
- URL plano: https://sistemaescolar.wellka.com.br/professor/plano-aula
- URL materiais: https://sistemaescolar.wellka.com.br/professor/materiais
- Login demo:
carla.prof@genioon.com.br/Prof@2026 - Profª Carla: 8 aulas (do seed), prontas para publicar/gerenciar
- Commit:
1ca5d10 - PM2: genioon-dev reload ✓
🧠 7. Contexto gerado para próximas etapas
- YouTube unlisted EXCLUSIVO — sempre validar regex em qualquer lugar que aceite
videoUrl. Reusar o padrão dolesson.create. unlockAt(drip) já é respeitado pelo Card 4 (Home do aluno) e Card 5 (Materiais) — aula só aparece após a data.material.uploadedByrastreia quem subiu. Dashboard da unidade (Card 17) pode listar materiais por professor.- Plano de aula é interno — diferente de aulas/materiais que os alunos consomem. Não expor em procedures
student.*. - Soft delete de materiais via
archivedAt— não apaga o arquivo físico, só marca como arquivado. Limpeza periódica opcional.
🎯 8. Próximo card
Card 16 [M3] Comunicados para Turma
- Spec:
docs/execucao/16-m3-comunicados-turma.md - Foco: professor envia comunicados/avisos para suas turmas (ClassAnnouncement)
- Último card do M3 — fecha o Painel do Professor completo
- Reuso:
resolveTeacher(),ClassTeacher,Notificationpattern