diff --git a/src/services/core/tx.rs b/src/services/core/tx.rs index 709aae2..5be276a 100644 --- a/src/services/core/tx.rs +++ b/src/services/core/tx.rs @@ -1,6 +1,6 @@ use super::classes::OperationDomain; use crate::services::core::classes::Ref; -use crate::services::event::{Class, Event, HasId, QueryClass}; +use crate::services::event::{Class, Event, HasId}; use crate::services::transactor::tx::Doc; use derive_builder::Builder; use serde::{Deserialize, Deserializer, Serialize}; @@ -85,12 +85,9 @@ impl HasId for TxWorkspaceEvent { } } -impl Event for TxWorkspaceEvent { +impl Event for TxWorkspaceEvent { fn matches(value: &Value) -> bool { - if value.get("_class").and_then(|v| v.as_str()) != Some(Self::CLASS) { - return false; - } - value.get("objectClass").and_then(|v| v.as_str()) == Some(T::CLASS) + value.get("_class").and_then(|v| v.as_str()) == Some(Self::CLASS) } } @@ -107,12 +104,9 @@ impl Class for TxDomainEvent { const CLASS: &'static str = crate::services::core::class::TxDomainEvent; } -impl Event for TxDomainEvent { +impl Event for TxDomainEvent { fn matches(value: &Value) -> bool { - if value.get("_class").and_then(|v| v.as_str()) != Some(Self::CLASS) { - return false; - } - value.get("objectClass").and_then(|v| v.as_str()) == Some(T::CLASS) + value.get("_class").and_then(|v| v.as_str()) == Some(Self::CLASS) } } @@ -224,36 +218,29 @@ impl Event for TxUpdateDoc { #[derive(Clone, Debug, Serialize, Deserialize, Builder)] #[serde(rename_all = "camelCase")] -pub struct TxRemoveDoc { +pub struct TxRemoveDoc { #[serde(flatten)] pub txcud: TxCUD, - - #[serde(skip)] - #[builder(setter(skip), default)] - pub(crate) _phantom: PhantomData, } -impl TxRemoveDoc { - pub fn builder() -> TxRemoveDocBuilder { +impl TxRemoveDoc { + pub fn builder() -> TxRemoveDocBuilder { TxRemoveDocBuilder::default() } } -impl Class for TxRemoveDoc { +impl Class for TxRemoveDoc { const CLASS: &'static str = crate::services::core::class::TxRemoveDoc; } -impl HasId for TxRemoveDoc { +impl HasId for TxRemoveDoc { fn id(&self) -> &str { &self.txcud.object_id } } -impl Event for TxRemoveDoc { +impl Event for TxRemoveDoc { fn matches(value: &Value) -> bool { - if value.get("_class").and_then(|v| v.as_str()) != Some(Self::CLASS) { - return false; - } - value.get("objectClass").and_then(|v| v.as_str()) == Some(C::CLASS) + value.get("_class").and_then(|v| v.as_str()) == Some(Self::CLASS) } } diff --git a/src/services/transactor/backend/http.rs b/src/services/transactor/backend/http.rs index ca27a9b..8363348 100644 --- a/src/services/transactor/backend/http.rs +++ b/src/services/transactor/backend/http.rs @@ -50,15 +50,16 @@ impl HttpBackend { params: impl IntoIterator, ) -> Result { let mut url = self.base().join(path)?; - let mut qp = url.query_pairs_mut(); - for (name, value) in params { - if let Value::String(string) = &value { - qp.append_pair(&name, string); - } else { - qp.append_pair(&name, &value.to_string()); + { + let mut qp = url.query_pairs_mut(); + for (name, value) in params { + if let Value::String(string) = &value { + qp.append_pair(&name, string); + } else { + qp.append_pair(&name, &value.to_string()); + } } } - drop(qp); ::get(&self.inner.client, self, url).await } diff --git a/src/services/transactor/comm/message.rs b/src/services/transactor/comm/message.rs index ef74314..cb16fa6 100644 --- a/src/services/transactor/comm/message.rs +++ b/src/services/transactor/comm/message.rs @@ -49,7 +49,7 @@ pub type MessageExtra = HashMap; #[serde(rename_all = "lowercase")] pub enum MessageType { #[default] - Message, + Text, Activity, } diff --git a/src/services/transactor/document.rs b/src/services/transactor/document.rs index 3ab6c64..f955976 100644 --- a/src/services/transactor/document.rs +++ b/src/services/transactor/document.rs @@ -17,7 +17,6 @@ use derive_builder::Builder; use serde::{Deserialize, Serialize, de::DeserializeOwned}; use serde_json::{self as json, Value}; use std::collections::HashMap; -use std::marker::PhantomData; use std::sync::LazyLock; use std::sync::atomic::AtomicUsize; @@ -30,7 +29,6 @@ use crate::services::core::classes::{Ref, Timestamp}; use crate::services::core::ser::Data; use crate::services::core::tx::{Tx, TxCUD, TxCreateDoc, TxRemoveDoc}; use crate::services::core::{Account, FindResult, PersonId}; -use crate::services::event::Class; use crate::services::transactor::backend::Backend; use crate::services::transactor::methods::Method; use crate::{Error, Result}; @@ -55,10 +53,13 @@ pub(crate) fn generate_object_id() -> Ref { } #[derive(Default, Debug, derive_builder::Builder, Clone)] -pub struct CreateDocument { +pub struct CreateDocument { #[builder(setter(into), default = generate_object_id())] object_id: Ref, + #[builder(setter(into))] + object_class: String, + #[builder(setter(into), default = Utc::now())] modified_on: Timestamp, @@ -77,13 +78,13 @@ pub struct CreateDocument { attributes: C, } -impl CreateDocument { +impl CreateDocument { pub fn builder() -> CreateDocumentBuilder { CreateDocumentBuilder::default() } } -impl Transaction for CreateDocument { +impl Transaction for CreateDocument { fn to_value(self) -> Result { let doc = TxCreateDoc { txcud: TxCUD { @@ -103,7 +104,7 @@ impl Transaction for CreateDocument { object_space: self.object_space, }, object_id: self.object_id, - object_class: C::CLASS.into(), + object_class: self.object_class, attached_to: None, attached_to_class: None, collection: None, @@ -117,10 +118,13 @@ impl Transaction for CreateDocument { } #[derive(Default, Debug, derive_builder::Builder, Clone, Serialize, Deserialize)] -pub struct RemoveDocument { +pub struct RemoveDocument { #[builder(setter(into))] object_id: Ref, + #[builder(setter(into))] + object_class: String, + #[builder(setter(into), default)] modified_on: Option, @@ -135,21 +139,17 @@ pub struct RemoveDocument { #[builder(setter(into))] object_space: String, - - #[serde(skip)] - #[builder(setter(skip), default)] - _phantom: PhantomData, } -impl RemoveDocument { - pub fn builder() -> RemoveDocumentBuilder { +impl RemoveDocument { + pub fn builder() -> RemoveDocumentBuilder { RemoveDocumentBuilder::default() } } -impl Transaction for RemoveDocument { +impl Transaction for RemoveDocument { fn to_value(self) -> Result { - let doc = TxRemoveDoc:: { + let doc = TxRemoveDoc { txcud: TxCUD { tx: Tx { doc: Doc { @@ -167,12 +167,11 @@ impl Transaction for RemoveDocument { object_space: self.object_space, }, object_id: self.object_id, - object_class: C::CLASS.into(), + object_class: self.object_class, attached_to: None, attached_to_class: None, collection: None, }, - _phantom: Default::default(), }; Ok(json::to_value(&doc)?) @@ -319,14 +318,16 @@ impl FindOptionsBuilder { pub trait DocumentClient { fn get_account(&self) -> impl Future>; - fn find_all( + fn find_all( &self, + class: &str, query: Q, options: &FindOptions, ) -> impl Future>>; - fn find_one( + fn find_one( &self, + class: &str, query: Q, options: &FindOptions, ) -> impl Future>>; @@ -337,8 +338,9 @@ impl DocumentClient for super::TransactorClient { self.get(Method::Account, []).await } - async fn find_all( + async fn find_all( &self, + class: &str, query: Q, options: &FindOptions, ) -> Result> { @@ -354,7 +356,7 @@ impl DocumentClient for super::TransactorClient { .get( Method::FindAll, [ - (String::from("class"), C::CLASS.into()), + (String::from("class"), class.into()), (String::from("query"), json::to_value(query)?), (String::from("options"), json::to_value(options)?), ], @@ -387,7 +389,7 @@ impl DocumentClient for super::TransactorClient { for entry in result.value.iter_mut() { let object = entry.as_object_mut().unwrap(); if !object.contains_key("_class") { - object.insert("_class".into(), Value::String(C::CLASS.into())); + object.insert("_class".into(), Value::String(class.into())); } for (k, v) in query.iter() { @@ -427,13 +429,15 @@ impl DocumentClient for super::TransactorClient { Ok(result) } - async fn find_one( + async fn find_one( &self, + class: &str, query: Q, options: &FindOptions, ) -> Result> { Ok(self - .find_all::( + .find_all::<_, C>( + class, query, &FindOptions { limit: Some(1), diff --git a/src/services/transactor/mod.rs b/src/services/transactor/mod.rs index a6d5c4c..4316951 100644 --- a/src/services/transactor/mod.rs +++ b/src/services/transactor/mod.rs @@ -121,7 +121,8 @@ impl TransactorClient { } pub async fn remove(&self, doc: &T) -> Result<()> { - let tx = RemoveDocument::::builder() + let tx = RemoveDocument::builder() + .object_class(&doc.doc().obj.class) .object_id(doc.id()) .object_space(&doc.doc().space) .build() diff --git a/src/services/transactor/subscription.rs b/src/services/transactor/subscription.rs index 6840051..c4c20df 100644 --- a/src/services/transactor/subscription.rs +++ b/src/services/transactor/subscription.rs @@ -37,7 +37,7 @@ impl SubscribedQuery { pub enum TxEvent { Created(Box>), Updated(Box>), - Deleted(Box>), + Deleted(Box), } impl TxEvent> { @@ -53,10 +53,7 @@ impl TxEvent> { retrieve: tx.retrieve, _phantom: Default::default(), })), - TxEvent::Deleted(tx) => TxEvent::Deleted(Box::new(TxRemoveDoc { - txcud: tx.txcud, - _phantom: Default::default(), - })), + TxEvent::Deleted(tx) => TxEvent::Deleted(Box::new(TxRemoveDoc { txcud: tx.txcud })), } } } @@ -74,8 +71,10 @@ impl Stream for Subscribed } else if TxUpdateDoc::::matches(&value) { let tx: TxUpdateDoc = serde_json::from_value(value)?; return Poll::Ready(Some(Ok(TxEvent::Updated(Box::new(tx))))); - } else if TxRemoveDoc::::matches(&value) { - let tx: TxRemoveDoc = serde_json::from_value(value)?; + } else if TxRemoveDoc::matches(&value) + && value.get("objectClass").and_then(|v| v.as_str()) == Some(C::CLASS) + { + let tx: TxRemoveDoc = serde_json::from_value(value)?; return Poll::Ready(Some(Ok(TxEvent::Deleted(Box::new(tx))))); } @@ -120,7 +119,9 @@ pub(super) fn live_query< ) -> impl Stream>> + Send { let client_clone = client.clone(); let initial_fetch = async move { - let results = client_clone.find_all::(query, &options).await?; + let results = client_clone + .find_all::(C::CLASS, query, &options) + .await?; Ok(LiveQueryEvent::Initial(results.value)) };