ADR-401: Licensing — License & Download
Status: Accepted
Contexto
Público-alvo primário (empresas de software no WordPress) precisa de gestão de licenças: chaves por domínio, ativação/desativação, max ativações, renovação automática, distribuição de downloads. Atualmente, WOO_SL (WC Software License) gerencia chaves mas não tem visibilidade no portal, renovação depende de memória do admin, e cliente não vê suas licenças em lugar único.
Decisão
License (Adapter WOO_SL)
License é domínio CORE que abstrai gestão de chaves via LicenseAdapter. Se WOO_SL ativo, adapter lê chaves do WOO_SL. Se ausente, usa gestão built-in simplificada.
| Aspecto | Detalhe |
|---|---|
| Vinculação | License pertence a Entitlement (classe PLG) |
| Chave | Gerada automaticamente (ou via WOO_SL) |
| Ativação | Por domínio registrado (ex: moodle.cliente.com) |
| Max ativações | Configurável por produto (ex: 5 sites) |
| Status | active / expired / revoked |
| Portal | Cliente vê: chave, domínios ativados, max, expiração |
| Auto-provisioning | PLG Entitlement → License criada automaticamente |
Download (Distribuição Digital)
Download é domínio OPTIONAL vinculado a PLG Entitlements. Distribuição de produtos digitais (plugins, assets) para clientes com licença ativa.
| Aspecto | Detalhe |
|---|---|
| Vinculação | Download habilitado via Entitlement PLG (ou ORD) |
| Fonte | WC downloadable products via DownloadAdapter |
| Acesso | Apenas com Entitlement ativo (license válida) |
| Portal | Link de download visível, versão atual |
Auto-Renovação via WC Subscriptions
Se WC Subscriptions ativo, licenças renovam automaticamente via assinatura. Hook woocommerce_subscription_status_updated atualiza Entitlement. Se ausente, renovação é manual (quote de renovação).
Lembretes Automáticos
Lembretes escalonados antes da expiração: 30 dias, 15 dias, 7 dias (configurável via NotificationPolicy). Se auto-renovação ativa, lembretes são informativos. Se manual, incluem link de renovação.
Fluxo Self-Serve
Cliente compra plugin → Pagamento → PLG Entitlement criado
→ License key gerada → Download habilitado
→ Cliente ativa licença no domínio (API)
→ Portal mostra: chave, ativações, expiração
→ 30/15/7 dias antes: lembrete de renovação
→ Auto-renovação (WC Sub) ou manual (quote/portal)Distribuição via CDN (NextJS + Cloudflare)
Downloads de plugins são autorizados na edge para performance e disponibilidade global:
1. Cliente solicita download no portal NextJS
2. Portal gera request para Cloudflare Worker com token de licença
3. Worker valida: licença ativa, produto corresponde, domínio autorizado, limite não excedido
4. Se válido, Worker gera signed URL do R2 com expiração curta (5 min)
5. Cliente recebe redirect para download direto do R2Catálogo de plugins (metadados: nome, slug, versão, changelog, compatibilidade) reside no ecossistema NextJS/Cloudflare (D1 + R2). Permite atualizações de catálogo independentes do WordPress.
Detalhes de LicenseService API, endpoints REST, tipos de licença e DownloadsService em REF-401-01.
Consequências
Positivas:
- Self-serve completo para público-alvo primário (empresas de software)
- WOO_SL adapter preserva compatibilidade com plugin existente
- Lembretes automáticos previnem renovações perdidas
- Portal dá visibilidade que cliente não tem hoje
- Downloads via CDN/edge oferecem performance superior e disponibilidade global
- Validação de licença na edge elimina carga no WordPress para operações de alta frequência
- Bundles permitem precificação e empacotamento flexível
Negativas:
- Dependência de WOO_SL para gestão avançada (built-in é simplificada)
- WC Subscriptions necessário para auto-renovação (sem ele, manual)
- Ativação por domínio requer validação (DNS, domínio fake)
- Arquitetura distribuída (WP emite, NextJS/CF entrega) aumenta complexidade operacional
- Sincronização de estado de licença entre WordPress e D1/Workers requer mecanismo confiável
Referências
- REF-401-01 — License Activation & Renewal
- ADR-202 — Entitlement (PLG provisiona License)
- ADR-103 — Plugin Ecosystem (WOO_SL como dependência opcional)
- Fluxo License de Plugin — conteúdo absorvido neste ADR e REF