Calendar sync (Google + Outlook)

Eventos criados em Skillment podem aparecer automaticamente no Google Calendar ou Outlook 365 do learner. OAuth pessoal por conta — aluno autoriza, autoriza, learner revoga quando quiser.

Setup do tenant

Em /admin/integrations/calendars:

  1. Google Calendar: Cloud Console → APIs → Create OAuth 2.0 Client ID. Authorized redirect URI: https://[tenant].skillment.app/api/calendar/google/callback. Cole client ID + secret no admin.
  2. Outlook 365: Azure Portal → App registrations → New. Redirect URI: https://[tenant].skillment.app/api/calendar/outlook/callback. Permission: Calendars.ReadWrite (delegated). Cole client ID + secret.
  3. Habilite o toggle pra cada provider

Setup do learner

Em /perfil/calendar, learner vê 2 botões:

  • “Conectar Google Calendar”
  • “Conectar Outlook”

Click → OAuth consent → callback → Skillment armazena refresh token criptografado. Daí em diante, todo evento que o learner se inscrever cria automaticamente no calendário escolhido.

Segurança do refresh token

Refresh tokens são sensitive credentials — quem tem pode emitir access tokens novos sem reautenticar. Skillment armazena encrypted-at-rest:

  • Algoritmo: AES-256-GCM (authenticated encryption)
  • Key derivation: HKDF (RFC 5869) com salt + info per-tenant
  • Chave mestra: CALENDAR_TOKEN_ENCRYPTION_KEY via Wrangler secret, nunca em código
  • Rotação: chave nova invalida tokens existentes (learner reautoriza); planejamento de versioned encryption no backlog enterprise.

Revogar acesso

Learner pode revogar em /perfil/calendar a qualquer momento. Click revoke → Skillment chama o endpoint de revoke do provider + deleta o refresh token criptografado da DB. Eventos já criados no calendar permanecem (não removemos por padrão).

Limites e edge cases

  • Refresh token expirado: Google revoga após 6 meses inativo. Quando next sync falha, marcamos a integration como inválida e pedimos learner pra reconectar.
  • Rate limit Google: 1M req/dia per project (folgado pra dezenas de milhares de learners).
  • Outlook delegate access: em algumas configs enterprise, o admin precisa pre-aprovar a app. Veja o erro de consent específico no flow.

Endpoint pra apagar evento

Se um evento Skillment é cancelado, o calendar event correspondente também é deletado via sync. Não há orphan events do nosso lado.