-
Notifications
You must be signed in to change notification settings - Fork 5
/
date_time_to_slot_number_get.rs
89 lines (80 loc) · 2.5 KB
/
date_time_to_slot_number_get.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//! Implementation of the GET `/date_time_to_slot_number` endpoint
use poem_extensions::{response, UniResponse::T200};
use poem_openapi::payload::Json;
use crate::{
event_db::{
error::Error as DBError,
follower::{DateTime, SlotInfoQueryType},
},
service::common::{
objects::cardano::{
network::Network,
slot_info::{Slot, SlotInfo},
},
responses::{
resp_2xx::OK,
resp_4xx::ApiValidationError,
resp_5xx::{server_error_response, ServerError, ServiceUnavailable},
},
},
state::State,
};
/// # All Responses
pub(crate) type AllResponses = response! {
200: OK<Json<SlotInfo>>,
400: ApiValidationError,
500: ServerError,
503: ServiceUnavailable,
};
/// # GET `/date_time_to_slot_number`
#[allow(clippy::unused_async)]
pub(crate) async fn endpoint(
state: &State, date_time: Option<DateTime>, network: Option<Network>,
) -> AllResponses {
let event_db = state.event_db();
let date_time = date_time.unwrap_or_else(chrono::Utc::now);
let network = network.unwrap_or(Network::Mainnet);
let (previous, current, next) = tokio::join!(
event_db.get_slot_info(
date_time,
network.clone().into(),
SlotInfoQueryType::Previous
),
event_db.get_slot_info(
date_time,
network.clone().into(),
SlotInfoQueryType::Current
),
event_db.get_slot_info(date_time, network.into(), SlotInfoQueryType::Next)
);
let process_slot_info_result = |slot_info_result| {
match slot_info_result {
Ok((slot_number, block_hash, block_time)) => {
Ok(Some(Slot {
slot_number,
block_hash: From::from(block_hash),
block_time,
}))
},
Err(DBError::NotFound) => Ok(None),
Err(err) => Err(err),
}
};
let current = match process_slot_info_result(current) {
Ok(current) => current,
Err(err) => return server_error_response!("{err}"),
};
let previous = match process_slot_info_result(previous) {
Ok(current) => current,
Err(err) => return server_error_response!("{err}"),
};
let next = match process_slot_info_result(next) {
Ok(current) => current,
Err(err) => return server_error_response!("{err}"),
};
T200(OK(Json(SlotInfo {
previous,
current,
next,
})))
}