Entrar como:FuncionalidadesDoc
Pular para o conteúdo
← Voltar para a visão geral
✅ ConcluídoCard #15 · M3

Plano de Aula & Materiais

Marco M3: Painel do Professor (PROFESSOR)

📅04 de agosto de 2026
👤Wellington Santiago (via ZCode)
🔧Commits: 1ca5d10

📄 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 + drip
  • professor.lessonPlan.{list, upsert} — plano interno por disciplina+data
  • professor.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 + MaterialCard com QR) — schema tem qrCodeUrl mas a geração via qrcode lib 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/upload local para DEV

🚀 6. Deploy DEV

🧠 7. Contexto gerado para próximas etapas

  1. YouTube unlisted EXCLUSIVO — sempre validar regex em qualquer lugar que aceite videoUrl. Reusar o padrão do lesson.create.
  2. unlockAt (drip) já é respeitado pelo Card 4 (Home do aluno) e Card 5 (Materiais) — aula só aparece após a data.
  3. material.uploadedBy rastreia quem subiu. Dashboard da unidade (Card 17) pode listar materiais por professor.
  4. Plano de aula é interno — diferente de aulas/materiais que os alunos consomem. Não expor em procedures student.*.
  5. 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, Notification pattern
← Voltar para a visão geral