Publicar
Publicar um evento no TermoWebhook na hora, com o token do aplicativo. Feature webhook_publicar.
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>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() -> StringEndereço do hub no ambiente atual (features webhook_publicar ou webhook_receber).