use crate::{services::kv_store::KVStore, util::serde_ext::parse_from_bytes}; use backend_service::errors::ServerError; use bytes::Bytes; use lib_ot::protobuf::{RepeatedRevision, Revision}; use protobuf::Message; use std::sync::Arc; pub struct DocumentKVPersistence { inner: Arc, } impl std::ops::Deref for DocumentKVPersistence { type Target = Arc; fn deref(&self) -> &Self::Target { &self.inner } } impl std::ops::DerefMut for DocumentKVPersistence { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } } impl DocumentKVPersistence { pub(crate) fn new(kv_store: Arc) -> Self { DocumentKVPersistence { inner: kv_store } } pub(crate) async fn set_revision(&self, revision: Revision) -> Result<(), ServerError> { let key = revision.rev_id.to_string(); let bytes = revision.write_to_bytes()?; let _ = self.inner.set(&key, Bytes::from(bytes)).await?; Ok(()) } pub(crate) async fn batch_get_revisions(&self, rev_ids: Vec) -> Result { let keys = rev_ids .into_iter() .map(|rev_id| rev_id.to_string()) .collect::>(); let items = self.inner.batch_get(keys).await?; let revisions = items .into_iter() .filter_map(|kv| parse_from_bytes::(&kv.value).ok()) .collect::>(); let mut repeated_revision = RepeatedRevision::new(); repeated_revision.set_items(revisions.into()); Ok(repeated_revision) } }