-
Notifications
You must be signed in to change notification settings - Fork 5
/
staked_ada_get.rs
65 lines (58 loc) · 1.8 KB
/
staked_ada_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
//! Implementation of the GET `/staked_ada` endpoint
use poem_extensions::{
response,
UniResponse::{T200, T400, T404},
};
use poem_openapi::payload::Json;
use crate::{
event_db::{error::Error as DBError, follower::SlotNumber},
service::{
common::{
objects::cardano::{
network::Network, stake_address::StakeAddress, stake_info::StakeInfo,
},
responses::{
resp_2xx::OK,
resp_4xx::{ApiValidationError, NotFound},
resp_5xx::{server_error_response, ServerError, ServiceUnavailable},
},
},
utilities::check_network,
},
state::State,
};
/// # All Responses
pub(crate) type AllResponses = response! {
200: OK<Json<StakeInfo>>,
400: ApiValidationError,
404: NotFound,
500: ServerError,
503: ServiceUnavailable,
};
/// # GET `/staked_ada`
pub(crate) async fn endpoint(
state: &State, stake_address: StakeAddress, provided_network: Option<Network>,
slot_num: Option<SlotNumber>,
) -> AllResponses {
let event_db = state.event_db();
let date_time = slot_num.unwrap_or(SlotNumber::MAX);
let stake_credential = stake_address.payload().as_hash().to_vec();
let network = match check_network(stake_address.network(), provided_network) {
Ok(network) => network,
Err(err) => return T400(err),
};
// get the total utxo amount from the database
match event_db
.total_utxo_amount(stake_credential, network.into(), date_time)
.await
{
Ok((amount, slot_number)) => {
T200(OK(Json(StakeInfo {
amount,
slot_number,
})))
},
Err(DBError::NotFound) => T404(NotFound),
Err(err) => server_error_response!("{err}"),
}
}