use crate::resources::_base::{put_opt, vars};
use crate::types::{Delivery, ListResult};
use crate::HivehookError;
use serde::Deserialize;
use serde_json::Value;
const FRAGMENT: &str = "id eventId subscriptionId destinationId status attempts maxAttempts nextAttemptAt createdAt";
const DETAIL_FRAGMENT: &str = "id eventId subscriptionId destinationId status attempts maxAttempts nextAttemptAt createdAt deliveryAttempts { id deliveryId attemptNumber responseStatus responseBody error durationMs attemptedAt }";
#[non_exhaustive]
#[derive(Debug, Default, Clone)]
pub struct ListDeliveriesOptions {
pub event_id: Option<String>,
pub destination_id: Option<String>,
pub subscription_id: Option<String>,
pub status: Option<String>,
pub search: Option<String>,
pub limit: Option<i32>,
pub offset: Option<i32>,
pub after: Option<String>,
pub first: Option<i32>,
}
#[derive(Deserialize)]
struct ListData {
deliveries: ListResult<Delivery>,
}
#[derive(Deserialize)]
struct GetData {
delivery: Option<Delivery>,
}
#[cfg(feature = "blocking")]
pub struct DeliveryService<'a> {
pub(crate) transport: &'a crate::transport::BlockingGraphQLTransport,
}
#[cfg(feature = "blocking")]
impl<'a> DeliveryService<'a> {
pub fn list(
&self,
options: ListDeliveriesOptions,
) -> Result<ListResult<Delivery>, HivehookError> {
let query = format!(
r#"query($eventId: UUID, $destinationId: UUID, $subscriptionId: UUID, $status: DeliveryStatus, $search: String, $limit: Int, $offset: Int, $after: String, $first: Int) {{
deliveries(eventId: $eventId, destinationId: $destinationId, subscriptionId: $subscriptionId, status: $status, search: $search, limit: $limit, offset: $offset, after: $after, first: $first) {{
nodes {{ {FRAGMENT} }}
pageInfo {{ total limit offset endCursor hasNextPage }}
}}
}}"#
);
let mut v = vars();
put_opt(&mut v, "eventId", options.event_id);
put_opt(&mut v, "destinationId", options.destination_id);
put_opt(&mut v, "subscriptionId", options.subscription_id);
put_opt(&mut v, "status", options.status);
put_opt(&mut v, "search", options.search);
put_opt(&mut v, "limit", options.limit);
put_opt(&mut v, "offset", options.offset);
put_opt(&mut v, "after", options.after);
put_opt(&mut v, "first", options.first);
let data: ListData = self.transport.execute(&query, Some(v))?;
Ok(data.deliveries)
}
pub fn get(&self, id: &str) -> Result<Option<Delivery>, HivehookError> {
let query = format!("query($id: UUID!) {{ delivery(id: $id) {{ {DETAIL_FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: GetData = self.transport.execute(&query, Some(v))?;
Ok(data.delivery)
}
}
#[cfg(feature = "async")]
#[cfg_attr(docsrs, doc(cfg(feature = "async")))]
pub struct AsyncDeliveryService<'a> {
pub(crate) transport: &'a crate::transport::AsyncGraphQLTransport,
}
#[cfg(feature = "async")]
impl<'a> AsyncDeliveryService<'a> {
pub async fn list(
&self,
options: ListDeliveriesOptions,
) -> Result<ListResult<Delivery>, HivehookError> {
let query = format!(
r#"query($eventId: UUID, $destinationId: UUID, $subscriptionId: UUID, $status: DeliveryStatus, $search: String, $limit: Int, $offset: Int, $after: String, $first: Int) {{
deliveries(eventId: $eventId, destinationId: $destinationId, subscriptionId: $subscriptionId, status: $status, search: $search, limit: $limit, offset: $offset, after: $after, first: $first) {{
nodes {{ {FRAGMENT} }}
pageInfo {{ total limit offset endCursor hasNextPage }}
}}
}}"#
);
let mut v = vars();
put_opt(&mut v, "eventId", options.event_id);
put_opt(&mut v, "destinationId", options.destination_id);
put_opt(&mut v, "subscriptionId", options.subscription_id);
put_opt(&mut v, "status", options.status);
put_opt(&mut v, "search", options.search);
put_opt(&mut v, "limit", options.limit);
put_opt(&mut v, "offset", options.offset);
put_opt(&mut v, "after", options.after);
put_opt(&mut v, "first", options.first);
let data: ListData = self.transport.execute(&query, Some(v)).await?;
Ok(data.deliveries)
}
pub async fn get(&self, id: &str) -> Result<Option<Delivery>, HivehookError> {
let query = format!("query($id: UUID!) {{ delivery(id: $id) {{ {DETAIL_FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: GetData = self.transport.execute(&query, Some(v)).await?;
Ok(data.delivery)
}
}