mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
+1








14fba21e57
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com> Signed-off-by: npub1jh9wn95s0472h86ahapupaf7m6kx4v9sx2n0atj2hltcfer8k06s5n3pyf <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@sprout-oss.stage.blox.sqprod.co> Signed-off-by: Tyler Longwell <tlongwell@block.xyz> Signed-off-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co> Signed-off-by: npub17jjz49l9jjmhhk7cac63j8yt9z555n9cw8vk7v5jz4vzw4ppld5qgj57cc <f4a42a97e594b77bdbd8ee35191c8b28a94a4cb871d96f32921558275421fb68@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Eva <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Mari <95cae996907d7cab9f5dbf43c0f53edeac6ab0b032a6feae4abfd784e467b3f5@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Sami <f4a42a97e594b77bdbd8ee35191c8b28a94a4cb871d96f32921558275421fb68@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Max <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Quinn <96f056ad5f2305c8ddf637dc65d048aa4c12d7daeb8867690e34fca46b0ef64c@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Dawn <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co> Co-authored-by: Tyler Longwell <tlongwell@block.xyz> Co-authored-by: Sami <sami@sprout-oss.stage.blox.sqprod.co> Co-authored-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co>
70 lines
2.6 KiB
Rust
70 lines
2.6 KiB
Rust
//! Action sink trait — interface for workflow side-effects.
|
|
//!
|
|
//! The relay implements [`ActionSink`] to provide direct DB access to the
|
|
//! executor, replacing the HTTP loopback pattern.
|
|
|
|
use std::future::Future;
|
|
use std::pin::Pin;
|
|
|
|
use buzz_core::tenant::CommunityId;
|
|
|
|
/// Errors from action sink operations.
|
|
#[derive(Debug, thiserror::Error)]
|
|
pub enum ActionSinkError {
|
|
/// An input parameter is malformed (e.g. invalid UUID).
|
|
#[error("invalid input: {0}")]
|
|
InvalidInput(String),
|
|
/// The target channel does not exist.
|
|
#[error("channel not found: {0}")]
|
|
ChannelNotFound(String),
|
|
/// The target channel is archived.
|
|
#[error("channel is archived: {0}")]
|
|
ChannelArchived(String),
|
|
/// Nostr event construction or signing failed.
|
|
#[error("event construction failed: {0}")]
|
|
EventBuild(String),
|
|
/// A database operation failed.
|
|
#[error("database error: {0}")]
|
|
Database(String),
|
|
/// Message content is empty or whitespace-only.
|
|
#[error("empty message content")]
|
|
EmptyContent,
|
|
}
|
|
|
|
impl From<ActionSinkError> for crate::WorkflowError {
|
|
fn from(e: ActionSinkError) -> Self {
|
|
crate::WorkflowError::WebhookError(e.to_string())
|
|
}
|
|
}
|
|
|
|
/// Interface for workflow actions that produce side effects.
|
|
///
|
|
/// Implemented by the relay to provide direct DB/event access to the executor.
|
|
/// This replaces the HTTP loopback where the executor POSTed to the relay's
|
|
/// REST API (which failed with 401 auth errors).
|
|
///
|
|
/// Returns `Pin<Box<dyn Future>>` for dyn-compatibility — required because
|
|
/// `WorkflowEngine` stores `Arc<dyn ActionSink>`.
|
|
pub trait ActionSink: Send + Sync {
|
|
/// Post a message to a channel on behalf of a workflow owner.
|
|
///
|
|
/// - `community_id`: the server-resolved community that owns the workflow
|
|
/// run driving this side effect. The relay-signed message is published
|
|
/// under *this* community, never the deployment/default tenant — the run
|
|
/// carries its owning community so a workflow in community B posts into B
|
|
/// even though the side effect has no inbound connection to bind.
|
|
/// - `channel_id`: UUID string of the target channel
|
|
/// - `text`: message body (must not be empty/whitespace-only)
|
|
/// - `author_pubkey`: hex-encoded pubkey of the workflow owner (used for
|
|
/// the `p` attribution tag; the relay keypair signs the event)
|
|
///
|
|
/// Returns the event ID hex string on success.
|
|
fn send_message(
|
|
&self,
|
|
community_id: CommunityId,
|
|
channel_id: &str,
|
|
text: &str,
|
|
author_pubkey: &str,
|
|
) -> Pin<Box<dyn Future<Output = Result<String, ActionSinkError>> + Send + '_>>;
|
|
}
|