Concepts
Conceitos de domínio do license-manager
Tenant
Cliente final. Identificado por document (CNPJ, validado ignorando pontuação). Pode estar is_blocked, e tem activated_at/suspended_at/cancelled_at para rastrear o ciclo de vida.
License
O agregado central. Ao mesmo tempo é entidade de negócio e credencial de API: usa Sanctum (HasApiTokens) e é o AuthenticatableContract autenticado nas rotas /api/v1/*. Tem status (active/suspended/expired/cancelled), está vinculada a um Tenant, uma LicenseCategory e N Products (cada vínculo carrega um usage_limit próprio).
LicenseCategory
Cumpre o papel de “plano”. Não existe uma entidade chamada Plan no código — LicenseCategory guarda validity_months, is_trial e default_max_logins.
Product
Catálogo de módulos que uma licença pode habilitar (fn_id, reference, description). O software consumidor decide o que exibir/parametrizar a partir da lista de produtos habilitados na licença, não o license-manager.
SerialKey
Formato LIC-{lookup 8 chars}-{secret 24 chars}, ex.: LIC-XXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxx. Funciona como par client_id/client_secret do fluxo OAuth2 client_credentials. É mostrado em texto claro uma única vez, no momento da criação, no painel. Depois disso o segredo não é recuperável: fica salvo só como hash SHA-256 (Sha256SecretHasher).
LicenseRecovery
Log de auditoria append-only ($timestamps = false) de toda recuperação de chave/serial: quem recuperou, IP, motivo, contexto. Não existe operação de “desfazer” — é só rastro.
CanaryFeature
Feature flag que pode ser ligada por licença individual (tabela pivot license_canary_features, com enabled_at/enabled_by). Serve para liberar funcionalidade em teste para um cliente específico sem mexer no plano dele.
AccessProvisioner / Group / Permission
O catálogo de permissões do painel admin não é escrito à mão: AccessProvisioner varre os Resources registrados no painel Filament e gera automaticamente uma permissão {subject}.{action} para cada ação de cada Resource (view, create, update, delete, e restore/forceDelete quando o model usa soft deletes). Group é o nome interno para o que o spatie/laravel-permission chama de Role. Rodar access:sync-permissions depois de adicionar ou remover um Resource é o que mantém o catálogo em dia — sem isso, a permissão nova simplesmente não existe.
O que este serviço não tem
Nenhum outbox, fila de eventos de domínio ou mecanismo de emissão de certificado/voucher — isso é desenho do key-service, que ainda não foi implementado. Hoje o license-manager resolve autenticação e autorização inteiramente dentro do módulo oauth, sem publicar nada para fora.