Skip to content

Commit 3c988c6

Browse files
committed
minor refactor
1 parent 755b726 commit 3c988c6

5 files changed

Lines changed: 82 additions & 208 deletions

File tree

webserver/src/dto/transaction.rs

Lines changed: 2 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use serde::de::value::StrDeserializer;
21
use serde::{Deserialize, Serialize};
32
use subtle_encoding::hex;
43
use validator::Validate;
@@ -42,69 +41,8 @@ pub struct TransactionMostRecentQueryParams {
4241
pub offset: Option<u64>,
4342
#[validate(range(min = 10, max = 30))]
4443
pub size: Option<u64>,
45-
#[serde(default, deserialize_with = "deserialize_kinds_vec")]
44+
#[serde(default)]
4645
pub kind: Vec<TransactionKind>,
47-
#[serde(default, deserialize_with = "deserialize_tokens_vec")]
46+
#[serde(default)]
4847
pub token: Vec<String>,
4948
}
50-
51-
// Parse the comma separated list of tx kinds from the query string into a vec
52-
// of validated tx kinds
53-
#[derive(Deserialize)]
54-
#[serde(untagged)]
55-
enum KindList {
56-
List(Vec<TransactionKind>),
57-
Csv(String),
58-
}
59-
60-
fn deserialize_kinds_vec<'de, D>(
61-
deserializer: D,
62-
) -> Result<Vec<TransactionKind>, D::Error>
63-
where
64-
D: serde::Deserializer<'de>,
65-
{
66-
let opt = Option::<KindList>::deserialize(deserializer)?;
67-
let vec = match opt {
68-
None => Vec::new(),
69-
Some(KindList::List(v)) => v,
70-
Some(KindList::Csv(s)) => s
71-
.split(',')
72-
.filter(|p| !p.is_empty())
73-
.map(|p| p.trim())
74-
.map(|p| {
75-
TransactionKind::deserialize(StrDeserializer::<D::Error>::new(
76-
p,
77-
))
78-
})
79-
.collect::<Result<Vec<_>, _>>()?,
80-
};
81-
Ok(vec)
82-
}
83-
84-
// Parse the comma separated list of token addresses from the query string into
85-
// a vec of strings
86-
#[derive(Deserialize)]
87-
#[serde(untagged)]
88-
enum TokenList {
89-
List(Vec<String>),
90-
Csv(String),
91-
}
92-
93-
fn deserialize_tokens_vec<'de, D>(
94-
deserializer: D,
95-
) -> Result<Vec<String>, D::Error>
96-
where
97-
D: serde::Deserializer<'de>,
98-
{
99-
let opt = Option::<TokenList>::deserialize(deserializer)?;
100-
let vec = match opt {
101-
None => Vec::new(),
102-
Some(TokenList::List(v)) => v,
103-
Some(TokenList::Csv(s)) => s
104-
.split(',')
105-
.filter(|p| !p.is_empty())
106-
.map(|p| p.trim().to_string())
107-
.collect(),
108-
};
109-
Ok(vec)
110-
}

webserver/src/entity/transaction.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,43 @@ impl From<TransactionKindDb> for TransactionKind {
7777
}
7878
}
7979

