Publicar

Publicar um evento no TermoWebhook na hora, com o token do aplicativo. Feature webhook_publicar.

Cargo.toml
termo_core = { version = "=0.1.5", features = ["webhook_publicar"] }
Em código de app, prefira a fila no Postgres: ela garante que o evento só sai se a transação gravou e tenta de novo sozinha. Publicar na hora serve para ferramentas e scripts.

publicar_evento_no_hub_agora

Envia o envelope para POST {hub}/eventos com Authorization: Bearer <token do aplicativo>. Tempo limite de 10 s, sem seguir redirecionamentos.

pub async fn publicar_evento_no_hub_agora<T: Evento>(
    configuracao: &ConfiguracaoDoHub,
    envelope: &Envelope<T>,
) -> Result<Publicado, FalhaDePublicacao>
Exemplo
use termo_core::webhook::{publicar_evento_no_hub_agora, ConfiguracaoDoHub, Envelope};
use termo_core::webhook::eventos::termo_auth::ColaboradorCriadoV2;

let hub = ConfiguracaoDoHub::carregar_do_ambiente_atual().expect("sempre devolve o hub do ambiente");
let envelope = Envelope::novo(colaborador.id.to_string(), ColaboradorCriadoV2 { /* ... */ });

match publicar_evento_no_hub_agora(&hub, &envelope).await {
    Ok(publicado) if publicado.repetido => println!("o hub já tinha este evento"),
    Ok(_) => {}
    Err(falha) if falha.vale_tentar_de_novo() => { /* tente mais tarde */ }
    Err(falha) => eprintln!("recusado: {falha}"),
}

ConfiguracaoDoHub

pub struct ConfiguracaoDoHub {
    pub url: String,
}

impl ConfiguracaoDoHub {
    pub fn nova(url: impl Into<String>) -> Self;
    /// Sempre devolve o hub do ambiente atual. Sem segredo do app, avisa que os eventos esperam na fila.
    pub fn carregar_do_ambiente_atual() -> Option<Self>;
    pub fn endereco_de_publicacao(&self) -> String; // "{url}/eventos"
}

pub const CAMINHO_DE_PUBLICACAO: &str = "/eventos";

Envelope e o trait Evento

pub trait Evento: Serialize + DeserializeOwned {
    const APLICATIVO: &'static str;
    const TIPO: &'static str;
    const VERSAO: i32;
}

pub struct Envelope<T> {
    pub id: Uuid,               // UUID v7, gerado por Envelope::novo
    pub tipo: String,           // T::TIPO
    pub versao: i32,            // T::VERSAO
    pub entidade_id: String,
    pub ocorrido_em: DateTime<Utc>,
    pub dados: T,
}

impl<T: Evento> Envelope<T> {
    pub fn novo(entidade_id: impl Into<String>, dados: T) -> Self;
}

Publicado e FalhaDePublicacao

pub struct Publicado {
    pub repetido: bool,          // o hub já tinha um evento com este id
    pub aviso: Option<String>,
}

pub enum FalhaDePublicacao {
    Rede(String),
    SemTokenDoAplicativo(String),
    Recusado { status: u16, motivo: Option<String>, mensagem: String },
    Serializacao(String),
}

impl FalhaDePublicacao {
    /// false para Serializacao e para recusas 400, 413 e 422; true para o resto.
    pub fn vale_tentar_de_novo(&self) -> bool;
}

endereco_do_termo_webhook_no_ambiente_atual

pub fn endereco_do_termo_webhook_no_ambiente_atual() -> String

Endereço do hub no ambiente atual (features webhook_publicar ou webhook_receber).

Nesta página