Skip to main content

khive_db/backend/core_stores/
entity.rs

1use super::super::StorageBackend;
2use super::map_open_error;
3use async_trait::async_trait;
4use khive_storage::entity::{Entity, EntityFilter, EntityStore, EntityTypeCounts};
5use khive_storage::{
6    Attachment, BatchWriteSummary, DeleteMode, Page, PageRequest, SeekCursor, SeekPage,
7    StorageCapability, StorageResult,
8};
9use uuid::Uuid;
10
11#[async_trait]
12impl EntityStore for StorageBackend {
13    async fn upsert_entity(&self, entity: Entity) -> StorageResult<()> {
14        self.entities()
15            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
16            .upsert_entity(entity)
17            .await
18    }
19
20    async fn insert_entity_if_absent(&self, _entity: Entity) -> StorageResult<bool> {
21        self.entities()
22            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
23            .insert_entity_if_absent(_entity)
24            .await
25    }
26
27    async fn upsert_entity_with_attachments(
28        &self,
29        _entity: Entity,
30        _attachments: Vec<Attachment>,
31    ) -> StorageResult<()> {
32        self.entities()
33            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
34            .upsert_entity_with_attachments(_entity, _attachments)
35            .await
36    }
37
38    async fn upsert_entities(&self, entities: Vec<Entity>) -> StorageResult<BatchWriteSummary> {
39        self.entities()
40            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
41            .upsert_entities(entities)
42            .await
43    }
44
45    async fn replace_entity_if_unchanged(
46        &self,
47        _entity: Entity,
48        _expected_updated_at: i64,
49        _expected_deleted_at: Option<i64>,
50    ) -> StorageResult<bool> {
51        self.entities()
52            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
53            .replace_entity_if_unchanged(_entity, _expected_updated_at, _expected_deleted_at)
54            .await
55    }
56
57    async fn get_entity(&self, id: Uuid) -> StorageResult<Option<Entity>> {
58        self.entities()
59            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
60            .get_entity(id)
61            .await
62    }
63
64    async fn delete_entity(&self, id: Uuid, mode: DeleteMode) -> StorageResult<bool> {
65        self.entities()
66            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
67            .delete_entity(id, mode)
68            .await
69    }
70
71    async fn query_entities(
72        &self,
73        namespace: &str,
74        filter: EntityFilter,
75        page: PageRequest,
76    ) -> StorageResult<Page<Entity>> {
77        self.entities()
78            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
79            .query_entities(namespace, filter, page)
80            .await
81    }
82
83    async fn query_entities_count_free(
84        &self,
85        _namespace: &str,
86        _filter: EntityFilter,
87        _page: PageRequest,
88    ) -> StorageResult<Page<Entity>> {
89        self.entities()
90            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
91            .query_entities_count_free(_namespace, _filter, _page)
92            .await
93    }
94
95    async fn entity_sequence(&self, _id: Uuid) -> StorageResult<Option<i64>> {
96        self.entities()
97            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
98            .entity_sequence(_id)
99            .await
100    }
101
102    async fn query_entities_after(
103        &self,
104        _namespace: &str,
105        _filter: EntityFilter,
106        _after: Option<SeekCursor>,
107        _limit: u32,
108    ) -> StorageResult<SeekPage<Entity>> {
109        self.entities()
110            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
111            .query_entities_after(_namespace, _filter, _after, _limit)
112            .await
113    }
114
115    async fn count_entities(&self, namespace: &str, filter: EntityFilter) -> StorageResult<u64> {
116        self.entities()
117            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
118            .count_entities(namespace, filter)
119            .await
120    }
121
122    async fn count_entities_by_type(
123        &self,
124        _namespaces: &[String],
125    ) -> StorageResult<Option<EntityTypeCounts>> {
126        self.entities()
127            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
128            .count_entities_by_type(_namespaces)
129            .await
130    }
131
132    async fn get_entity_including_deleted(&self, id: Uuid) -> StorageResult<Option<Entity>> {
133        self.entities()
134            .map_err(|error| map_open_error(error, StorageCapability::Entities, "entities"))?
135            .get_entity_including_deleted(id)
136            .await
137    }
138}