Appearance
Integração com a API Cademi
A Cademi é uma plataforma brasileira para criação de áreas de membros, usada para hospedar, organizar e vender cursos online e outros produtos digitais. A integração do nosso sistema com a Cademi foca em matricular e desmatricular vendedores (sellers) nos produtos digitais, sincronizando seu status de acesso de forma automática.
Visão Geral
A integração permite que o status de um vendedor em um determinado serviço seja refletido na plataforma Cademi. As principais funcionalidades são:
- Habilitar Vendedor: Concede acesso a um vendedor na Cademi, associando-o a um produto.
- Desabilitar Vendedor: Revoga o acesso de um vendedor na Cademi.
- Listar Usuários: Lista todos os usuários cadastrados na plataforma Cademi.
- Deletar Usuário: Remove um usuário específico da plataforma Cademi pelo CPF.
Essas ações podem ser executadas de forma automática (quando um vendedor é criado ou deletado) ou manual (através do painel de administração).
Componentes Principais
A integração é estruturada em torno de uma classe de API, classes de suporte (Endpoint e Payload), Jobs para processamento assíncrono e gatilhos no sistema (Observers e painel Filament).
CademiAPI
É a classe central que encapsula toda a comunicação com a API da Cademi.
- Localização:
app/Integrations/Cademi/CademiAPI.php
Responsabilidades:
- Autenticação: Envia as credenciais (
Authorizationetoken) necessárias em cada requisição. - Operações: Contém os métodos para as principais ações da API, utilizando as classes
CademiEndpointeCademiPayloadpara montar as requisições. - Tratamento de Erros: Lança uma
Exceptionse a resposta da API não indicar sucesso (success: false). - Rate Limiting: Todas as requisições passam pelo
CademiRateLimiterpara respeitar o limite de taxa da API. - Logging: Todas as requisições e respostas são logadas para facilitar a depuração.
Métodos disponíveis:
enableSeller(Seller $seller, string $cademi_cod): Habilita um vendedor na Cademi.disableSeller(Seller $seller, string $cademi_cod): Desabilita um vendedor na Cademi.users(): Lista todos os usuários cadastrados na plataforma.delete(string $cpf): Remove um usuário específico pelo CPF.
Classes de Suporte
CademiEndpoint
Esta classe centraliza todos os endpoints (URIs) da API da Cademi, evitando a repetição de strings no código e facilitando a manutenção.
- Localização:
app/Integrations/Cademi/CademiEndpoint.php
php
class CademiEndpoint
{
const ENABLE_SELLER = '/postback/custom';
const DISABLE_SELLER = '/postback/custom';
const USERS_LIST = '/v1/usuario';
const USER_DELETE = '/v1/usuario/%s';
}CademiPayload
Responsável por construir o corpo (payload) das requisições enviadas para a API. Garante que os dados enviados estejam no formato esperado pela Cademi.
- Localização:
app/Integrations/Cademi/CademiPayload.php
O método enableSeller, por exemplo, monta um array com todos os dados do vendedor e do produto, além de definir o status como aprovado.
php
class CademiPayload
{
const STATUS_ENABLED = 'aprovado';
const STATUS_DISABLED = 'cancelado';
public static function enableSeller(Seller $seller, string $token, string $cademi_cod)
{
return [
'token' => $token,
'codigo' => $cademi_cod,
'status' => self::STATUS_ENABLED,
'produto_id' => $seller->service->proposal->event_id,
// ... outros dados do cliente
];
}
// ...
}CademiRateLimiter
Classe responsável por gerenciar o rate limiting das requisições à API da Cademi, garantindo que o limite de 2 requisições por segundo seja respeitado.
- Localização:
app/Integrations/Cademi/CademiRateLimiter.php
Funcionamento:
- Utiliza cache do Laravel com locks atômicos para garantir que apenas 2 requisições sejam executadas por segundo.
- Implementa um sistema de retry automático com timeout máximo de 5 segundos.
- Se uma requisição não puder ser executada dentro do limite de tempo, lança uma
RuntimeException. - Mantém um histórico de timestamps das últimas requisições no cache.
Métodos:
throttle(callable $callback): Executa o callback respeitando o rate limit, com retry automático.clear(): Limpa o estado do rate limiter (útil para testes ou manutenção).
php
// Exemplo de uso interno na CademiAPI
public function enableSeller(Seller $seller, string $cademi_cod)
{
return $this->rateLimiter->throttle(function () use ($seller, $cademi_cod) {
// Requisição HTTP aqui
});
}Actions: EnableInCademi e DisableInCademi
O sistema utiliza o padrão de Actions (via pacote lorisleiva/laravel-actions) para executar as operações de integração com a Cademi. Isso permite que as mesmas actions sejam executadas de forma síncrona ou assíncrona (como Jobs).
- Localização:
app/Actions/Seller/
EnableInCademi:
- Gera um código único (
Str::ulid()) para o vendedor. - Chama a
CademiAPIpara habilitar o vendedor. - Atualiza o vendedor local com o código gerado.
- Implementa tratamento de erros com logging.
- Pode ser executada como Job usando
EnableInCademi::dispatch($seller).
DisableInCademi:
- Usa o
cademi_codexistente do vendedor. - Chama a
CademiAPIpara desabilitar o vendedor. - Remove o código do vendedor local.
- Implementa tratamento de erros com logging.
- Pode ser executada como Job usando
DisableInCademi::dispatch($seller).
SellerObserver
Automatiza a integração com a Cademi em dois momentos do ciclo de vida do vendedor: criação e exclusão.
- Localização:
app/Observers/SellerObserver.php
Método created: Quando um vendedor é criado, o observer verifica se a integração está ativa para o evento (baseado nas datas cademi_start_date e cademi_end_date). Se estiver ativo, despacha a action EnableInCademi de forma assíncrona.
Método deleted: Quando um vendedor é deletado, o observer automaticamente despacha a action DisableInCademi para revogar o acesso na plataforma Cademi.
php
// app/Observers/SellerObserver.php
public function created(Seller $seller): void
{
$event = $seller->service->proposal->event;
if ($event->cademi_start_date <= now() && $event->cademi_end_date >= now()) {
EnableInCademi::dispatch($seller);
}
}
public function deleted(Seller $seller): void
{
DisableInCademi::dispatch($seller);
}SellersRelationManager (Filament)
No painel de administração, a gestão manual da integração é feita através de uma coluna na tabela de vendedores.
- Localização:
app/Filament/{Admin|Client}/Resources/ServiceResource/RelationManagers/
Um ícone de toggle permite habilitar ou desabilitar um vendedor de forma síncrona (dispatchSync), e um ícone de "spinner" com atualização automática da tabela (polling) informa o usuário enquanto a operação está em andamento.
Modelo de Dados (sellers)
O campo cademi_cod na tabela sellers é crucial para a integração:
null: O vendedor não está integrado ou foi desabilitado.'integrating': O processo de integração está em andamento.(string): O vendedor está ativo na Cademi, e o valor é seu identificador único na plataforma.
Comandos Artisan
sellers:enable-in-cademi: Habilita em massa todos os vendedores sem código Cademi em eventos ativos (dentro do períodocademi_start_dateecademi_end_date). Este comando é útil para:- Recuperar integrações que falharam
- Integrar vendedores criados antes da ativação da integração
- Re-sincronizar vendedores após manutenções
Configuração
As credenciais da API da Cademi devem ser configuradas no arquivo .env:
dotenv
CADEMI_URL=https://url.da.api.cademi/
CADEMI_AUTHORIZATION="Bearer ..."
CADEMI_TOKEN=seu_token_internoEstas variáveis são lidas a partir do arquivo config/cademi.php.