khive_db/backend/core_stores/
entity.rs1use 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}