guardian_db/
guardian.rs

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    /// Cria uma nova instância do GuardianDB
17    pub async fn new(ipfs: IpfsClient, options: Option<NewGuardianDBOptions>) -> Result<Self> {
18        // Usar imports necessários
19        use crate::ipfs_log::identity::{Identity, Signatures};
20
21        // Criar uma identidade temporária para usar com new_guardian_db
22        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    /// Cria um EventLogStore
30    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        // Verifica se o store retornado é do tipo correto
42        if store.store_type() == "eventlog" {
43            // Cria um wrapper simples que implementa EventLogStore
44            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    /// Cria um KeyValueStore
54    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        // Para KeyValueStore, criamos um wrapper genérico
66        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    /// Cria um DocumentStore
77    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        // Verifica se o store retornado é do tipo correto
89        if store.store_type() == "docstore" {
90            // Cria um wrapper que implementa DocumentStore
91            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    /// Acesso direto ao BaseGuardianDB para funcionalidades avançadas
101    pub fn base(&self) -> &BaseGuardianDB {
102        &self.base
103    }
104}
105
106/// Wrapper que adapta um Store genérico para EventLogStore
107///
108/// SOLUÇÃO IMPLEMENTADA: O problema das limitações de &mut self foi resolvido
109/// usando downcasting para BaseStore, que implementa add_operation(&self) de
110/// forma thread-safe usando Arc<RwLock<T>> internamente.
111struct 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    /// Query otimizada usando o índice da store
121    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        // Query simples por quantidade (caso mais comum)
128        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                    // -1 ou None significa "todas as entradas"
138                    match index.len() {
139                        Ok(len) => len,
140                        Err(_) => return self.query_from_oplog(options), // Fallback
141                    }
142                }
143                _ => 0,
144            };
145
146            // Usa método otimizado do índice se disponível
147            if let Some(entries) = index.get_last_entries(amount) {
148                return Ok(entries);
149            }
150        }
151
152        // Query por CID específico
153        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()); // CID não encontrado
163            }
164        }
165
166        // Para queries mais complexas, usa fallback
167        self.query_from_oplog(options)
168    }
169
170    /// Fallback: busca direta no oplog quando índice não suporta a query
171    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        // Coleta todas as entradas do oplog
179        let mut all_entries: Vec<_> = oplog_guard
180            .values()
181            .iter()
182            .map(|arc_entry| arc_entry.as_ref().clone())
183            .collect();
184
185        // Ordena por ordem cronológica (mais recentes primeiro para corresponder ao comportamento esperado)
186        all_entries.sort_by_key(|b| std::cmp::Reverse(b.clock().time()));
187
188        // Aplica filtros de CID se especificados
189        let mut filtered_entries = all_entries;
190
191        // Filtro gte (maior ou igual)
192        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()); // CID não encontrado
198            }
199        }
200
201        // Filtro gt (maior que)
202        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()); // CID não encontrado
208            }
209        }
210
211        // Filtro lte (menor ou igual)
212        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()); // CID não encontrado
218            }
219        }
220
221        // Filtro lt (menor que)
222        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()); // CID não encontrado
228            }
229        }
230
231        // Aplica limitação de quantidade
232        let amount = match options.amount {
233            Some(a) if a > 0 => a as usize,
234            Some(-1) | None => filtered_entries.len(), // -1 ou None = todas
235            _ => 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        // Delega para BaseStore usando downcasting
282        if let Some(_base_store) =
283            self.store
284                .as_any()
285                .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
286        {
287            // BaseStore não tem um método drop específico, mas podemos fazer limpeza básica
288            // ***Por enquanto, retorna sucesso pois a limpeza será feita automaticamente no Drop trait
289            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        // Delega para BaseStore usando downcasting
299        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        // Delega para BaseStore usando downcasting
317        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        // Delega para BaseStore usando downcasting
332        if let Some(base_store) =
333            self.store
334                .as_any()
335                .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
336        {
337            // BaseStore::load_more_from retorna Result<usize>, mas esta trait não espera retorno
338            let _ = base_store.load_more_from(entries);
339        } else {
340            // Log do erro, mas não pode retornar erro porque a assinatura não permite
341            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        // Delega para BaseStore usando downcasting
347        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        // Faz downcast para BaseStore e usa o método add_operation(&self)
386        // que é thread-safe e não requer &mut self
387        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        // Cria uma operação ADD e a adiciona ao store
424        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        // Retorna a operação que foi adicionada com sucesso
433        // ***Em uma implementação mais sofisticada, poderíamos re-parsear a entrada
434        // para garantir consistência, mas para este caso a operação original serve
435        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        // Busca uma operação específica por CID
443
444        // Primeiro, tenta usar o índice para busca otimizada
445        if let Some(entry) = self.store.index().get_entry_by_cid(&cid) {
446            // Converte a Entry para Operation usando parse_operation
447            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        // Fallback: busca no oplog diretamente
453        let oplog = self.store.op_log();
454        let oplog_guard = oplog.read();
455
456        // Busca linear no oplog por CID
457        let cid_str = cid.to_string();
458        for arc_entry in oplog_guard.values() {
459            if arc_entry.hash() == cid_str {
460                // Converte Entry para Operation
461                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        // CID não encontrado
471        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        // Lista operações com filtros opcionais
482        let options = options.unwrap_or_default();
483
484        // Tenta usar índice otimizado primeiro
485        let entries = if self.store.index().supports_entry_queries() {
486            // Query otimizada usando o índice
487            self.query_from_index(&options)?
488        } else {
489            // Fallback: busca no oplog
490            self.query_from_oplog(&options)?
491        };
492
493        // Converte todas as entradas para operações
494        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                    // Log do erro mas continua processando outras entradas
500                    eprintln!("Aviso: Falha ao parsear entrada: {}", e);
501                }
502            }
503        }
504
505        Ok(operations)
506    }
507}
508
509/// Wrapper que adapta um Store genérico para KeyValueStore
510struct 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        // Delega para BaseStore usando downcasting
559        if let Some(_base_store) =
560            self.store
561                .as_any()
562                .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
563        {
564            // BaseStore não tem um método drop específico, mas podemos fazer limpeza básica
565            // ***Por enquanto, retorna sucesso pois a limpeza será feita automaticamente no Drop trait
566            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        // Delega para BaseStore usando downcasting
576        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        // Delega para BaseStore usando downcasting
594        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        // Delega para BaseStore usando downcasting
609        if let Some(base_store) =
610            self.store
611                .as_any()
612                .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
613        {
614            // BaseStore::load_more_from retorna Result<usize>, mas esta trait não espera retorno
615            let _ = base_store.load_more_from(entries);
616        } else {
617            // Log do erro, mas não pode retornar erro porque a assinatura não permite
618            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        // Delega para BaseStore usando downcasting
624        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        // Faz downcast para BaseStore e usa o método add_operation(&self)
663        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        // Busca um valor por chave no KeyValue store
697
698        // Primeiro, tenta buscar no índice (mais eficiente)
699        let index = self.store.index();
700        if let Ok(Some(bytes)) = index.get_bytes(key) {
701            return Ok(Some(bytes));
702        }
703
704        // Fallback: busca no oplog por operações PUT com a chave especificada
705        let oplog = self.store.op_log();
706        let oplog_guard = oplog.read();
707
708        // Busca pela operação PUT mais recente com a chave especificada
709        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            // Converte Entry para Operation
716            if let Ok(operation) =
717                crate::stores::operation::operation::parse_operation(entry.clone())
718            {
719                // Verifica se é uma operação relevante para a chave
720                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                        // Se é mais recente que a operação anterior
728                        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                        // Se é mais recente que a operação anterior e é uma deleção
734                        if entry_time > latest_time {
735                            latest_time = entry_time;
736                            latest_value = None; // Valor foi deletado
737                        }
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        // Cria uma operação PUT com chave e valor
752        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        // Cria uma operação DEL com chave
767        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        // Primeiro, tenta coletar do índice (mais eficiente se estiver atualizado)
781        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        // Se o índice não retornou dados, ou como complemento, processa o oplog
791        // Isso garante que temos os dados mais atualizados, incluindo operações não indexadas
792        if result.is_empty() {
793            let oplog = self.store.op_log();
794            let oplog_guard = oplog.read();
795
796            // Mapeia chave -> (timestamp, operação, valor)
797            let mut key_operations: std::collections::HashMap<
798                String,
799                (u64, String, Option<Vec<u8>>),
800            > = std::collections::HashMap::new();
801
802            // Coleta todas as operações relevantes
803            for arc_entry in oplog_guard.values() {
804                let entry = arc_entry.as_ref().clone();
805
806                // Converte Entry para Operation
807                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                    // Atualiza se é mais recente ou se não existia antes
820                    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            // Processa as operações finais para cada chave
832            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                    // Remove da lista se foi deletado
840                    result.remove(&key);
841                } else {
842                    // Para outras operações, adiciona se tiver valor
843                    if let Some(val) = value {
844                        result.insert(key, val);
845                    }
846                }
847            }
848        }
849
850        result
851    }
852}
853
854/// Wrapper que adapta um Store genérico para DocumentStore
855struct 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    /// Busca documentos no índice usando uma chave
865    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        // Prepara a chave de busca de acordo com as opções
873        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        // Obtém todas as chaves do índice
886        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            // Normaliza a chave do índice para a busca
892            if opts.case_insensitive {
893                index_key_for_search = index_key_for_search.to_lowercase();
894            }
895
896            // Verifica se a chave corresponde aos critérios de busca
897            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                // Busca o valor no índice
905                if let Ok(Some(doc_bytes)) = index.get_bytes(&index_key) {
906                    // Desserializa o documento
907                    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    /// Busca documentos usando operações do oplog
932    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        // Itera através de todas as operações no oplog
943        for arc_entry in oplog_guard.values() {
944            let entry = arc_entry.as_ref().clone();
945
946            // Converte Entry para Operation
947            if let Ok(operation) = crate::stores::operation::operation::parse_operation(entry) {
948                // Verifica se a operação é relevante para documentos
949                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                        // Tenta desserializar o valor como documento
966                        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                                // Se não conseguir desserializar como JSON, cria um documento simples
973                                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    /// Coleta todos os documentos do índice para queries
991    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        // Delega para BaseStore usando downcasting
1057        if let Some(_base_store) =
1058            self.store
1059                .as_any()
1060                .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1061        {
1062            // BaseStore não tem um método drop específico, mas podemos fazer limpeza básica
1063            // ***Por enquanto, retorna sucesso pois a limpeza será feita automaticamente no Drop trait
1064            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        // Delega para BaseStore usando downcasting
1074        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        // Delega para BaseStore usando downcasting
1092        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        // Delega para BaseStore usando downcasting
1107        if let Some(base_store) =
1108            self.store
1109                .as_any()
1110                .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1111        {
1112            // BaseStore::load_more_from retorna Result<usize>, mas esta trait não espera retorno
1113            let _ = base_store.load_more_from(entries);
1114        } else {
1115            // Log do erro, mas não pode retornar erro porque a assinatura não permite
1116            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        // Delega para BaseStore usando downcasting
1122        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        // Faz downcast para BaseStore e usa o método add_operation(&self)
1161        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        // Serializa o documento para bytes
1198        let data = if let Some(bytes) = document.downcast_ref::<Vec<u8>>() {
1199            bytes.clone()
1200        } else {
1201            // Para outros tipos, usa uma serialização genérica
1202            format!("{:?}", document).into_bytes()
1203        };
1204
1205        // Cria uma operação PUT para documento
1206        let operation = crate::stores::operation::operation::Operation::new(
1207            None, // Documents podem não ter chave específica
1208            "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        // Cria uma operação DEL para documento
1221        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        // Serializa múltiplos documentos
1236        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'); // Separador
1245        }
1246
1247        // Cria uma operação PUT_BATCH
1248        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        // Similar ao put_batch, mas com operação PUT_ALL
1263        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'); // Separador
1272        }
1273
1274        // Cria uma operação PUT_ALL
1275        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        // Busca documentos por chave com opções avançadas
1291
1292        let opts = opts.unwrap_or_default();
1293
1294        // Tenta usar o índice primeiro (mais eficiente)
1295        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        // Fallback: busca no oplog se o índice não retornar resultados
1302        // Isso pode acontecer se o índice ainda não foi populado ou se estiver desatualizado
1303        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        // Query com filtro assíncrono customizável
1313
1314        // Obtém todos os documentos disponíveis
1315        let all_documents = self.get_all_documents_from_index()?;
1316
1317        let mut filtered_documents = Vec::new();
1318
1319        // Aplica o filtro assíncrono a cada documento
1320        for document in all_documents {
1321            // Chama o filtro assíncrono
1322            let filter_future = filter(&document);
1323
1324            match filter_future.await {
1325                Ok(true) => {
1326                    // Documento passou no filtro
1327                    filtered_documents.push(document);
1328                }
1329                Ok(false) => {
1330                    // Documento não passou no filtro, continua
1331                    continue;
1332                }
1333                Err(e) => {
1334                    // Erro no filtro - logamos mas continuamos processando
1335                    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        // Convert Send+Sync to non-Send+Sync
1357        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        // Usar unsafe para conseguir acesso mutável ao base
1402        // Isso é seguro porque temos &mut self
1403        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        // Usar unsafe para conseguir acesso mutável a base
1412        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        // Usar unsafe para conseguir acesso mutável ao base
1424        unsafe {
1425            let base_ptr = &self.base as *const crate::base_guardian::GuardianDB
1426                as *mut crate::base_guardian::GuardianDB;
1427            // Criar um runtime temporário para executar a função async
1428            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        // Usar unsafe para conseguir acesso mutável ao base
1435        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        // Converter BoxedTracer para TracerWrapper
1459        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        // Usa o método já implementado do wrapper que retorna Arc
1476        let opts_clone = options.clone();
1477        let arc_store = self.key_value(address, Some(opts_clone)).await?;
1478
1479        // Converte Arc para Box usando um wrapper
1480        Ok(Box::new(KeyValueStoreBoxWrapper::new(arc_store)))
1481    }
1482}
1483
1484/// Wrapper para converter Arc<dyn KeyValueStore> para Box<dyn KeyValueStore>
1485pub 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        // Delega para o store interno usando close()
1509        self.inner.close().await
1510    }
1511
1512    async fn drop(&mut self) -> std::result::Result<(), Self::Error> {
1513        // Delega para BaseStore usando downcasting para limpeza
1514        if let Some(_base_store) =
1515            self.inner
1516                .as_any()
1517                .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1518        {
1519            // BaseStore não tem método drop específico, fazemos a limpeza usando close
1520            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        // events() está deprecated
1530        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        // load usando downcasting
1551        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        // sync usando downcasting
1569        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        // load_more_from usando downcasting
1584        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        // load_from_snapshot usando downcasting
1597        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        // add_operation usando downcasting
1636        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        // put usando downcasting para persistir dados
1674        let operation = crate::stores::operation::operation::Operation::new(
1675            Some(key.to_string()),
1676            "PUT".to_string(),
1677            Some(value),
1678        );
1679
1680        // Persiste a operação usando add_operation através do downcasting
1681        if let Some(base_store) =
1682            self.inner
1683                .as_any()
1684                .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1685        {
1686            // Executa a operação no store - persiste os dados
1687            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            // Operação foi persistida com sucesso
1695            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        // Verifica se a chave existe antes de deletar
1713        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        // Cria e executa operação delete
1723        let operation = crate::stores::operation::operation::Operation::new(
1724            Some(key.to_string()),
1725            "DELETE".to_string(),
1726            None,
1727        );
1728
1729        // Persiste a operação usando add_operation através do downcasting
1730        if let Some(base_store) =
1731            self.inner
1732                .as_any()
1733                .downcast_ref::<crate::stores::base_store::base_store::BaseStore>()
1734        {
1735            // Executa a operação no store
1736            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            // Operação foi persistida com sucesso
1744            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}