1use crate::base_guardian::{GuardianDB as BaseGuardianDB, NewGuardianDBOptions};
2use crate::error::{GuardianError, Result};
3use crate::ipfs_core_api::client::IpfsClient;
4use crate::traits::{
5 AsyncDocumentFilter, BaseGuardianDB as BaseGuardianDBTrait, CreateDBOptions, Document,
6 DocumentStore, EventLogStore, GuardianDBKVStoreProvider, KeyValueStore, ProgressCallback,
7 Store,
8};
9use parking_lot::RwLock;
10use std::sync::Arc;
11pub struct GuardianDB {
12 base: BaseGuardianDB,
13}
14
15impl GuardianDB {
16 pub async fn new(ipfs: IpfsClient, options: Option<NewGuardianDBOptions>) -> Result<Self> {
18 use crate::ipfs_log::identity::{Identity, Signatures};
20
21 let signatures = Signatures::new("temp_sig", "temp_pub_sig");
23 let identity = Identity::new("temp_id", "temp_pubkey", signatures);
24
25 let base = BaseGuardianDB::new_guardian_db(ipfs, identity, options).await?;
26 Ok(GuardianDB { base })
27 }
28
29 pub async fn log(
31 &self,
32 address: &str,
33 options: Option<CreateDBOptions>,
34 ) -> Result<Arc<dyn EventLogStore<Error = GuardianError>>> {
35 let mut opts = options.unwrap_or_default();
36 opts.create = Some(true);
37 opts.store_type = Some("eventlog".to_string());
38
39 let store = self.base.open(address, opts).await?;
40
41 if store.store_type() == "eventlog" {
43 Ok(Arc::new(EventLogStoreWrapper::new(store)))
45 } else {
46 Err(GuardianError::Store(format!(
47 "Tipo de store incorreto. Esperado: eventlog, encontrado: {}",
48 store.store_type()
49 )))
50 }
51 }
52
53 pub async fn key_value(
55 &self,
56 address: &str,
57 options: Option<CreateDBOptions>,
58 ) -> Result<Arc<dyn KeyValueStore<Error = GuardianError>>> {
59 let mut opts = options.unwrap_or_default();
60 opts.create = Some(true);
61 opts.store_type = Some("keyvalue".to_string());
62
63 let store = self.base.open(address, opts).await?;
64
65 if store.store_type() == "keyvalue" {
67 Ok(Arc::new(KeyValueStoreWrapper::new(store)))
68 } else {
69 Err(GuardianError::Store(format!(
70 "Tipo de store incorreto. Esperado: keyvalue, encontrado: {}",
71 store.store_type()
72 )))
73 }
74 }
75
76 pub async fn docs(
78 &self,
79 address: &str,
80 options: Option<CreateDBOptions>,
81 ) -> Result<Arc<dyn DocumentStore<Error = GuardianError>>> {
82 let mut opts = options.unwrap_or_default();
83 opts.create = Some(true);
84 opts.store_type = Some("docstore".to_string());
85
86 let store = self.base.open(address, opts).await?;
87
88 if store.store_type() == "docstore" {
90 Ok(Arc::new(DocumentStoreWrapper::new(store)))
92 } else {
93 Err(GuardianError::Store(format!(
94 "Tipo de store incorreto. Esperado: docstore, encontrado: {}",
95 store.store_type()
96 )))
97 }
98 }
99
100 pub fn base(&self) -> &BaseGuardianDB {
102 &self.base
103 }
104}
105
106struct EventLogStoreWrapper {
112 store: Arc<dyn Store<Error = GuardianError> + Send + Sync>,
113}
114
115impl EventLogStoreWrapper {
116 fn new(store: Arc<dyn Store<Error = GuardianError> + Send + Sync>) -> Self {
117 Self { store }
118 }
119
120 fn query_from_index(
122 &self,
123 options: &crate::traits::StreamOptions,
124 ) -> Result<Vec<crate::ipfs_log::entry::Entry>> {
125 let index = self.store.index();
126
127 let is_simple_amount_query = options.gt.is_none()
129 && options.gte.is_none()
130 && options.lt.is_none()
131 && options.lte.is_none();
132
133 if is_simple_amount_query {
134 let amount = match options.amount {
135 Some(a) if a > 0 => a as usize,
136 Some(-1) | None => {
137 match index.len() {
139 Ok(len) => len,
140 Err(_) => return self.query_from_oplog(options), }
142 }
143 _ => 0,
144 };
145
146 if let Some(entries) = index.get_last_entries(amount) {
148 return Ok(entries);
149 }
150 }
151
152 if let Some(cid) = options.gte.as_ref()
154 && options.amount == Some(1)
155 && options.gt.is_none()
156 && options.lt.is_none()
157 && options.lte.is_none()
158 {
159 if let Some(entry) = index.get_entry_by_cid(cid) {
160 return Ok(vec![entry]);
161 } else {
162 return Ok(Vec::new()); }
164 }
165
166 self.query_from_oplog(options)
168 }
169
170 fn query_from_oplog(
172 &self,
173 options: &crate::traits::StreamOptions,
174 ) -> Result<Vec<crate::ipfs_log::entry::Entry>> {
175 let oplog = self.store.op_log();
176 let oplog_guard = oplog.read();
177
178 let mut all_entries: Vec<_> = oplog_guard
180 .values()
181 .iter()
182 .map(|arc_entry| arc_entry.as_ref().clone())
183 .collect();
184
185 all_entries.sort_by_key(|b| std::cmp::Reverse(b.clock().time()));
187
188 let mut filtered_entries = all_entries;
190
191 if let Some(cid) = &options.gte {
193 let cid_str = cid.to_string();
194 if let Some(start_idx) = filtered_entries.iter().position(|e| e.hash() == cid_str) {
195 filtered_entries = filtered_entries.into_iter().skip(start_idx).collect();
196 } else {
197 return Ok(Vec::new()); }
199 }
200
201 if let Some(cid) = &options.gt {
203 let cid_str = cid.to_string();
204 if let Some(start_idx) = filtered_entries.iter().position(|e| e.hash() == cid_str) {
205 filtered_entries = filtered_entries.into_iter().skip(start_idx + 1).collect();
206 } else {
207 return Ok(Vec::new()); }
209 }
210
211 if let Some(cid) = &options.lte {
213 let cid_str = cid.to_string();
214 if let Some(end_idx) = filtered_entries.iter().position(|e| e.hash() == cid_str) {
215 filtered_entries = filtered_entries.into_iter().take(end_idx + 1).collect();
216 } else {
217 return Ok(Vec::new()); }
219 }
220
221 if let Some(cid) = &options.lt {
223 let cid_str = cid.to_string();
224 if let Some(end_idx) = filtered_entries.iter().position(|e| e.hash() == cid_str) {
225 filtered_entries = filtered_entries.into_iter().take(end_idx).collect();
226 } else {
227 return Ok(Vec::new()); }
229 }
230
231 let amount = match options.amount {
233 Some(a) if a > 0 => a as usize,
234 Some(-1) | None => filtered_entries.len(), _ => 0,
236 };
237
238 filtered_entries.truncate(amount);
239 Ok(filtered_entries)
240 }
241}
242
243#[async_trait::async_trait]
244impl Store for EventLogStoreWrapper {
245 type Error = GuardianError;
246
247 #[allow(deprecated)]
248 fn events(&self) -> &dyn crate::events::EmitterInterface {
249 self.store.events()
250 }
251
252 async fn close(&self) -> std::result::Result<(), Self::Error> {
253 self.store.close().await
254 }
255
256 fn address(&self) -> &dyn crate::address::Address {
257 self.store.address()
258 }
259
260 fn index(&self) -> Box<dyn crate::traits::StoreIndex<Error = GuardianError> + Send + Sync> {
261 self.store.index()
262 }
263
264 fn store_type(&self) -> &str {
265 self.store.store_type()
266 }
267
268 fn replication_status(&self) -> crate::stores::replicator::replication_info::ReplicationInfo {
269 self.store.replication_status()
270 }
271
272 fn replicator(&self) -> Option<Arc<crate::stores::replicator::replicator::Replicator>> {
273 self.store.replicator()
274 }
275
276 fn cache(&self) -> Arc<dyn crate::data_store::Datastore> {
277 self.store.cache()
278 }
279
280 async fn drop(&mut self) -> std::result::Result<(), Self::Error> {
281 if let Some(_base_store) =
283 self.store
284 .as_any()
285 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
286 {
287 Ok(())
290 } else {
291 Err(GuardianError::Store(
292 "Não foi possível fazer downcast para BaseStore".to_string(),
293 ))
294 }
295 }
296
297 async fn load(&mut self, amount: usize) -> std::result::Result<(), Self::Error> {
298 if let Some(base_store) =
300 self.store
301 .as_any()
302 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
303 {
304 base_store.load(Some(amount as isize)).await
305 } else {
306 Err(GuardianError::Store(
307 "Não foi possível fazer downcast para BaseStore".to_string(),
308 ))
309 }
310 }
311
312 async fn sync(
313 &mut self,
314 heads: Vec<crate::ipfs_log::entry::Entry>,
315 ) -> std::result::Result<(), Self::Error> {
316 if let Some(base_store) =
318 self.store
319 .as_any()
320 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
321 {
322 base_store.sync(heads).await
323 } else {
324 Err(GuardianError::Store(
325 "Não foi possível fazer downcast para BaseStore".to_string(),
326 ))
327 }
328 }
329
330 async fn load_more_from(&mut self, _amount: u64, entries: Vec<crate::ipfs_log::entry::Entry>) {
331 if let Some(base_store) =
333 self.store
334 .as_any()
335 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
336 {
337 let _ = base_store.load_more_from(entries);
339 } else {
340 eprintln!("Aviso: Não foi possível fazer downcast para BaseStore em load_more_from");
342 }
343 }
344
345 async fn load_from_snapshot(&mut self) -> std::result::Result<(), Self::Error> {
346 if let Some(base_store) =
348 self.store
349 .as_any()
350 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
351 {
352 base_store.load_from_snapshot().await
353 } else {
354 Err(GuardianError::Store(
355 "Não foi possível fazer downcast para BaseStore".to_string(),
356 ))
357 }
358 }
359
360 fn op_log(&self) -> Arc<RwLock<crate::ipfs_log::log::Log>> {
361 self.store.op_log()
362 }
363
364 fn ipfs(&self) -> Arc<IpfsClient> {
365 unimplemented!("Adaptação entre tipos de cliente IPFS pendente")
366 }
367
368 fn db_name(&self) -> &str {
369 self.store.db_name()
370 }
371
372 fn identity(&self) -> &crate::ipfs_log::identity::Identity {
373 self.store.identity()
374 }
375
376 fn access_controller(&self) -> &dyn crate::access_controller::traits::AccessController {
377 self.store.access_controller()
378 }
379
380 async fn add_operation(
381 &mut self,
382 op: crate::stores::operation::operation::Operation,
383 on_progress_callback: Option<ProgressCallback>,
384 ) -> std::result::Result<crate::ipfs_log::entry::Entry, Self::Error> {
385 if let Some(base_store) =
388 self.store
389 .as_any()
390 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
391 {
392 base_store.add_operation(op, on_progress_callback).await
393 } else {
394 Err(GuardianError::Store(
395 "Não foi possível fazer downcast para BaseStore".to_string(),
396 ))
397 }
398 }
399
400 fn span(&self) -> Arc<tracing::Span> {
401 self.store.span()
402 }
403
404 fn tracer(&self) -> Arc<crate::traits::TracerWrapper> {
405 self.store.tracer()
406 }
407
408 fn event_bus(&self) -> Arc<crate::p2p::events::EventBus> {
409 self.store.event_bus()
410 }
411
412 fn as_any(&self) -> &dyn std::any::Any {
413 self
414 }
415}
416
417#[async_trait::async_trait]
418impl EventLogStore for EventLogStoreWrapper {
419 async fn add(
420 &mut self,
421 data: Vec<u8>,
422 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
423 let operation = crate::stores::operation::operation::Operation::new(
425 None,
426 "ADD".to_string(),
427 Some(data),
428 );
429
430 let _entry = self.add_operation(operation.clone(), None).await?;
431
432 Ok(operation)
436 }
437
438 async fn get(
439 &self,
440 cid: cid::Cid,
441 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
442 if let Some(entry) = self.store.index().get_entry_by_cid(&cid) {
446 let operation = crate::stores::operation::operation::parse_operation(entry)
448 .map_err(|e| GuardianError::Store(format!("Falha ao parsear entrada: {}", e)))?;
449 return Ok(operation);
450 }
451
452 let oplog = self.store.op_log();
454 let oplog_guard = oplog.read();
455
456 let cid_str = cid.to_string();
458 for arc_entry in oplog_guard.values() {
459 if arc_entry.hash() == cid_str {
460 let entry = arc_entry.as_ref().clone();
462 let operation = crate::stores::operation::operation::parse_operation(entry)
463 .map_err(|e| {
464 GuardianError::Store(format!("Falha ao parsear entrada: {}", e))
465 })?;
466 return Ok(operation);
467 }
468 }
469
470 Err(GuardianError::Store(format!(
472 "Operação não encontrada para CID: {}",
473 cid
474 )))
475 }
476
477 async fn list(
478 &self,
479 options: Option<crate::traits::StreamOptions>,
480 ) -> std::result::Result<Vec<crate::stores::operation::operation::Operation>, Self::Error> {
481 let options = options.unwrap_or_default();
483
484 let entries = if self.store.index().supports_entry_queries() {
486 self.query_from_index(&options)?
488 } else {
489 self.query_from_oplog(&options)?
491 };
492
493 let mut operations = Vec::with_capacity(entries.len());
495 for entry in entries {
496 match crate::stores::operation::operation::parse_operation(entry) {
497 Ok(operation) => operations.push(operation),
498 Err(e) => {
499 eprintln!("Aviso: Falha ao parsear entrada: {}", e);
501 }
502 }
503 }
504
505 Ok(operations)
506 }
507}
508
509struct KeyValueStoreWrapper {
511 store: Arc<dyn Store<Error = GuardianError> + Send + Sync>,
512}
513
514impl KeyValueStoreWrapper {
515 fn new(store: Arc<dyn Store<Error = GuardianError> + Send + Sync>) -> Self {
516 Self { store }
517 }
518}
519
520#[async_trait::async_trait]
521impl Store for KeyValueStoreWrapper {
522 type Error = GuardianError;
523
524 #[allow(deprecated)]
525 fn events(&self) -> &dyn crate::events::EmitterInterface {
526 self.store.events()
527 }
528
529 async fn close(&self) -> std::result::Result<(), Self::Error> {
530 self.store.close().await
531 }
532
533 fn address(&self) -> &dyn crate::address::Address {
534 self.store.address()
535 }
536
537 fn index(&self) -> Box<dyn crate::traits::StoreIndex<Error = GuardianError> + Send + Sync> {
538 self.store.index()
539 }
540
541 fn store_type(&self) -> &str {
542 self.store.store_type()
543 }
544
545 fn replication_status(&self) -> crate::stores::replicator::replication_info::ReplicationInfo {
546 self.store.replication_status()
547 }
548
549 fn replicator(&self) -> Option<Arc<crate::stores::replicator::replicator::Replicator>> {
550 self.store.replicator()
551 }
552
553 fn cache(&self) -> Arc<dyn crate::data_store::Datastore> {
554 self.store.cache()
555 }
556
557 async fn drop(&mut self) -> std::result::Result<(), Self::Error> {
558 if let Some(_base_store) =
560 self.store
561 .as_any()
562 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
563 {
564 Ok(())
567 } else {
568 Err(GuardianError::Store(
569 "Não foi possível fazer downcast para BaseStore".to_string(),
570 ))
571 }
572 }
573
574 async fn load(&mut self, amount: usize) -> std::result::Result<(), Self::Error> {
575 if let Some(base_store) =
577 self.store
578 .as_any()
579 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
580 {
581 base_store.load(Some(amount as isize)).await
582 } else {
583 Err(GuardianError::Store(
584 "Não foi possível fazer downcast para BaseStore".to_string(),
585 ))
586 }
587 }
588
589 async fn sync(
590 &mut self,
591 heads: Vec<crate::ipfs_log::entry::Entry>,
592 ) -> std::result::Result<(), Self::Error> {
593 if let Some(base_store) =
595 self.store
596 .as_any()
597 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
598 {
599 base_store.sync(heads).await
600 } else {
601 Err(GuardianError::Store(
602 "Não foi possível fazer downcast para BaseStore".to_string(),
603 ))
604 }
605 }
606
607 async fn load_more_from(&mut self, _amount: u64, entries: Vec<crate::ipfs_log::entry::Entry>) {
608 if let Some(base_store) =
610 self.store
611 .as_any()
612 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
613 {
614 let _ = base_store.load_more_from(entries);
616 } else {
617 eprintln!("Aviso: Não foi possível fazer downcast para BaseStore em load_more_from");
619 }
620 }
621
622 async fn load_from_snapshot(&mut self) -> std::result::Result<(), Self::Error> {
623 if let Some(base_store) =
625 self.store
626 .as_any()
627 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
628 {
629 base_store.load_from_snapshot().await
630 } else {
631 Err(GuardianError::Store(
632 "Não foi possível fazer downcast para BaseStore".to_string(),
633 ))
634 }
635 }
636
637 fn op_log(&self) -> Arc<RwLock<crate::ipfs_log::log::Log>> {
638 self.store.op_log()
639 }
640
641 fn ipfs(&self) -> Arc<IpfsClient> {
642 unimplemented!("Adaptação entre tipos de cliente IPFS pendente")
643 }
644
645 fn db_name(&self) -> &str {
646 self.store.db_name()
647 }
648
649 fn identity(&self) -> &crate::ipfs_log::identity::Identity {
650 self.store.identity()
651 }
652
653 fn access_controller(&self) -> &dyn crate::access_controller::traits::AccessController {
654 self.store.access_controller()
655 }
656
657 async fn add_operation(
658 &mut self,
659 op: crate::stores::operation::operation::Operation,
660 on_progress_callback: Option<ProgressCallback>,
661 ) -> std::result::Result<crate::ipfs_log::entry::Entry, Self::Error> {
662 if let Some(base_store) =
664 self.store
665 .as_any()
666 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
667 {
668 base_store.add_operation(op, on_progress_callback).await
669 } else {
670 Err(GuardianError::Store(
671 "Não foi possível fazer downcast para BaseStore".to_string(),
672 ))
673 }
674 }
675
676 fn span(&self) -> Arc<tracing::Span> {
677 self.store.span()
678 }
679
680 fn tracer(&self) -> Arc<crate::traits::TracerWrapper> {
681 self.store.tracer()
682 }
683
684 fn event_bus(&self) -> Arc<crate::p2p::events::EventBus> {
685 self.store.event_bus()
686 }
687
688 fn as_any(&self) -> &dyn std::any::Any {
689 self
690 }
691}
692
693#[async_trait::async_trait]
694impl KeyValueStore for KeyValueStoreWrapper {
695 async fn get(&self, key: &str) -> std::result::Result<Option<Vec<u8>>, Self::Error> {
696 let index = self.store.index();
700 if let Ok(Some(bytes)) = index.get_bytes(key) {
701 return Ok(Some(bytes));
702 }
703
704 let oplog = self.store.op_log();
706 let oplog_guard = oplog.read();
707
708 let mut latest_value: Option<Vec<u8>> = None;
710 let mut latest_time = 0;
711
712 for arc_entry in oplog_guard.values() {
713 let entry = arc_entry.as_ref().clone();
714
715 if let Ok(operation) =
717 crate::stores::operation::operation::parse_operation(entry.clone())
718 {
719 if let Some(op_key) = operation.key()
721 && op_key == key
722 {
723 let entry_time = entry.clock().time();
724
725 let op_str = operation.op();
726 if op_str == "PUT" {
727 if entry_time > latest_time {
729 latest_time = entry_time;
730 latest_value = Some(operation.value().to_vec());
731 }
732 } else if op_str == "DEL" {
733 if entry_time > latest_time {
735 latest_time = entry_time;
736 latest_value = None; }
738 }
739 }
740 }
741 }
742
743 Ok(latest_value)
744 }
745
746 async fn put(
747 &mut self,
748 key: &str,
749 value: Vec<u8>,
750 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
751 let operation = crate::stores::operation::operation::Operation::new(
753 Some(key.to_string()),
754 "PUT".to_string(),
755 Some(value),
756 );
757
758 self.add_operation(operation.clone(), None).await?;
759 Ok(operation)
760 }
761
762 async fn delete(
763 &mut self,
764 key: &str,
765 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
766 let operation = crate::stores::operation::operation::Operation::new(
768 Some(key.to_string()),
769 "DEL".to_string(),
770 None,
771 );
772
773 self.add_operation(operation.clone(), None).await?;
774 Ok(operation)
775 }
776
777 fn all(&self) -> std::collections::HashMap<String, Vec<u8>> {
778 let mut result = std::collections::HashMap::new();
779
780 let index = self.store.index();
782 if let Ok(keys) = index.keys() {
783 for key in keys {
784 if let Ok(Some(bytes)) = index.get_bytes(&key) {
785 result.insert(key, bytes);
786 }
787 }
788 }
789
790 if result.is_empty() {
793 let oplog = self.store.op_log();
794 let oplog_guard = oplog.read();
795
796 let mut key_operations: std::collections::HashMap<
798 String,
799 (u64, String, Option<Vec<u8>>),
800 > = std::collections::HashMap::new();
801
802 for arc_entry in oplog_guard.values() {
804 let entry = arc_entry.as_ref().clone();
805
806 if let Ok(operation) =
808 crate::stores::operation::operation::parse_operation(entry.clone())
809 && let Some(op_key) = operation.key()
810 {
811 let timestamp = entry.clock().time();
812 let op_type = operation.op().to_string();
813 let value = if !operation.value().is_empty() {
814 Some(operation.value().to_vec())
815 } else {
816 None
817 };
818
819 let key_clone = op_key.clone();
821 if let Some((existing_time, _, _)) = key_operations.get(&key_clone) {
822 if timestamp > *existing_time {
823 key_operations.insert(key_clone, (timestamp, op_type, value));
824 }
825 } else {
826 key_operations.insert(key_clone, (timestamp, op_type, value));
827 }
828 }
829 }
830
831 for (key, (_timestamp, op_type, value)) in key_operations {
833 let op_str = op_type.as_str();
834 if op_str == "PUT" {
835 if let Some(val) = value {
836 result.insert(key, val);
837 }
838 } else if op_str == "DEL" {
839 result.remove(&key);
841 } else {
842 if let Some(val) = value {
844 result.insert(key, val);
845 }
846 }
847 }
848 }
849
850 result
851 }
852}
853
854struct DocumentStoreWrapper {
856 store: Arc<dyn Store<Error = GuardianError> + Send + Sync>,
857}
858
859impl DocumentStoreWrapper {
860 fn new(store: Arc<dyn Store<Error = GuardianError> + Send + Sync>) -> Self {
861 Self { store }
862 }
863
864 fn search_documents_by_key(
866 &self,
867 key: &str,
868 opts: &crate::traits::DocumentStoreGetOptions,
869 ) -> Result<Vec<Document>> {
870 let index = self.store.index();
871
872 let mut key_for_search = key.to_string();
874 let has_multiple_terms = key.contains(' ');
875
876 if has_multiple_terms {
877 key_for_search = key_for_search.replace('.', " ");
878 }
879 if opts.case_insensitive {
880 key_for_search = key_for_search.to_lowercase();
881 }
882
883 let mut documents = Vec::new();
884
885 let all_keys = index.keys().unwrap_or_default();
887
888 for index_key in all_keys {
889 let mut index_key_for_search = index_key.clone();
890
891 if opts.case_insensitive {
893 index_key_for_search = index_key_for_search.to_lowercase();
894 }
895
896 let matches = if opts.partial_matches {
898 index_key_for_search.contains(&key_for_search)
899 } else {
900 index_key_for_search == key_for_search
901 };
902
903 if matches {
904 if let Ok(Some(doc_bytes)) = index.get_bytes(&index_key) {
906 match serde_json::from_slice::<serde_json::Value>(&doc_bytes) {
908 Ok(json_value) => {
909 let doc: Document = Box::new(json_value);
910 documents.push(doc);
911 }
912 Err(e) => {
913 eprintln!(
914 "Aviso: Falha ao desserializar documento para chave '{}': {}",
915 index_key, e
916 );
917 }
918 }
919 } else {
920 eprintln!(
921 "Aviso: chave '{}' encontrada mas sem valor correspondente",
922 index_key
923 );
924 }
925 }
926 }
927
928 Ok(documents)
929 }
930
931 fn search_documents_from_oplog(
933 &self,
934 key: &str,
935 opts: &crate::traits::DocumentStoreGetOptions,
936 ) -> Result<Vec<Document>> {
937 let oplog = self.store.op_log();
938 let oplog_guard = oplog.read();
939
940 let mut documents = Vec::new();
941
942 for arc_entry in oplog_guard.values() {
944 let entry = arc_entry.as_ref().clone();
945
946 if let Ok(operation) = crate::stores::operation::operation::parse_operation(entry) {
948 if let Some(op_key) = operation.key() {
950 let mut op_key_search = op_key.clone();
951 let mut key_search = key.to_string();
952
953 if opts.case_insensitive {
954 op_key_search = op_key_search.to_lowercase();
955 key_search = key_search.to_lowercase();
956 }
957
958 let matches = if opts.partial_matches {
959 op_key_search.contains(&key_search)
960 } else {
961 op_key_search == key_search
962 };
963
964 if matches && !operation.value().is_empty() {
965 match serde_json::from_slice::<serde_json::Value>(operation.value()) {
967 Ok(json_value) => {
968 let doc: Document = Box::new(json_value);
969 documents.push(doc);
970 }
971 Err(_) => {
972 let simple_doc = serde_json::json!({
974 "key": op_key,
975 "value": String::from_utf8_lossy(operation.value()),
976 "op_type": operation.op()
977 });
978 let doc: Document = Box::new(simple_doc);
979 documents.push(doc);
980 }
981 }
982 }
983 }
984 }
985 }
986
987 Ok(documents)
988 }
989
990 fn get_all_documents_from_index(&self) -> Result<Vec<Document>> {
992 let index = self.store.index();
993 let mut documents = Vec::new();
994
995 let all_keys = index.keys().unwrap_or_default();
996
997 for key in all_keys {
998 if let Ok(Some(doc_bytes)) = index.get_bytes(&key) {
999 match serde_json::from_slice::<serde_json::Value>(&doc_bytes) {
1000 Ok(json_value) => {
1001 let doc: Document = Box::new(json_value);
1002 documents.push(doc);
1003 }
1004 Err(e) => {
1005 eprintln!(
1006 "Aviso: Falha ao desserializar documento para chave '{}': {}",
1007 key, e
1008 );
1009 }
1010 }
1011 }
1012 }
1013
1014 Ok(documents)
1015 }
1016}
1017
1018#[async_trait::async_trait]
1019impl Store for DocumentStoreWrapper {
1020 type Error = GuardianError;
1021
1022 #[allow(deprecated)]
1023 fn events(&self) -> &dyn crate::events::EmitterInterface {
1024 self.store.events()
1025 }
1026
1027 async fn close(&self) -> std::result::Result<(), Self::Error> {
1028 self.store.close().await
1029 }
1030
1031 fn address(&self) -> &dyn crate::address::Address {
1032 self.store.address()
1033 }
1034
1035 fn index(&self) -> Box<dyn crate::traits::StoreIndex<Error = GuardianError> + Send + Sync> {
1036 self.store.index()
1037 }
1038
1039 fn store_type(&self) -> &str {
1040 self.store.store_type()
1041 }
1042
1043 fn replication_status(&self) -> crate::stores::replicator::replication_info::ReplicationInfo {
1044 self.store.replication_status()
1045 }
1046
1047 fn replicator(&self) -> Option<Arc<crate::stores::replicator::replicator::Replicator>> {
1048 self.store.replicator()
1049 }
1050
1051 fn cache(&self) -> Arc<dyn crate::data_store::Datastore> {
1052 self.store.cache()
1053 }
1054
1055 async fn drop(&mut self) -> std::result::Result<(), Self::Error> {
1056 if let Some(_base_store) =
1058 self.store
1059 .as_any()
1060 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1061 {
1062 Ok(())
1065 } else {
1066 Err(GuardianError::Store(
1067 "Não foi possível fazer downcast para BaseStore".to_string(),
1068 ))
1069 }
1070 }
1071
1072 async fn load(&mut self, amount: usize) -> std::result::Result<(), Self::Error> {
1073 if let Some(base_store) =
1075 self.store
1076 .as_any()
1077 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1078 {
1079 base_store.load(Some(amount as isize)).await
1080 } else {
1081 Err(GuardianError::Store(
1082 "Não foi possível fazer downcast para BaseStore".to_string(),
1083 ))
1084 }
1085 }
1086
1087 async fn sync(
1088 &mut self,
1089 heads: Vec<crate::ipfs_log::entry::Entry>,
1090 ) -> std::result::Result<(), Self::Error> {
1091 if let Some(base_store) =
1093 self.store
1094 .as_any()
1095 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1096 {
1097 base_store.sync(heads).await
1098 } else {
1099 Err(GuardianError::Store(
1100 "Não foi possível fazer downcast para BaseStore".to_string(),
1101 ))
1102 }
1103 }
1104
1105 async fn load_more_from(&mut self, _amount: u64, entries: Vec<crate::ipfs_log::entry::Entry>) {
1106 if let Some(base_store) =
1108 self.store
1109 .as_any()
1110 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1111 {
1112 let _ = base_store.load_more_from(entries);
1114 } else {
1115 eprintln!("Aviso: Não foi possível fazer downcast para BaseStore em load_more_from");
1117 }
1118 }
1119
1120 async fn load_from_snapshot(&mut self) -> std::result::Result<(), Self::Error> {
1121 if let Some(base_store) =
1123 self.store
1124 .as_any()
1125 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1126 {
1127 base_store.load_from_snapshot().await
1128 } else {
1129 Err(GuardianError::Store(
1130 "Não foi possível fazer downcast para BaseStore".to_string(),
1131 ))
1132 }
1133 }
1134
1135 fn op_log(&self) -> Arc<RwLock<crate::ipfs_log::log::Log>> {
1136 self.store.op_log()
1137 }
1138
1139 fn ipfs(&self) -> Arc<IpfsClient> {
1140 unimplemented!("Adapta��o entre tipos de cliente IPFS pendente")
1141 }
1142
1143 fn db_name(&self) -> &str {
1144 self.store.db_name()
1145 }
1146
1147 fn identity(&self) -> &crate::ipfs_log::identity::Identity {
1148 self.store.identity()
1149 }
1150
1151 fn access_controller(&self) -> &dyn crate::access_controller::traits::AccessController {
1152 self.store.access_controller()
1153 }
1154
1155 async fn add_operation(
1156 &mut self,
1157 op: crate::stores::operation::operation::Operation,
1158 on_progress_callback: Option<ProgressCallback>,
1159 ) -> std::result::Result<crate::ipfs_log::entry::Entry, Self::Error> {
1160 if let Some(base_store) =
1162 self.store
1163 .as_any()
1164 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1165 {
1166 base_store.add_operation(op, on_progress_callback).await
1167 } else {
1168 Err(GuardianError::Store(
1169 "Não foi possível fazer downcast para BaseStore".to_string(),
1170 ))
1171 }
1172 }
1173
1174 fn span(&self) -> Arc<tracing::Span> {
1175 self.store.span()
1176 }
1177
1178 fn tracer(&self) -> Arc<crate::traits::TracerWrapper> {
1179 self.store.tracer()
1180 }
1181
1182 fn event_bus(&self) -> Arc<crate::p2p::events::EventBus> {
1183 self.store.event_bus()
1184 }
1185
1186 fn as_any(&self) -> &dyn std::any::Any {
1187 self
1188 }
1189}
1190
1191#[async_trait::async_trait]
1192impl DocumentStore for DocumentStoreWrapper {
1193 async fn put(
1194 &mut self,
1195 document: Document,
1196 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
1197 let data = if let Some(bytes) = document.downcast_ref::<Vec<u8>>() {
1199 bytes.clone()
1200 } else {
1201 format!("{:?}", document).into_bytes()
1203 };
1204
1205 let operation = crate::stores::operation::operation::Operation::new(
1207 None, "PUT".to_string(),
1209 Some(data),
1210 );
1211
1212 self.add_operation(operation.clone(), None).await?;
1213 Ok(operation)
1214 }
1215
1216 async fn delete(
1217 &mut self,
1218 key: &str,
1219 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
1220 let operation = crate::stores::operation::operation::Operation::new(
1222 Some(key.to_string()),
1223 "DEL".to_string(),
1224 None,
1225 );
1226
1227 self.add_operation(operation.clone(), None).await?;
1228 Ok(operation)
1229 }
1230
1231 async fn put_batch(
1232 &mut self,
1233 values: Vec<Document>,
1234 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
1235 let mut batch_data = Vec::new();
1237 for document in values {
1238 let data = if let Some(bytes) = document.downcast_ref::<Vec<u8>>() {
1239 bytes.clone()
1240 } else {
1241 format!("{:?}", document).into_bytes()
1242 };
1243 batch_data.extend(data);
1244 batch_data.push(b'\n'); }
1246
1247 let operation = crate::stores::operation::operation::Operation::new(
1249 None,
1250 "PUT_BATCH".to_string(),
1251 Some(batch_data),
1252 );
1253
1254 self.add_operation(operation.clone(), None).await?;
1255 Ok(operation)
1256 }
1257
1258 async fn put_all(
1259 &mut self,
1260 values: Vec<Document>,
1261 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
1262 let mut batch_data = Vec::new();
1264 for document in values {
1265 let data = if let Some(bytes) = document.downcast_ref::<Vec<u8>>() {
1266 bytes.clone()
1267 } else {
1268 format!("{:?}", document).into_bytes()
1269 };
1270 batch_data.extend(data);
1271 batch_data.push(b'\n'); }
1273
1274 let operation = crate::stores::operation::operation::Operation::new(
1276 None,
1277 "PUT_ALL".to_string(),
1278 Some(batch_data),
1279 );
1280
1281 self.add_operation(operation.clone(), None).await?;
1282 Ok(operation)
1283 }
1284
1285 async fn get(
1286 &self,
1287 key: &str,
1288 opts: Option<crate::traits::DocumentStoreGetOptions>,
1289 ) -> std::result::Result<Vec<Document>, Self::Error> {
1290 let opts = opts.unwrap_or_default();
1293
1294 let documents_from_index = self.search_documents_by_key(key, &opts)?;
1296
1297 if !documents_from_index.is_empty() {
1298 return Ok(documents_from_index);
1299 }
1300
1301 let documents_from_oplog = self.search_documents_from_oplog(key, &opts)?;
1304
1305 Ok(documents_from_oplog)
1306 }
1307
1308 async fn query(
1309 &self,
1310 filter: AsyncDocumentFilter,
1311 ) -> std::result::Result<Vec<Document>, Self::Error> {
1312 let all_documents = self.get_all_documents_from_index()?;
1316
1317 let mut filtered_documents = Vec::new();
1318
1319 for document in all_documents {
1321 let filter_future = filter(&document);
1323
1324 match filter_future.await {
1325 Ok(true) => {
1326 filtered_documents.push(document);
1328 }
1329 Ok(false) => {
1330 continue;
1332 }
1333 Err(e) => {
1334 eprintln!("Aviso: Erro ao aplicar filtro no documento: {}", e);
1336 continue;
1337 }
1338 }
1339 }
1340
1341 Ok(filtered_documents)
1342 }
1343}
1344
1345#[async_trait::async_trait]
1346impl BaseGuardianDBTrait for GuardianDB {
1347 type Error = GuardianError;
1348
1349 async fn open(
1350 &self,
1351 address: &str,
1352 options: &mut CreateDBOptions,
1353 ) -> std::result::Result<Arc<dyn Store<Error = GuardianError>>, Self::Error> {
1354 let opts = options.clone();
1355 let result = self.base.open(address, opts).await?;
1356 Ok(result as Arc<dyn Store<Error = GuardianError>>)
1358 }
1359
1360 async fn determine_address(
1361 &self,
1362 name: &str,
1363 store_type: &str,
1364 options: &crate::traits::DetermineAddressOptions,
1365 ) -> std::result::Result<Box<dyn crate::address::Address>, Self::Error> {
1366 let opts = Some(options.clone());
1367 let result = self.base.determine_address(name, store_type, opts).await?;
1368 Ok(Box::new(result))
1369 }
1370
1371 fn ipfs(&self) -> Arc<crate::ipfs_core_api::client::IpfsClient> {
1372 Arc::new(self.base.ipfs().clone())
1373 }
1374
1375 fn identity(&self) -> Arc<crate::ipfs_log::identity::Identity> {
1376 Arc::new(self.base.identity().clone())
1377 }
1378
1379 fn get_store(&self, address: &str) -> Option<Arc<dyn Store<Error = GuardianError>>> {
1380 self.base
1381 .get_store(address)
1382 .map(|store| store as Arc<dyn Store<Error = GuardianError>>)
1383 }
1384
1385 async fn create(
1386 &self,
1387 name: &str,
1388 store_type: &str,
1389 options: &mut CreateDBOptions,
1390 ) -> std::result::Result<Arc<dyn Store<Error = GuardianError>>, Self::Error> {
1391 let opts = Some(options.clone());
1392 let result = self.base.create(name, store_type, opts).await?;
1393 Ok(result as Arc<dyn Store<Error = GuardianError>>)
1394 }
1395
1396 fn register_store_type(
1397 &mut self,
1398 store_type: &str,
1399 constructor: crate::traits::StoreConstructor,
1400 ) {
1401 unsafe {
1404 let base_ptr = &self.base as *const crate::base_guardian::GuardianDB
1405 as *mut crate::base_guardian::GuardianDB;
1406 (*base_ptr).register_store_type(store_type.to_string(), constructor);
1407 }
1408 }
1409
1410 fn unregister_store_type(&mut self, store_type: &str) {
1411 unsafe {
1413 let base_ptr = &self.base as *const crate::base_guardian::GuardianDB
1414 as *mut crate::base_guardian::GuardianDB;
1415 (*base_ptr).unregister_store_type(store_type);
1416 }
1417 }
1418
1419 fn register_access_controller_type(
1420 &mut self,
1421 constructor: crate::traits::AccessControllerConstructor,
1422 ) -> std::result::Result<(), Self::Error> {
1423 unsafe {
1425 let base_ptr = &self.base as *const crate::base_guardian::GuardianDB
1426 as *mut crate::base_guardian::GuardianDB;
1427 let rt = tokio::runtime::Runtime::new().map_err(|_| "Failed to create runtime")?;
1429 rt.block_on((*base_ptr).register_access_controller_type(constructor))
1430 }
1431 }
1432
1433 fn unregister_access_controller_type(&mut self, controller_type: &str) {
1434 unsafe {
1436 let base_ptr = &self.base as *const crate::base_guardian::GuardianDB
1437 as *mut crate::base_guardian::GuardianDB;
1438 (*base_ptr).unregister_access_controller_type(controller_type);
1439 }
1440 }
1441
1442 fn get_access_controller_type(
1443 &self,
1444 controller_type: &str,
1445 ) -> Option<crate::traits::AccessControllerConstructor> {
1446 self.base.get_access_controller_type(controller_type)
1447 }
1448
1449 fn event_bus(&self) -> crate::p2p::events::EventBus {
1450 (*self.base.event_bus()).clone()
1451 }
1452
1453 fn span(&self) -> &tracing::Span {
1454 self.base.span()
1455 }
1456
1457 fn tracer(&self) -> Arc<crate::traits::TracerWrapper> {
1458 let boxed_tracer = self.base.tracer();
1460 Arc::new(crate::traits::TracerWrapper::new_opentelemetry(
1461 boxed_tracer,
1462 ))
1463 }
1464}
1465
1466#[async_trait::async_trait]
1467impl GuardianDBKVStoreProvider for GuardianDB {
1468 type Error = GuardianError;
1469
1470 async fn key_value(
1471 &self,
1472 address: &str,
1473 options: &mut CreateDBOptions,
1474 ) -> std::result::Result<Box<dyn KeyValueStore<Error = GuardianError>>, Self::Error> {
1475 let opts_clone = options.clone();
1477 let arc_store = self.key_value(address, Some(opts_clone)).await?;
1478
1479 Ok(Box::new(KeyValueStoreBoxWrapper::new(arc_store)))
1481 }
1482}
1483
1484pub struct KeyValueStoreBoxWrapper {
1486 inner: Arc<dyn KeyValueStore<Error = GuardianError>>,
1487}
1488
1489impl KeyValueStoreBoxWrapper {
1490 pub fn new(inner: Arc<dyn KeyValueStore<Error = GuardianError>>) -> Self {
1491 Self { inner }
1492 }
1493}
1494
1495#[async_trait::async_trait]
1496impl Store for KeyValueStoreBoxWrapper {
1497 type Error = GuardianError;
1498
1499 fn address(&self) -> &dyn crate::address::Address {
1500 self.inner.address()
1501 }
1502
1503 fn store_type(&self) -> &str {
1504 self.inner.store_type()
1505 }
1506
1507 async fn close(&self) -> std::result::Result<(), Self::Error> {
1508 self.inner.close().await
1510 }
1511
1512 async fn drop(&mut self) -> std::result::Result<(), Self::Error> {
1513 if let Some(_base_store) =
1515 self.inner
1516 .as_any()
1517 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1518 {
1519 self.inner.close().await
1521 } else {
1522 Err(GuardianError::Store(
1523 "Não foi possível fazer downcast para BaseStore".to_string(),
1524 ))
1525 }
1526 }
1527
1528 fn events(&self) -> &dyn crate::events::EmitterInterface {
1529 unimplemented!("events() is deprecated, use event_bus() instead")
1531 }
1532
1533 fn index(&self) -> Box<dyn crate::traits::StoreIndex<Error = Self::Error> + Send + Sync> {
1534 self.inner.index()
1535 }
1536
1537 fn replication_status(&self) -> crate::stores::replicator::replication_info::ReplicationInfo {
1538 self.inner.replication_status()
1539 }
1540
1541 fn replicator(&self) -> Option<Arc<crate::stores::replicator::replicator::Replicator>> {
1542 self.inner.replicator()
1543 }
1544
1545 fn cache(&self) -> Arc<dyn crate::data_store::Datastore> {
1546 self.inner.cache()
1547 }
1548
1549 async fn load(&mut self, amount: usize) -> std::result::Result<(), Self::Error> {
1550 if let Some(base_store) =
1552 self.inner
1553 .as_any()
1554 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1555 {
1556 base_store.load(Some(amount as isize)).await
1557 } else {
1558 Err(GuardianError::Store(
1559 "Não foi possível fazer downcast para BaseStore".to_string(),
1560 ))
1561 }
1562 }
1563
1564 async fn sync(
1565 &mut self,
1566 heads: Vec<crate::ipfs_log::entry::Entry>,
1567 ) -> std::result::Result<(), Self::Error> {
1568 if let Some(base_store) =
1570 self.inner
1571 .as_any()
1572 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1573 {
1574 base_store.sync(heads).await
1575 } else {
1576 Err(GuardianError::Store(
1577 "Não foi possível fazer downcast para BaseStore".to_string(),
1578 ))
1579 }
1580 }
1581
1582 async fn load_more_from(&mut self, _amount: u64, entries: Vec<crate::ipfs_log::entry::Entry>) {
1583 if let Some(base_store) =
1585 self.inner
1586 .as_any()
1587 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1588 {
1589 let _ = base_store.load_more_from(entries);
1590 } else {
1591 eprintln!("Aviso: Não foi possível fazer downcast para BaseStore em load_more_from");
1592 }
1593 }
1594
1595 async fn load_from_snapshot(&mut self) -> std::result::Result<(), Self::Error> {
1596 if let Some(base_store) =
1598 self.inner
1599 .as_any()
1600 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1601 {
1602 base_store.load_from_snapshot().await
1603 } else {
1604 Err(GuardianError::Store(
1605 "Não foi possível fazer downcast para BaseStore".to_string(),
1606 ))
1607 }
1608 }
1609
1610 fn op_log(&self) -> Arc<parking_lot::RwLock<crate::ipfs_log::log::Log>> {
1611 self.inner.op_log()
1612 }
1613
1614 fn ipfs(&self) -> Arc<crate::ipfs_core_api::client::IpfsClient> {
1615 self.inner.ipfs()
1616 }
1617
1618 fn db_name(&self) -> &str {
1619 self.inner.db_name()
1620 }
1621
1622 fn identity(&self) -> &crate::ipfs_log::identity::Identity {
1623 self.inner.identity()
1624 }
1625
1626 fn access_controller(&self) -> &dyn crate::access_controller::traits::AccessController {
1627 self.inner.access_controller()
1628 }
1629
1630 async fn add_operation(
1631 &mut self,
1632 op: crate::stores::operation::operation::Operation,
1633 on_progress_callback: Option<crate::traits::ProgressCallback>,
1634 ) -> std::result::Result<crate::ipfs_log::entry::Entry, Self::Error> {
1635 if let Some(base_store) =
1637 self.inner
1638 .as_any()
1639 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1640 {
1641 base_store.add_operation(op, on_progress_callback).await
1642 } else {
1643 Err(GuardianError::Store(
1644 "Não foi possível fazer downcast para BaseStore".to_string(),
1645 ))
1646 }
1647 }
1648
1649 fn span(&self) -> Arc<tracing::Span> {
1650 self.inner.span()
1651 }
1652
1653 fn tracer(&self) -> Arc<crate::traits::TracerWrapper> {
1654 self.inner.tracer()
1655 }
1656
1657 fn event_bus(&self) -> Arc<crate::p2p::events::EventBus> {
1658 self.inner.event_bus()
1659 }
1660
1661 fn as_any(&self) -> &dyn std::any::Any {
1662 self
1663 }
1664}
1665
1666#[async_trait::async_trait]
1667impl KeyValueStore for KeyValueStoreBoxWrapper {
1668 async fn put(
1669 &mut self,
1670 key: &str,
1671 value: Vec<u8>,
1672 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
1673 let operation = crate::stores::operation::operation::Operation::new(
1675 Some(key.to_string()),
1676 "PUT".to_string(),
1677 Some(value),
1678 );
1679
1680 if let Some(base_store) =
1682 self.inner
1683 .as_any()
1684 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1685 {
1686 let _entry = base_store
1688 .add_operation(operation.clone(), None)
1689 .await
1690 .map_err(|e| {
1691 GuardianError::Store(format!("Failed to persist put operation: {}", e))
1692 })?;
1693
1694 Ok(operation)
1696 } else {
1697 Err(GuardianError::Store(
1698 "Não foi possível fazer downcast para BaseStore para persistir operação PUT"
1699 .to_string(),
1700 ))
1701 }
1702 }
1703
1704 async fn get(&self, key: &str) -> std::result::Result<Option<Vec<u8>>, Self::Error> {
1705 self.inner.get(key).await
1706 }
1707
1708 async fn delete(
1709 &mut self,
1710 key: &str,
1711 ) -> std::result::Result<crate::stores::operation::operation::Operation, Self::Error> {
1712 let all_data = self.inner.all();
1714 let key_exists = all_data.contains_key(key);
1715 if !key_exists {
1716 return Err(GuardianError::Store(format!(
1717 "Key '{}' not found for deletion",
1718 key
1719 )));
1720 }
1721
1722 let operation = crate::stores::operation::operation::Operation::new(
1724 Some(key.to_string()),
1725 "DELETE".to_string(),
1726 None,
1727 );
1728
1729 if let Some(base_store) =
1731 self.inner
1732 .as_any()
1733 .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1734 {
1735 let _entry = base_store
1737 .add_operation(operation.clone(), None)
1738 .await
1739 .map_err(|e| {
1740 GuardianError::Store(format!("Failed to persist delete operation: {}", e))
1741 })?;
1742
1743 Ok(operation)
1745 } else {
1746 Err(GuardianError::Store(
1747 "Não foi possível fazer downcast para BaseStore para persistir operação DELETE"
1748 .to_string(),
1749 ))
1750 }
1751 }
1752
1753 fn all(&self) -> std::collections::HashMap<String, Vec<u8>> {
1754 self.inner.all()
1755 }
1756}