pub(crate) mod config;
pub(crate) mod contract;
pub(crate) mod document;
pub(crate) mod error;
pub(crate) mod product;
pub(crate) mod quote;
pub(crate) mod types;
pub use error::CpqErrorResponse;
pub use types::{
AddProductsRequest, ConfigurationModel, GenerateDocumentRequest, ProductModel, QuoteLineModel,
QuoteModel, ServiceRouterRequest,
};
use crate::error::{HttpError, Result};
use serde::Serialize;
use serde::de::DeserializeOwned;
use std::sync::Arc;
#[derive(Debug)]
pub struct CpqHandler<A: crate::auth::Authenticator> {
inner: Arc<crate::session::Session<A>>,
}
impl<A: crate::auth::Authenticator> Clone for CpqHandler<A> {
fn clone(&self) -> Self {
Self {
inner: Arc::clone(&self.inner),
}
}
}
const SERVICE_ROUTER: &str = "SBQQ/ServiceRouter";
impl<A: crate::auth::Authenticator> CpqHandler<A> {
#[must_use]
pub(crate) fn new(inner: Arc<crate::session::Session<A>>) -> Self {
Self { inner }
}
pub(crate) async fn service_router_post<T: DeserializeOwned>(
&self,
loader: &str,
body: &(impl Serialize + Sync),
) -> Result<T> {
let url = self.inner.resolve_apex_rest_url(SERVICE_ROUTER).await?;
let request = self
.inner
.post(&url)
.query(&[("loader", loader)])
.json(body)
.build()
.map_err(HttpError::from)?;
self.inner
.send_request_and_decode(request, &format!("CPQ {loader} failed"))
.await
}
pub(crate) async fn service_router_patch<T: DeserializeOwned>(
&self,
loader: &str,
body: &(impl Serialize + Sync),
) -> Result<T> {
let url = self.inner.resolve_apex_rest_url(SERVICE_ROUTER).await?;
let request = self
.inner
.patch(&url)
.query(&[("loader", loader)])
.json(body)
.build()
.map_err(HttpError::from)?;
self.inner
.send_request_and_decode(request, &format!("CPQ {loader} failed"))
.await
}
}