-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmountain.rs
71 lines (60 loc) · 2.49 KB
/
mountain.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use crate::model::mountain::{MountainDocument, MountainFindBoxCommand, MountainFindCommand};
use crate::repository::MongoDBRepositoryImpl;
use async_trait::async_trait;
use futures::stream::TryStreamExt;
use mongodb::bson::doc;
use mountix_kernel::model::mountain::{
Mountain, MountainBoxSearchCondition, MountainSearchCondition,
};
use mountix_kernel::model::Id;
use mountix_kernel::repository::mountain::MountainRepository;
#[async_trait]
impl MountainRepository for MongoDBRepositoryImpl<Mountain> {
async fn get(&self, id: Id<Mountain>) -> anyhow::Result<Option<Mountain>> {
let collection = self.db.0.collection::<MountainDocument>("mountains");
let filter = doc! {"_id": id.value};
let mountain_doc = collection.find_one(filter, None).await?;
match mountain_doc {
Some(md) => Ok(Some(md.try_into()?)),
None => Ok(None),
}
}
async fn get_count(&self, search_condition: MountainSearchCondition) -> anyhow::Result<u64> {
let collection = self.db.0.collection::<MountainDocument>("mountains");
let find_command: MountainFindCommand = search_condition.try_into()?;
let count = collection
.count_documents(find_command.filter, None)
.await?;
Ok(count)
}
async fn find(
&self,
search_condition: MountainSearchCondition,
) -> anyhow::Result<Vec<Mountain>> {
let collection = self.db.0.collection::<MountainDocument>("mountains");
let find_command: MountainFindCommand = search_condition.try_into()?;
let mut mountain_doc_list = collection
.find(find_command.filter, find_command.options)
.await?;
let mut mountains: Vec<Mountain> = Vec::new();
while let Some(md) = mountain_doc_list.try_next().await? {
mountains.push(md.try_into()?);
}
Ok(mountains)
}
async fn find_box(
&self,
search_condition: MountainBoxSearchCondition,
) -> anyhow::Result<Vec<Mountain>> {
let collection = self.db.0.collection::<MountainDocument>("mountains");
let find_command: MountainFindBoxCommand = search_condition.try_into()?;
let mut mountain_doc_list = collection
.find(find_command.filter, find_command.options)
.await?;
let mut mountains: Vec<Mountain> = Vec::new();
while let Some(md) = mountain_doc_list.try_next().await? {
mountains.push(md.try_into()?);
}
Ok(mountains)
}
}