diff --git a/src/client.rs b/src/client.rs index ec86295..e9ad1d1 100644 --- a/src/client.rs +++ b/src/client.rs @@ -206,12 +206,15 @@ impl Client { } impl InnerClient { + #[inline] pub(crate) fn object_url(&self, domain_type: DomainType, id: impl Display) -> String { format!("{}/objects/{}/{}", self.url, domain_type, id) } + #[inline] pub(crate) fn collection_url(&self, domain_type: DomainType) -> String { format!("{}/domain-types/{}/collections/all", self.url, domain_type) } + #[inline] pub(crate) fn bulk_action_url(&self, domain_type: DomainType, action: BulkAction) -> String { format!( "{}/domain-types/{}/actions/bulk-{}/invoke", @@ -282,114 +285,231 @@ impl InnerClient { } } - pub(crate) async fn create_domain_object( + pub(crate) async fn create( &self, - body: &E::CreationRequest, - query: &E::CreationQuery, - ) -> Result<()> { + domain_type: DomainType, + object: &O, + query: &Q + ) -> Result<()> + where + O: Serialize, + Q: Serialize + { + let url = self.collection_url(domain_type); let request = self .http - .post(self.collection_url(E::DOMAIN_TYPE)) - .json(body) + .post(url) + .json(object) .query(query) .build() .unwrap(); self.invoke_api(request).await } - pub(crate) async fn read_domain_object( + pub(crate) async fn create_domain_object( &self, + object: &E::CreationRequest, + query: &E::CreationQuery, + ) -> Result<()> { + self.create(E::DOMAIN_TYPE, object, query).await + } + + pub(crate) async fn read( + &self, + domain_type: DomainType, id: impl Display, - query: &E::ReadQuery, - ) -> Result> { + query: &Q, + ) -> Result + where + O: DeserializeOwned, + Q: Serialize + { + let url = self.object_url(domain_type, id); let request = self .http - .get(self.object_url(E::DOMAIN_TYPE, id)) + .get(url) .query(query) .build() .unwrap(); self.query_api(request).await } - pub(crate) async fn update_domain_object( + pub(crate) async fn read_domain_object( &self, id: impl Display, - request: &E::UpdateRequest, - ) -> Result<()> { - let url = self.object_url(E::DOMAIN_TYPE, id); + query: &E::ReadQuery, + ) -> Result> { + self.read(E::DOMAIN_TYPE, id, query).await + } + + pub(crate) async fn update( + &self, + domain_type: DomainType, + id: impl Display, + object: &O, + ) -> Result<()> + where + O: Serialize, + { + let url = self.object_url(domain_type, id); let etag = self.get_etag(&url).await?; + let request = self .http .put(url) - .json(&request) + .json(object) .header(reqwest::header::IF_MATCH, etag) .build() .unwrap(); self.invoke_api(request).await } + pub(crate) async fn update_domain_object( + &self, + id: impl Display, + object: &E::UpdateRequest, + ) -> Result<()> { + self.update(E::DOMAIN_TYPE, id, object).await + } + + pub(crate) async fn delete( + &self, + domain_type: DomainType, + id: impl Display, + query: &Q, + ) -> Result<()> + where + Q: Serialize, + { + let url = self.object_url(domain_type, id); + let request = self + .http + .delete(url) + .query(&query) + .build() + .unwrap(); + + self.invoke_api(request).await + } pub(crate) async fn delete_domain_object( &self, id: impl Display, query: &E::DeleteQuery, ) -> Result<()> { + self.delete(E::DOMAIN_TYPE, id, query).await + } + + pub(crate) async fn bulk_create( + &self, + domain_type: DomainType, + entries: &[O], + query: &Q, + ) -> Result<()> + where + O: Serialize, + Q: Serialize, + { + #[derive(Serialize)] + struct Request<'a, E: Serialize> { + entries: &'a [E], + } + let url = self.bulk_action_url(domain_type, BulkAction::Create); + let body = Request:: { entries }; + let request = self .http - .delete(self.object_url(E::DOMAIN_TYPE, id)) - .query(&query) + .post(url) + .json(&body) + .query(query) .build() .unwrap(); self.invoke_api(request).await } - pub(crate) async fn bulk_create_domain_objects( &self, entries: &[E::CreationRequest], query: &E::CreationQuery, ) -> Result<()> { - #[derive(Serialize)] - struct Request<'a, D: BulkCreateDomainExtension> { - entries: &'a [D::CreationRequest], - } + self.bulk_create(E::DOMAIN_TYPE, entries, query).await + } - let request = self - .http - .post(self.bulk_action_url(E::DOMAIN_TYPE, BulkAction::Create)) - .json(&Request:: { entries }) + pub(crate) async fn bulk_read( + &self, + domain_type: DomainType, + query: &Q + ) -> Result>> + where + O: DeserializeOwned, + Q: Serialize + { + let url = self.collection_url(domain_type); + let request = self.http + .get(url) .query(query) .build() .unwrap(); - self.invoke_api(request).await + let response: DomainCollection = self.query_api(request).await?; + Ok(response.value) + } pub(crate) async fn bulk_read_domain_objects( &self, query: &E::BulkReadQuery, ) -> Result>> { + self.bulk_read(E::DOMAIN_TYPE, query).await + } + + pub(crate) async fn bulk_update( + &self, + domain_type: DomainType, + entries: &[O], + ) -> Result<()> + where + O: Serialize, + { + #[derive(Serialize)] + struct Request<'a, E: Serialize> { + entries: &'a [E], + } + + let url = self.bulk_action_url(domain_type, BulkAction::Update); + let body = Request:: { entries }; + let request = self .http - .get(self.collection_url(E::DOMAIN_TYPE)) - .query(query) + .put(url) + .json(&body) .build() .unwrap(); - let response: DomainCollection = self.query_api(request).await?; - Ok(response.value) + self.invoke_api(request).await } pub(crate) async fn bulk_update_domain_objects( &self, entries: &[E::BulkUpdateRequest], + ) -> Result<()> { + self.bulk_update(E::DOMAIN_TYPE, entries).await + } + + pub(crate) async fn bulk_delete( + &self, + domain_type: DomainType, + entries: &[String] ) -> Result<()> { #[derive(Serialize)] - struct Request<'a, D: BulkUpdateDomainExtension> { - entries: &'a [D::BulkUpdateRequest], + struct Request<'a> { + entries: &'a [String], } + let url = self.bulk_action_url(domain_type, BulkAction::Delete); + let body = Request { entries }; + let request = self .http - .put(self.bulk_action_url(E::DOMAIN_TYPE, BulkAction::Update)) - .json(&Request:: { entries }) + .post(url) + .json(&body) .build() .unwrap(); @@ -399,19 +519,7 @@ impl InnerClient { &self, entries: &[String], ) -> Result<()> { - #[derive(Serialize)] - struct Request<'a> { - entries: &'a [String], - } - - let request = self - .http - .post(self.bulk_action_url(E::DOMAIN_TYPE, BulkAction::Delete)) - .json(&Request { entries }) - .build() - .unwrap(); - - self.invoke_api(request).await + self.bulk_delete(E::DOMAIN_TYPE, entries).await } }