feat(treinamento-interno): aba de cursos internos com sync Drive, comentários e likes#139
Merged
Warleypablo merged 20 commits intomainfrom Apr 29, 2026
Merged
feat(treinamento-interno): aba de cursos internos com sync Drive, comentários e likes#139Warleypablo merged 20 commits intomainfrom
Warleypablo merged 20 commits intomainfrom
Conversation
… interno Spec completo da nova aba "Treinamento Interno" na página Conhecimentos. Sync automático com pasta TREINAMENTOS no Drive (subpastas viram trilhas), player embed, comentários e likes, marcação manual de conclusão. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Plano com 12 tasks numeradas, cada uma com TDD passo-a-passo, código completo e comandos verificáveis. Cobre schema/migration, sync com Drive, endpoints REST (leitura, toggle, comentários, sync), cron de 1h, frontend (themes, player, comentários, cards, aba, página do vídeo) e checklist operacional final com smoke E2E. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Worktrees locais nunca devem ser commitadas; previne git add . acidental. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Schema cortex_core ganha tabelas para sync com Drive (tracks, videos), progresso (completions), likes e comentários. Migration aplicada local (prod fica para etapa operacional). Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…keys Insert<Name> types via $inferInsert (alinha com convenção do projeto, evita fricção em Tasks 2-5 que farão upserts). Renomeia uniqueUserVideo → uniqueCompletionUserVideo / uniqueLikeUserVideo para desambiguar entre completions e likes. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Sync lê pasta raiz TREINAMENTOS, percorre subpastas (trilhas) e seus vídeos, faz upsert nas tabelas. Reconciliação por soft-delete preserva comentários/likes. Lock em memória previne sync paralelo. Erros por trilha não interrompem outras trilhas. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…s transientes - Paginação no listing de subpastas (evita perder trilhas em folders >1000) - erroredFolderIds não deixa reconciliação desativar trilhas que falharam - try/catch em torno de cada etapa de reconciliação (DB blip não invalida sync) - Defensive mimeType check no per-video loop Endereça issues important do code review da Task 2. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
GET /trilhas com agregação de progresso do usuário, GET /videos por trilha (lazy load), GET /videos/:id com comentários e flags isOwner/userConcluiu/userCurtiu. Soft-deleted retorna 404. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Substitui error.message por strings genéricas em handlers de leitura para evitar leak de detalhes internos (Postgres errors, constraint names, fragments de SQL) no payload de 500. Logs ainda capturam o error completo para debug. Endereça issue important do code review da Task 3. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
POST /videos/:id/concluir e POST /videos/:id/like com semântica de toggle (cria registro na primeira chamada, deleta na segunda). Endpoint de like também retorna o totalLikes atualizado. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…LICT DO NOTHING) Insere com ON CONFLICT DO NOTHING nos toggles de concluir/like. Sem isso, dois cliques rápidos do mesmo usuário podiam disparar 2 INSERTs concorrentes — o segundo violaria a unique constraint (video_id, user_email) e devolveria 500 ao usuário, mesmo o primeiro tendo sucedido. Agora o segundo INSERT é silently no-op. Endereça issue important do code review da Task 4. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
POST /videos/:id/comentarios cria comentário (validação inline para conteúdo vazio ou >5000 chars). DELETE /comentarios/:id valida que userEmail bate com o dono — 403 para outros, 404 se não existe. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
POST /api/treinamentos-internos/sync dispara sync sob demanda. Cron em server/index.ts roda a cada 1 hora (primeira execução 60s após boot). Status do último sync exposto em globalThis.__internalTrainingsSyncStatus. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
trackThemes.ts mapeia cor/ícone das 9 trilhas com fallback default. VideoPlayer wrappa iframe Drive embed e expõe link "Abrir no Drive" como fallback se permissão do iframe falhar. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
ComentarioItem renderiza um comentário com avatar (inicial), tempo relativo em pt-BR, linkifica URLs, e expõe botão de excluir só para o dono (com AlertDialog). ComentariosThread tem form com Enter para enviar (Shift+Enter quebra linha), contador de caracteres e lista. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
VideoCard mostra thumbnail, duração formatada (mm:ss) e badge ✓ se concluído. Click navega para a página do vídeo. TrilhaCard é expansível com progresso visual, lazy-load dos vídeos ao expandir e suporte a filtro de busca recebido via prop. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
TreinamentoInternoTab combina busca, botão de sync manual e listagem de trilhas. Conhecimentos.tsx agora tem 3 abas (Cursos, Benefícios, Treinamento Interno) com ícones na TabsList. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…ários Rota /conhecimentos/treinamentos/:videoId. Mostra breadcrumb da trilha, player embed, botões de Concluído (toggle) e Like (toggle com contador) e thread de comentários abaixo. 404 vira tela amigável de "vídeo não disponível". Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…utations
Mutations (concluir, like, criar/excluir comentário) usavam chave
['videos', videoId] que só invalidava a query do detalhe. As listas
por trilha (chave ['videos', { trackId }]) ficavam stale, e o ✓ no
VideoCard saía de sincronia com o contador da trilha.
Agora invalidam o prefixo ['videos'], cobrindo detalhe e listas.
Endereça issue important do code review do frontend.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
A pasta TREINAMENTOS vive num Shared Drive (Drive de Equipe). Sem supportsAllDrives + includeItemsFromAllDrives nas queries do Drive, a API retorna "File not found" / lista vazia mesmo com a service account autorizada. Sync validado E2E: 9 trilhas, 22 vídeos puxados sem erros. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Nova aba Treinamento Interno na página
/conhecimentos. Sincroniza automaticamente vídeos da pastaTREINAMENTOSno Google Drive, com player embed, marcação manual de conclusão por usuário, likes e comentários.cortex_core:internal_video_tracks,internal_videos,internal_video_completions,internal_video_likes,internal_video_comments. Soft-delete preserva engajamento se vídeo for retirado do Drive./api/treinamentos-internos/*com 8 endpoints (3 GET, 4 POST toggle/comment/sync, 1 DELETE comment com 403/404).Conhecimentos.tsx, página dedicada/conhecimentos/treinamentos/:videoIdcom player iframe + thread de comentários + ações.Validação
Smoke test E2E feito local: 9 trilhas, 22 vídeos puxados do Drive (Performance: 14, Social media: 8). Player embed funciona, conclusão/like/comentários e DELETE com autorização verificados.
Test plan
cortex_core.internal_video_*)report-job-sa@auto-report-turbo.iam.gserviceaccount.comcom acesso à pasta TREINAMENTOSINTERNAL_TRAININGS_DRIVE_FOLDER_IDconfigurada no.envlocalINTERNAL_TRAININGS_DRIVE_FOLDER_ID=126AbwLea-me3aeQRKxl3Y9pIYnztY438no env de produçãoDocs
docs/superpowers/specs/2026-04-29-treinamento-interno-design.mddocs/superpowers/plans/2026-04-29-treinamento-interno.md