Pular para o conteúdo principal

Feature: Sala de Reunião

Introdução ao documento

Este documento cobre a experiência de reunião coletiva e de grupo baseada em Jitsi, incluindo resolução de credenciais, presença automática e fluxo de recuperação associado. Evidências: src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:13-45, src/app/(protected-routes)/grupo/[slug]/page.tsx:15-44, src/components/MeetingRoom/MeetingRoom.component.tsx:90-289.

Versionamento

  • Documento criado em 2026-03-20.
  • Revisar quando mudarem as páginas /sala-de-reuniao/*, /grupo/[slug], MeetingRoom, MeetRoom ou /api/presence/auto. Evidências: src/app/(protected-routes)/sala-de-reuniao/page.tsx:7-15, src/app/(protected-routes)/grupo/[slug]/page.tsx:15-44, src/components/MeetingRoom/MeetingRoom.component.tsx:206-229, src/app/api/presence/auto/route.ts:6-38.

Referencial teórico

O comportamento foi derivado das páginas de sala, do wrapper MeetRoom, do componente MeetingRoom e das rotas de presença. Evidências: src/components/MeetRoom/MeetRoom.component.tsx:20-139, src/components/MeetingRoom/MeetingRoom.component.tsx:131-289, src/app/services/bff/ClassService.ts:73-99.

Visão geral

  • A rota /sala-de-reuniao/{classId} resolve credenciais da sala coletiva da turma. Evidências: src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:23-42.
  • A rota /grupo/{slug} resolve credenciais de sala de grupo com base em turma, usuário e identificador do grupo. Evidências: src/app/(protected-routes)/grupo/[slug]/page.tsx:21-42.
  • O componente MeetingRoom monta a chamada Jitsi, lida com drawer lateral e dispara presença automática para aluno em sala coletiva. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:185-229, src/components/MeetingRoom/MeetingRoom.component.tsx:286-292.

Atores

  • Participante em sala coletiva. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:223-229.
  • Facilitador/supervisor moderando a sala. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:185-193, src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:38-42.
  • Serviços Jitsi e backend de turma/presença. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:131-183, src/app/api/jitsi/config/route.ts:3-18, src/app/api/presence/auto/route.ts:6-38.

Pré-condições

  • Sessão válida. Evidências: src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:18-21, src/app/(protected-routes)/grupo/[slug]/page.tsx:16-19.
  • Credenciais válidas de sala (updRoomName, updRootToken). Evidências: src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:31-42, src/components/MeetingRoom/MeetingRoom.component.tsx:231-240.
  • classId presente no contexto para o wrapper /sala-de-reuniao sem slug. Evidências: src/components/MeetRoom/MeetRoom.component.tsx:73-108.

Fluxo principal

  1. A página autenticada resolve credenciais da sala a partir da turma ou do grupo. Evidências: src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:23-42, src/app/(protected-routes)/grupo/[slug]/page.tsx:21-42.
  2. MeetingRoom escolhe a URL do servidor Jitsi com prioridade para credencial direta, depois /api/jitsi/config, depois meet.jit.si. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:131-159, src/app/api/jitsi/config/route.ts:3-18.
  3. Para Jitsi on-premises, o nome da sala é limpo para remover app_id antes da barra. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:161-183.
  4. Em sala coletiva e para não-admin, a UI agenda presença automática após 10 minutos. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:206-229.
  5. A chamada Jitsi é montada com jwt, domain, roomName e subject. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:286-297.

Fluxos alternativos

  • O wrapper /sala-de-reuniao sem slug só redireciona para a rota específica da turma. Evidências: src/components/MeetRoom/MeetRoom.component.tsx:96-108.
  • Se faltar credencial, a UI mostra NotifyModal e orienta o usuário a tentar novamente. Evidências: src/components/MeetRoom/MeetRoom.component.tsx:118-127, src/components/MeetingRoom/MeetingRoom.component.tsx:231-240.
  • Enquanto a configuração Jitsi está carregando, a UI exibe placeholder textual. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:242-259.

Regras de negócio

  • A presença automática só roda para usuário não-admin em roomType === 'ClassRoom'. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:223-229.
  • Se setAutoPresenceByClassId responder 403, o componente reprograma a presença automática. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:212-219.
  • Drawers laterais de atividade só aparecem quando a turma tem enable_strategic_activities. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:185-191.
  • A sala faz fallback para meet.jit.si quando nem credencial nem /api/jitsi/config informam servidor. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:135-146.

Estados possíveis

  • loading_config: configuração Jitsi ainda carregando. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:242-259.
  • sem_credencial: modal de erro. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:231-240.
  • presenca_programada: presença automática iniciada. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:206-229.
  • em_reuniao: componente JitsiMeeting renderizado. Evidências: src/components/MeetingRoom/MeetingRoom.component.tsx:286-292.

Endpoints envolvidos

  • Ver OpenAPI: GET /api/room/{id}, GET /api/jitsi/config, POST /api/presence/auto, POST /api/presence/recovery.
  • O fluxo /grupo/[slug] usa serviço externo de turma para credenciais, sem rota local dedicada nomeada group.

Evidências: src/app/(protected-routes)/sala-de-reuniao/[slug]/page.tsx:23-42, src/app/(protected-routes)/grupo/[slug]/page.tsx:24-29, src/app/api/jitsi/config/route.ts:3-18, src/app/api/presence/auto/route.ts:6-38, src/app/api/presence/recovery/route.ts:6-39.

Dados impactados

  • Ver model.md: Class, MeetingRecover, presença de recuperação e estado da reunião.
  • O wrapper MeetRoom também lê credenciais de cookie/sessionStorage (updRoomCredentials, updRoom1on1Credentials). Evidências: src/components/MeetRoom/MeetRoom.component.tsx:20-49.

Pendências

  • O contrato completo das credenciais retornadas por getGroupRoom não está formalizado além do uso local.
  • Não há documentação de gravação/retomada de reuniões no repositório.