#[cfg(feature = "diesel")]
pub(in crate) mod diesel;
mod error;
use crate::paging::Paging;
#[cfg(feature = "diesel")]
pub use self::diesel::{DieselConnectionPurchaseOrderStore, DieselPurchaseOrderStore};
pub use error::{PurchaseOrderBuilderError, PurchaseOrderStoreError};
#[derive(Clone, Debug, Serialize, PartialEq)]
pub struct PurchaseOrderList {
pub data: Vec<PurchaseOrder>,
pub paging: Paging,
}
impl PurchaseOrderList {
pub fn new(data: Vec<PurchaseOrder>, paging: Paging) -> Self {
Self { data, paging }
}
}
#[derive(Clone, Debug, Serialize, PartialEq)]
pub struct PurchaseOrder {
purchase_order_uid: String,
workflow_state: String,
buyer_org_id: String,
seller_org_id: String,
is_closed: bool,
accepted_version_id: Option<String>,
versions: Vec<PurchaseOrderVersion>,
alternate_ids: Vec<PurchaseOrderAlternateId>,
created_at: i64,
workflow_id: String,
start_commit_num: i64,
end_commit_num: i64,
service_id: Option<String>,
}
impl PurchaseOrder {
pub fn purchase_order_uid(&self) -> &str {
&self.purchase_order_uid
}
pub fn workflow_state(&self) -> &str {
&self.workflow_state
}
pub fn buyer_org_id(&self) -> &str {
&self.buyer_org_id
}
pub fn seller_org_id(&self) -> &str {
&self.seller_org_id
}
pub fn is_closed(&self) -> bool {
self.is_closed
}
pub fn accepted_version_id(&self) -> Option<&str> {
self.accepted_version_id.as_deref()
}
pub fn versions(&self) -> Vec<PurchaseOrderVersion> {
self.versions.to_vec()
}
pub fn alternate_ids(&self) -> Vec<PurchaseOrderAlternateId> {
self.alternate_ids.to_vec()
}
pub fn created_at(&self) -> &i64 {
&self.created_at
}
pub fn workflow_id(&self) -> &str {
&self.workflow_id
}
pub fn start_commit_num(&self) -> &i64 {
&self.start_commit_num
}
pub fn end_commit_num(&self) -> &i64 {
&self.end_commit_num
}
pub fn service_id(&self) -> Option<&str> {
self.service_id.as_deref()
}
}
#[derive(Default, Clone)]
pub struct PurchaseOrderBuilder {
purchase_order_uid: String,
workflow_state: String,
buyer_org_id: String,
seller_org_id: String,
is_closed: bool,
accepted_version_id: Option<String>,
versions: Vec<PurchaseOrderVersion>,
alternate_ids: Vec<PurchaseOrderAlternateId>,
created_at: i64,
workflow_id: String,
start_commit_num: i64,
end_commit_num: i64,
service_id: Option<String>,
}
impl PurchaseOrderBuilder {
pub fn with_purchase_order_uid(mut self, uid: String) -> Self {
self.purchase_order_uid = uid;
self
}
pub fn with_workflow_state(mut self, status: String) -> Self {
self.workflow_state = status;
self
}
pub fn with_buyer_org_id(mut self, org_id: String) -> Self {
self.buyer_org_id = org_id;
self
}
pub fn with_seller_org_id(mut self, org_id: String) -> Self {
self.seller_org_id = org_id;
self
}
pub fn with_is_closed(mut self, is_closed: bool) -> Self {
self.is_closed = is_closed;
self
}
pub fn with_accepted_version_id(mut self, version_id: String) -> Self {
self.accepted_version_id = Some(version_id);
self
}
pub fn with_versions(mut self, versions: Vec<PurchaseOrderVersion>) -> Self {
self.versions = versions;
self
}
pub fn with_alternate_ids(mut self, alternate_ids: Vec<PurchaseOrderAlternateId>) -> Self {
self.alternate_ids = alternate_ids;
self
}
pub fn with_created_at(mut self, created_at: i64) -> Self {
self.created_at = created_at;
self
}
pub fn with_workflow_id(mut self, workflow_id: String) -> Self {
self.workflow_id = workflow_id;
self
}
pub fn with_start_commit_number(mut self, start_commit_num: i64) -> Self {
self.start_commit_num = start_commit_num;
self
}
pub fn with_end_commit_number(mut self, end_commit_num: i64) -> Self {
self.end_commit_num = end_commit_num;
self
}
pub fn with_service_id(mut self, service_id: Option<String>) -> Self {
self.service_id = service_id;
self
}
pub fn build(self) -> Result<PurchaseOrder, PurchaseOrderBuilderError> {
let PurchaseOrderBuilder {
purchase_order_uid,
workflow_state,
buyer_org_id,
seller_org_id,
is_closed,
accepted_version_id,
versions,
alternate_ids,
created_at,
workflow_id,
start_commit_num,
end_commit_num,
service_id,
} = self;
if purchase_order_uid.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"purchase_order_uid".to_string(),
));
};
if buyer_org_id.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"buyer_org_id".to_string(),
));
};
if seller_org_id.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"seller_org_id".to_string(),
));
};
if workflow_state.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"workflow_state".to_string(),
));
};
if workflow_id.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"workflow_id".to_string(),
));
};
if start_commit_num >= end_commit_num {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"start_commit_number must be less than end_commit_num".to_string(),
));
};
if end_commit_num <= start_commit_num {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"end_commit_number must be greater than start_commit_num".to_string(),
));
};
Ok(PurchaseOrder {
purchase_order_uid,
workflow_state,
buyer_org_id,
seller_org_id,
is_closed,
accepted_version_id,
versions,
alternate_ids,
created_at,
workflow_id,
start_commit_num,
end_commit_num,
service_id,
})
}
}
#[derive(Clone, Debug, Serialize, PartialEq)]
pub struct PurchaseOrderVersionList {
pub data: Vec<PurchaseOrderVersion>,
pub paging: Paging,
}
impl PurchaseOrderVersionList {
pub fn new(data: Vec<PurchaseOrderVersion>, paging: Paging) -> Self {
Self { data, paging }
}
}
#[derive(Clone, Debug, Serialize, PartialEq)]
pub struct PurchaseOrderVersion {
version_id: String,
is_draft: bool,
current_revision_id: i64,
revisions: Vec<PurchaseOrderVersionRevision>,
workflow_state: String,
start_commit_num: i64,
end_commit_num: i64,
service_id: Option<String>,
}
impl PurchaseOrderVersion {
pub fn version_id(&self) -> &str {
&self.version_id
}
pub fn is_draft(&self) -> bool {
self.is_draft
}
pub fn current_revision_id(&self) -> &i64 {
&self.current_revision_id
}
pub fn revisions(&self) -> Vec<PurchaseOrderVersionRevision> {
self.revisions.to_vec()
}
pub fn workflow_state(&self) -> &str {
&self.workflow_state
}
pub fn start_commit_num(&self) -> &i64 {
&self.start_commit_num
}
pub fn end_commit_num(&self) -> &i64 {
&self.end_commit_num
}
pub fn service_id(&self) -> Option<&str> {
self.service_id.as_deref()
}
}
#[derive(Default, Clone)]
pub struct PurchaseOrderVersionBuilder {
version_id: String,
is_draft: bool,
current_revision_id: i64,
revisions: Vec<PurchaseOrderVersionRevision>,
workflow_state: String,
start_commit_num: i64,
end_commit_num: i64,
service_id: Option<String>,
}
impl PurchaseOrderVersionBuilder {
pub fn with_version_id(mut self, version_id: String) -> Self {
self.version_id = version_id;
self
}
pub fn with_is_draft(mut self, is_draft: bool) -> Self {
self.is_draft = is_draft;
self
}
pub fn with_current_revision_id(mut self, revision_id: i64) -> Self {
self.current_revision_id = revision_id;
self
}
pub fn with_revisions(mut self, revisions: Vec<PurchaseOrderVersionRevision>) -> Self {
self.revisions = revisions;
self
}
pub fn with_workflow_state(mut self, workflow_state: String) -> Self {
self.workflow_state = workflow_state;
self
}
pub fn with_start_commit_number(mut self, start_commit_num: i64) -> Self {
self.start_commit_num = start_commit_num;
self
}
pub fn with_end_commit_number(mut self, end_commit_num: i64) -> Self {
self.end_commit_num = end_commit_num;
self
}
pub fn with_service_id(mut self, service_id: Option<String>) -> Self {
self.service_id = service_id;
self
}
pub fn build(self) -> Result<PurchaseOrderVersion, PurchaseOrderBuilderError> {
let PurchaseOrderVersionBuilder {
version_id,
is_draft,
current_revision_id,
revisions,
workflow_state,
start_commit_num,
end_commit_num,
service_id,
} = self;
if version_id.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"version_id".to_string(),
));
};
if current_revision_id <= 0 {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"current_revision_id must be greater than 0".to_string(),
));
};
if revisions.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"revisions".to_string(),
));
};
if workflow_state.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"workflow_state".to_string(),
));
};
if start_commit_num >= end_commit_num {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"start_commit_number must be less than end_commit_num".to_string(),
));
};
if end_commit_num <= start_commit_num {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"end_commit_number must be greater than start_commit_num".to_string(),
));
};
Ok(PurchaseOrderVersion {
version_id,
is_draft,
current_revision_id,
revisions,
workflow_state,
start_commit_num,
end_commit_num,
service_id,
})
}
}
#[derive(Clone, Debug, Serialize, PartialEq)]
pub struct PurchaseOrderVersionRevisionList {
pub data: Vec<PurchaseOrderVersionRevision>,
pub paging: Paging,
}
impl PurchaseOrderVersionRevisionList {
pub fn new(data: Vec<PurchaseOrderVersionRevision>, paging: Paging) -> Self {
Self { data, paging }
}
}
#[derive(Clone, Debug, Serialize, PartialEq)]
pub struct PurchaseOrderVersionRevision {
pub revision_id: i64,
pub order_xml_v3_4: String,
pub submitter: String,
pub created_at: i64,
pub start_commit_num: i64,
pub end_commit_num: i64,
pub service_id: Option<String>,
}
impl PurchaseOrderVersionRevision {
pub fn revision_id(&self) -> &i64 {
&self.revision_id
}
pub fn order_xml_v3_4(&self) -> &str {
&self.order_xml_v3_4
}
pub fn submitter(&self) -> &str {
&self.submitter
}
pub fn created_at(&self) -> i64 {
self.created_at
}
pub fn start_commit_num(&self) -> &i64 {
&self.start_commit_num
}
pub fn end_commit_num(&self) -> &i64 {
&self.end_commit_num
}
pub fn service_id(&self) -> Option<&str> {
self.service_id.as_deref()
}
}
#[derive(Default, Clone)]
pub struct PurchaseOrderVersionRevisionBuilder {
revision_id: i64,
order_xml_v3_4: String,
submitter: String,
created_at: i64,
start_commit_num: i64,
end_commit_num: i64,
service_id: Option<String>,
}
impl PurchaseOrderVersionRevisionBuilder {
pub fn with_revision_id(mut self, revision_id: i64) -> Self {
self.revision_id = revision_id;
self
}
pub fn with_order_xml_v3_4(mut self, xml: String) -> Self {
self.order_xml_v3_4 = xml;
self
}
pub fn with_submitter(mut self, submitter: String) -> Self {
self.submitter = submitter;
self
}
pub fn with_created_at(mut self, created_at: i64) -> Self {
self.created_at = created_at;
self
}
pub fn with_start_commit_number(mut self, start_commit_num: i64) -> Self {
self.start_commit_num = start_commit_num;
self
}
pub fn with_end_commit_number(mut self, end_commit_num: i64) -> Self {
self.end_commit_num = end_commit_num;
self
}
pub fn with_service_id(mut self, service_id: Option<String>) -> Self {
self.service_id = service_id;
self
}
pub fn build(self) -> Result<PurchaseOrderVersionRevision, PurchaseOrderBuilderError> {
let PurchaseOrderVersionRevisionBuilder {
revision_id,
order_xml_v3_4,
submitter,
created_at,
start_commit_num,
end_commit_num,
service_id,
} = self;
if revision_id <= 0 {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"revision_id must be greater than 0".to_string(),
));
};
if order_xml_v3_4.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"order_xml_v3_4".to_string(),
));
};
if submitter.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"submitter".to_string(),
));
};
if start_commit_num >= end_commit_num {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"start_commit_number must be less than end_commit_num".to_string(),
));
};
if end_commit_num <= start_commit_num {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"end_commit_number must be greater than start_commit_num".to_string(),
));
};
Ok(PurchaseOrderVersionRevision {
revision_id,
order_xml_v3_4,
submitter,
created_at,
start_commit_num,
end_commit_num,
service_id,
})
}
}
#[derive(Clone, Debug, Serialize, PartialEq)]
pub struct PurchaseOrderAlternateIdList {
pub data: Vec<PurchaseOrderAlternateId>,
pub paging: Paging,
}
impl PurchaseOrderAlternateIdList {
pub fn new(data: Vec<PurchaseOrderAlternateId>, paging: Paging) -> Self {
Self { data, paging }
}
}
#[derive(Clone, Debug, Serialize, PartialEq)]
pub struct PurchaseOrderAlternateId {
purchase_order_uid: String,
id_type: String,
id: String,
start_commit_num: i64,
end_commit_num: i64,
service_id: Option<String>,
}
impl PurchaseOrderAlternateId {
pub fn purchase_order_uid(&self) -> &str {
&self.purchase_order_uid
}
pub fn id_type(&self) -> &str {
&self.id_type
}
pub fn id(&self) -> &str {
&self.id
}
pub fn start_commit_num(&self) -> &i64 {
&self.start_commit_num
}
pub fn end_commit_num(&self) -> &i64 {
&self.end_commit_num
}
pub fn service_id(&self) -> Option<&str> {
self.service_id.as_deref()
}
}
#[derive(Default, Clone)]
pub struct PurchaseOrderAlternateIdBuilder {
purchase_order_uid: String,
id_type: String,
id: String,
start_commit_num: i64,
end_commit_num: i64,
service_id: Option<String>,
}
impl PurchaseOrderAlternateIdBuilder {
pub fn with_purchase_order_uid(mut self, uid: String) -> Self {
self.purchase_order_uid = uid;
self
}
pub fn with_id_type(mut self, id_type: String) -> Self {
self.id_type = id_type;
self
}
pub fn with_id(mut self, id: String) -> Self {
self.id = id;
self
}
pub fn with_start_commit_number(mut self, start_commit_num: i64) -> Self {
self.start_commit_num = start_commit_num;
self
}
pub fn with_end_commit_number(mut self, end_commit_num: i64) -> Self {
self.end_commit_num = end_commit_num;
self
}
pub fn with_service_id(mut self, service_id: Option<String>) -> Self {
self.service_id = service_id;
self
}
pub fn build(self) -> Result<PurchaseOrderAlternateId, PurchaseOrderBuilderError> {
let PurchaseOrderAlternateIdBuilder {
purchase_order_uid,
id_type,
id,
start_commit_num,
end_commit_num,
service_id,
} = self;
if purchase_order_uid.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"purchase_order_uid".to_string(),
));
};
if id_type.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"id_type".to_string(),
));
};
if id.is_empty() {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"id".to_string(),
));
};
if start_commit_num >= end_commit_num {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"start_commit_number must be less than end_commit_num".to_string(),
));
};
if end_commit_num <= start_commit_num {
return Err(PurchaseOrderBuilderError::MissingRequiredField(
"end_commit_number must be greater than start_commit_num".to_string(),
));
};
Ok(PurchaseOrderAlternateId {
purchase_order_uid,
id_type,
id,
start_commit_num,
end_commit_num,
service_id,
})
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ListPOFilters {
pub buyer_org_id: Option<String>,
pub seller_org_id: Option<String>,
pub has_accepted_version: Option<bool>,
pub is_open: Option<bool>,
pub alternate_ids: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ListVersionFilters {
pub is_accepted: Option<bool>,
pub is_draft: Option<bool>,
}
pub trait PurchaseOrderStore {
fn add_purchase_order(&self, order: PurchaseOrder) -> Result<(), PurchaseOrderStoreError>;
fn list_purchase_orders(
&self,
filters: ListPOFilters,
service_id: Option<&str>,
offset: i64,
limit: i64,
) -> Result<PurchaseOrderList, PurchaseOrderStoreError>;
fn list_purchase_order_versions(
&self,
po_uid: &str,
filters: ListVersionFilters,
service_id: Option<&str>,
offset: i64,
limit: i64,
) -> Result<PurchaseOrderVersionList, PurchaseOrderStoreError>;
fn get_purchase_order(
&self,
purchase_order_uid: &str,
version_id: Option<&str>,
revision_number: Option<i64>,
service_id: Option<&str>,
) -> Result<Option<PurchaseOrder>, PurchaseOrderStoreError>;
fn get_purchase_order_version(
&self,
po_uid: &str,
version_id: &str,
service_id: Option<&str>,
) -> Result<Option<PurchaseOrderVersion>, PurchaseOrderStoreError>;
fn get_purchase_order_revision(
&self,
po_uid: &str,
version_id: &str,
revision_id: &i64,
service_id: Option<&str>,
) -> Result<Option<PurchaseOrderVersionRevision>, PurchaseOrderStoreError>;
fn list_purchase_order_revisions(
&self,
po_uid: &str,
version_id: &str,
service_id: Option<&str>,
offset: i64,
limit: i64,
) -> Result<PurchaseOrderVersionRevisionList, PurchaseOrderStoreError>;
fn list_alternate_ids_for_purchase_order(
&self,
purchase_order_uid: &str,
service_id: Option<&str>,
offset: i64,
limit: i64,
) -> Result<PurchaseOrderAlternateIdList, PurchaseOrderStoreError>;
fn get_latest_revision_id(
&self,
purchase_order_uid: &str,
version_id: &str,
service_id: Option<&str>,
) -> Result<Option<i64>, PurchaseOrderStoreError>;
}
impl<PS> PurchaseOrderStore for Box<PS>
where
PS: PurchaseOrderStore + ?Sized,
{
fn add_purchase_order(&self, order: PurchaseOrder) -> Result<(), PurchaseOrderStoreError> {
(**self).add_purchase_order(order)
}
fn list_purchase_orders(
&self,
filters: ListPOFilters,
service_id: Option<&str>,
offset: i64,
limit: i64,
) -> Result<PurchaseOrderList, PurchaseOrderStoreError> {
(**self).list_purchase_orders(filters, service_id, offset, limit)
}
fn list_purchase_order_versions(
&self,
po_uid: &str,
filters: ListVersionFilters,
service_id: Option<&str>,
offset: i64,
limit: i64,
) -> Result<PurchaseOrderVersionList, PurchaseOrderStoreError> {
(**self).list_purchase_order_versions(po_uid, filters, service_id, offset, limit)
}
fn get_purchase_order(
&self,
purchase_order_uid: &str,
version_id: Option<&str>,
revision_number: Option<i64>,
service_id: Option<&str>,
) -> Result<Option<PurchaseOrder>, PurchaseOrderStoreError> {
(**self).get_purchase_order(purchase_order_uid, version_id, revision_number, service_id)
}
fn get_purchase_order_version(
&self,
po_uid: &str,
version_id: &str,
service_id: Option<&str>,
) -> Result<Option<PurchaseOrderVersion>, PurchaseOrderStoreError> {
(**self).get_purchase_order_version(po_uid, version_id, service_id)
}
fn get_purchase_order_revision(
&self,
po_uid: &str,
version_id: &str,
revision_id: &i64,
service_id: Option<&str>,
) -> Result<Option<PurchaseOrderVersionRevision>, PurchaseOrderStoreError> {
(**self).get_purchase_order_revision(po_uid, version_id, revision_id, service_id)
}
fn list_purchase_order_revisions(
&self,
po_uid: &str,
version_id: &str,
service_id: Option<&str>,
offset: i64,
limit: i64,
) -> Result<PurchaseOrderVersionRevisionList, PurchaseOrderStoreError> {
(**self).list_purchase_order_revisions(po_uid, version_id, service_id, offset, limit)
}
fn list_alternate_ids_for_purchase_order(
&self,
purchase_order_uid: &str,
service_id: Option<&str>,
offset: i64,
limit: i64,
) -> Result<PurchaseOrderAlternateIdList, PurchaseOrderStoreError> {
(**self).list_alternate_ids_for_purchase_order(
purchase_order_uid,
service_id,
offset,
limit,
)
}
fn get_latest_revision_id(
&self,
purchase_order_uid: &str,
version_id: &str,
service_id: Option<&str>,
) -> Result<Option<i64>, PurchaseOrderStoreError> {
(**self).get_latest_revision_id(purchase_order_uid, version_id, service_id)
}
}