80+
impl From<TransactionKind> for TransactionKindDb {
81+
fn from(value: TransactionKind) -> Self {
82+
match value {
83+
TransactionKind::TransparentTransfer => Self::TransparentTransfer,
84+
TransactionKind::ShieldedTransfer => Self::ShieldedTransfer,
85+
TransactionKind::ShieldingTransfer => Self::ShieldingTransfer,
86+
TransactionKind::UnshieldingTransfer => Self::UnshieldingTransfer,
87+
TransactionKind::MixedTransfer => Self::MixedTransfer,
88+
TransactionKind::Bond => Self::Bond,
89+
TransactionKind::Redelegation => Self::Redelegation,
90+
TransactionKind::Unbond => Self::Unbond,
91+
TransactionKind::Withdraw => Self::Withdraw,
92+
TransactionKind::ClaimRewards => Self::ClaimRewards,
93+
TransactionKind::VoteProposal => Self::VoteProposal,
94+
TransactionKind::InitProposal => Self::InitProposal,
95+
TransactionKind::ChangeMetadata => Self::ChangeMetadata,
96+
TransactionKind::ChangeCommission => Self::ChangeCommission,
97+
TransactionKind::RevealPk => Self::RevealPk,
98+
TransactionKind::Unknown => Self::Unknown,
99+
TransactionKind::IbcMsgTransfer => Self::IbcMsgTransfer,
100+
TransactionKind::IbcTransparentTransfer => {
101+
Self::IbcTransparentTransfer
102+
}
103+
TransactionKind::IbcShieldingTransfer => Self::IbcShieldingTransfer,
104+
TransactionKind::IbcUnshieldingTransfer => {
105+
Self::IbcUnshieldingTransfer
106+
}
107+
TransactionKind::BecomeValidator => Self::BecomeValidator,
108+
TransactionKind::ReactivateValidator => Self::ReactivateValidator,
109+
TransactionKind::DeactivateValidator => Self::DeactivateValidator,
110+
TransactionKind::UnjailValidator => Self::UnjailValidator,
111+
TransactionKind::ChangeConsensusKey => Self::ChangeConsensusKey,
112+
TransactionKind::InitAccount => Self::InitAccount,
113+
}
114+
}
115+
}
116+
80117
#[derive(Debug, Clone)]
81118
pub struct WrapperTransaction {
82119
pub id: Id,

webserver/src/handler/transaction.rs

Lines changed: 30 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use axum_extra::extract::Query;
55
use axum_macros::debug_handler;
66
use serde_json;
77

8+
use crate::constant::ITEM_PER_PAGE;
89
use crate::dto::transaction::{
910
TransactionHistoryQueryParams, TransactionIdParam,
1011
TransactionMostRecentQueryParams,
@@ -106,83 +107,55 @@ pub async fn get_most_recent_transactions(
106107
State(state): State<CommonState>,
107108
) -> Result<Json<Vec<WrapperTransactionResponse>>, ApiError> {
108109
let offset = query.offset.unwrap_or(0);
109-
let size = query.size.unwrap_or(10);
110+
let size = query.size.unwrap_or(ITEM_PER_PAGE);
110111
let kind = query.kind;
111112
let token = query.token;
112113

113114
let filters_present = !kind.is_empty() || !token.is_empty();
114115

115-
if !filters_present {
116-
// If no filters are needed, we can just page over the wrapper tx table
117-
// directly
118-
let transactions = state
116+
let wrappers = if !filters_present {
117+
state
119118
.transaction_service
120119
.get_most_recent_transactions(offset, size)
121-
.await?;
122-
123-
let inner_txs = transactions
124-
.iter()
125-
.map(|tx| {
126-
state
127-
.transaction_service
128-
.get_inner_tx_by_wrapper_id(tx.id.to_string())
129-
})
130-
.collect::<Vec<_>>();
131-
132-
let inner_txs = futures::future::join_all(inner_txs).await;
133-
134-
let response = transactions
135-
.into_iter()
136-
.zip(inner_txs.into_iter())
137-
.map(|(tx, inner_tx_result)| {
138-
let inner_txs = inner_tx_result.unwrap_or_default();
139-
WrapperTransactionResponse::new(tx, inner_txs)
140-
})
141-
.collect();
142-
143-
return Ok(Json(response));
144-
}
145-
146-
// Filtering by tx kind and/or transfer token:
147-
// First, search for and return 'size' number of wrappers that have at least
148-
// one inner tx matching the filters
149-
let candidates = state
150-
.transaction_service
151-
.get_filtered_most_recent_wrappers(
152-
offset,
153-
size,
154-
kind.clone(),
155-
token.clone(),
156-
)
157-
.await?;
120+
.await?
121+
} else {
122+
state
123+
.transaction_service
124+
.get_filtered_most_recent_wrappers(
125+
offset,
126+
size,
127+
kind.clone(),
128+
token.clone(),
129+
)
130+
.await?
131+
};
158132

159-
// Filter the corresponding inner txs to include only the matching inners in
160-
// the response
161-
let inner_futs = candidates.iter().map(|tx| {
133+
let inner_futs = wrappers.iter().map(|tx| {
162134
state
163135
.transaction_service
164136
.get_inner_tx_by_wrapper_id(tx.id.to_string())
165137
});
166-
167138
let inner_results = futures::future::join_all(inner_futs).await;
168139

169-
let response = candidates
140+
let response = wrappers
170141
.into_iter()
171142
.zip(inner_results.into_iter())
172143
.filter_map(|(tx, inner_res)| {
173144
let mut inners = inner_res.unwrap_or_default();
174145

175-
if !kind.is_empty() {
176-
inners.retain(|inner_tx| kind.contains(&inner_tx.kind));
177-
}
178-
if !token.is_empty() {
179-
inners.retain(|inner_tx| {
180-
filter_inner_tx_by_tokens(inner_tx, &token)
181-
});
182-
}
146+
if filters_present {
147+
if !kind.is_empty() {
148+
inners.retain(|inner_tx| kind.contains(&inner_tx.kind));
149+
}
150+
if !token.is_empty() {
151+
inners.retain(|inner_tx| {
152+
filter_inner_tx_by_tokens(inner_tx, &token)
153+
});
154+
}
183155

184-
if inners.is_empty() {
185-
return None;
156+
if inners.is_empty() {
157+
return None;
158+
}
186159
}
187160

188161
Some(WrapperTransactionResponse::new(tx, inners))

webserver/src/repository/transaction.rs

Lines changed: 5 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use orm::transactions::{
1515

1616
use super::utils::{Paginate, PaginatedResponseDb};
1717
use crate::appstate::AppState;
18-
use crate::entity::transaction::TransactionKind;
1918

2019
#[derive(Clone)]
2120
pub struct TransactionRepository {
@@ -60,7 +59,7 @@ pub trait TransactionRepositoryTrait {
6059
&self,
6160
offset: i64,
6261
size: i32,
63-
kinds: Vec<TransactionKind>,
62+
kinds: Vec<TransactionKindDb>,
6463
tokens: Vec<String>,
6564
) -> Result<Vec<WrapperTransactionDb>, String>;
6665
}
@@ -190,7 +189,7 @@ impl TransactionRepositoryTrait for TransactionRepository {
190189
&self,
191190
offset: i64,
192191
size: i32,
193-
kinds: Vec<TransactionKind>,
192+
kinds: Vec<TransactionKindDb>,
194193
tokens: Vec<String>,
195194
) -> Result<Vec<WrapperTransactionDb>, String> {
196195
let conn = self.app_state.get_db_connection().await;
@@ -201,92 +200,12 @@ impl TransactionRepositoryTrait for TransactionRepository {
201200

202201
// 1) Kind filter using typed enum mapping (apply as its own EXISTS)
203202
if !kinds.is_empty() {
204-
fn map_kind(k: &TransactionKind) -> TransactionKindDb {
205-
match k {
206-
TransactionKind::TransparentTransfer => {
207-
TransactionKindDb::TransparentTransfer
208-
}
209-
TransactionKind::ShieldedTransfer => {
210-
TransactionKindDb::ShieldedTransfer
211-
}
212-
TransactionKind::ShieldingTransfer => {
213-
TransactionKindDb::ShieldingTransfer
214-
}
215-
TransactionKind::UnshieldingTransfer => {
216-
TransactionKindDb::UnshieldingTransfer
217-
}
218-
TransactionKind::MixedTransfer => {
219-
TransactionKindDb::MixedTransfer
220-
}
221-
TransactionKind::Bond => TransactionKindDb::Bond,
222-
TransactionKind::Redelegation => {
223-
TransactionKindDb::Redelegation
224-
}
225-
TransactionKind::Unbond => TransactionKindDb::Unbond,
226-
TransactionKind::Withdraw => {
227-
TransactionKindDb::Withdraw
228-
}
229-
TransactionKind::ClaimRewards => {
230-
TransactionKindDb::ClaimRewards
231-
}
232-
TransactionKind::VoteProposal => {
233-
TransactionKindDb::VoteProposal
234-
}
235-
TransactionKind::InitProposal => {
236-
TransactionKindDb::InitProposal
237-
}
238-
TransactionKind::ChangeMetadata => {
239-
TransactionKindDb::ChangeMetadata
240-
}
241-
TransactionKind::ChangeCommission => {
242-
TransactionKindDb::ChangeCommission
243-
}
244-
TransactionKind::RevealPk => {
245-
TransactionKindDb::RevealPk
246-
}
247-
TransactionKind::IbcMsgTransfer => {
248-
TransactionKindDb::IbcMsgTransfer
249-
}
250-
TransactionKind::IbcTransparentTransfer => {
251-
TransactionKindDb::IbcTransparentTransfer
252-
}
253-
TransactionKind::IbcShieldingTransfer => {
254-
TransactionKindDb::IbcShieldingTransfer
255-
}
256-
TransactionKind::IbcUnshieldingTransfer => {
257-
TransactionKindDb::IbcUnshieldingTransfer
258-
}
259-
TransactionKind::BecomeValidator => {
260-
TransactionKindDb::BecomeValidator
261-
}
262-
TransactionKind::DeactivateValidator => {
263-
TransactionKindDb::DeactivateValidator
264-
}
265-
TransactionKind::ReactivateValidator => {
266-
TransactionKindDb::ReactivateValidator
267-
}
268-
TransactionKind::UnjailValidator => {
269-
TransactionKindDb::UnjailValidator
270-
}
271-
TransactionKind::ChangeConsensusKey => {
272-
TransactionKindDb::ChangeConsensusKey
273-
}
274-
TransactionKind::InitAccount => {
275-
TransactionKindDb::InitAccount
276-
}
277-
TransactionKind::Unknown => TransactionKindDb::Unknown,
278-
}
279-
}
280-
281-
let kinds_db: Vec<TransactionKindDb> =
282-
kinds.iter().map(map_kind).collect();
283-
284203
let inner_by_kind = inner_transactions::table
285204
.filter(
286205
inner_transactions::dsl::wrapper_id
287206
.eq(wrapper_transactions::dsl::id),
288207
)
289-
.filter(inner_transactions::dsl::kind.eq_any(kinds_db));
208+
.filter(inner_transactions::dsl::kind.eq_any(kinds));
290209

291210
outer = outer.filter(exists(inner_by_kind));
292211
}
@@ -295,7 +214,7 @@ impl TransactionRepositoryTrait for TransactionRepository {
295214
// EXISTS)
296215
if !tokens.is_empty() {
297216
// regular transfer kinds (non-IBC)
298-
let regular_kinds: Vec<TransactionKindDb> = vec![
217+
let regular_kinds = [
299218
TransactionKindDb::TransparentTransfer,
300219
TransactionKindDb::ShieldedTransfer,
301220
TransactionKindDb::ShieldingTransfer,
@@ -304,7 +223,7 @@ impl TransactionRepositoryTrait for TransactionRepository {
304223
];
305224

306225
// IBC transfer kinds
307-
let ibc_kinds: Vec<TransactionKindDb> = vec![
226+
let ibc_kinds = [
308227
TransactionKindDb::IbcTransparentTransfer,
309228
TransactionKindDb::IbcShieldingTransfer,
310229
TransactionKindDb::IbcUnshieldingTransfer,

0 commit comments

Comments
 (0)