reevit 0.2.0

Official Rust SDK for the Reevit payments API
Documentation
use reqwest::Method;
use serde_json::Value;

use crate::{
    Client, OutboundWebhook, PaginationOptions, RequestOptions, Result, WebhookConfig,
    WebhookConfigRequest, WebhookEvent, WebhookEventListOptions,
};

use super::path_segment;

/// Webhook configuration, event, and delivery operations.
#[derive(Debug, Clone)]
pub struct Webhooks {
    client: Client,
}

impl Webhooks {
    pub(crate) fn new(client: Client) -> Self {
        Self { client }
    }

    /// Retrieves outbound webhook configuration.
    pub async fn get_config(&self) -> Result<WebhookConfig> {
        let request = self.client.request(Method::GET, "/v1/webhooks/config")?;
        self.client.send(request, RequestOptions::default()).await
    }

    /// Creates or updates outbound webhook configuration.
    pub async fn upsert_config(
        &self,
        input: &WebhookConfigRequest,
        options: RequestOptions,
    ) -> Result<WebhookConfig> {
        let request = self
            .client
            .request(Method::POST, "/v1/webhooks/config")?
            .json(input);
        self.client.send(request, options).await
    }

    /// Deletes outbound webhook configuration.
    pub async fn delete_config(&self, options: RequestOptions) -> Result<()> {
        let request = self.client.request(Method::DELETE, "/v1/webhooks/config")?;
        self.client.send(request, options).await
    }

    /// Sends a test webhook.
    pub async fn send_test(&self, options: RequestOptions) -> Result<Value> {
        self.client.post_empty("/v1/webhooks/test", options).await
    }

    /// Lists recorded webhook events.
    pub async fn list_events(
        &self,
        options: &WebhookEventListOptions,
    ) -> Result<Vec<WebhookEvent>> {
        let request = self
            .client
            .request(Method::GET, "/v1/webhooks/events")?
            .query(options);
        self.client.send_collection(request, "events").await
    }

    /// Retrieves a webhook event by ID.
    pub async fn get_event(&self, id: &str) -> Result<WebhookEvent> {
        let request = self.client.request(
            Method::GET,
            &format!("/v1/webhooks/events/{}", path_segment(id)),
        )?;
        self.client.send(request, RequestOptions::default()).await
    }

    /// Replays a recorded webhook event.
    pub async fn replay_event(&self, id: &str, options: RequestOptions) -> Result<Value> {
        self.client
            .post_empty(
                &format!("/v1/webhooks/events/{}/replay", path_segment(id)),
                options,
            )
            .await
    }

    /// Lists outbound webhook deliveries.
    pub async fn list_outbound(&self, options: &PaginationOptions) -> Result<Vec<OutboundWebhook>> {
        let request = self
            .client
            .request(Method::GET, "/v1/webhooks/outbound")?
            .query(options);
        self.client.send_collection(request, "outbound").await
    }

    /// Retrieves an outbound webhook delivery by ID.
    pub async fn get_outbound(&self, id: &str) -> Result<OutboundWebhook> {
        let request = self.client.request(
            Method::GET,
            &format!("/v1/webhooks/outbound/{}", path_segment(id)),
        )?;
        self.client.send(request, RequestOptions::default()).await
    }
}