Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/database/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,12 @@ impl<'q> Model {
let offset = pagination.offset.unwrap_or(0);
let limit = limit.clamp(1, 1000);

let q = r#"SELECT * FROM transactions ORDER BY date DESC LIMIT $1 OFFSET $2;"#;
let q = match pagination.exclude_mined {
Some(true) => {
r#"SELECT * FROM transactions WHERE transaction_type != 'mined' ORDER BY date DESC LIMIT $1 OFFSET $2;"#
}
_ => r#"SELECT * FROM transactions ORDER BY date DESC LIMIT $1 OFFSET $2;"#,
};

sqlx::query_as(q)
.bind(limit)
Expand Down
20 changes: 20 additions & 0 deletions src/database/wallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,4 +296,24 @@ impl<'q> Model {

Ok(models)
}

pub async fn fetch_by_address_names<S, E>(pool: E, address: S) -> Result<Option<Self>>
where
S: AsRef<str>,
E: 'q + Executor<'q, Database = Postgres>,
{
let address = address.as_ref();

let q = r#"SELECT wallets.*,
COUNT(names.id) AS NAMES
FROM wallets
LEFT JOIN NAMES ON wallets.address = names.owner
WHERE wallets.address = $1 GROUP BY wallets.id
ORDER BY NAMES DESC"#;
sqlx::query_as(q)
.bind(address)
.fetch_optional(pool)
.await
.map_err(DatabaseError::Sqlx)
}
}
6 changes: 6 additions & 0 deletions src/models/krist/addresses.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@ impl From<wallet::Model> for AddressJson {
}
}

#[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize, Default)]
pub struct AddressGetQuery {
#[serde(alias = "fetchNames")]
pub fetch_names: Option<bool>,
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
10 changes: 8 additions & 2 deletions src/routes/krist/wallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ use crate::AppState;
use crate::database::{ModelExt, name::Model as Name, wallet::Model as Wallet};
use crate::errors::krist::KristError;
use crate::errors::krist::address::AddressError;
use crate::models::krist::addresses::{AddressJson, AddressListResponse, AddressResponse};
use crate::models::krist::addresses::{
AddressGetQuery, AddressJson, AddressListResponse, AddressResponse,
};
use crate::models::krist::names::{NameJson, NameListResponse};
use crate::models::krist::transactions::{
AddressTransactionQuery, TransactionJson, TransactionListResponse,
Expand Down Expand Up @@ -46,10 +48,14 @@ async fn wallet_list(
async fn wallet_get(
state: web::Data<AppState>,
address: web::Path<String>,
query: web::Query<AddressGetQuery>,
) -> Result<HttpResponse, KristError> {
let address = address.into_inner();

let wallet = Wallet::fetch_by_address(&state.pool, &address).await?;
let wallet = match query.0.fetch_names {
Some(true) => Wallet::fetch_by_address_names(&state.pool, &address).await?,
_ => Wallet::fetch_by_address(&state.pool, &address).await?,
};

wallet
.map(|addr| AddressResponse {
Expand Down
4 changes: 4 additions & 0 deletions src/routes/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,17 @@ pub fn config(cfg: &mut web::ServiceConfig) {

#[derive(Debug, serde::Deserialize, serde::Serialize)]
pub struct PaginationParams {
#[serde(alias = "excludeMined")]
// Only used on /transactions routes
pub exclude_mined: Option<bool>,
pub limit: Option<i64>,
pub offset: Option<i64>,
}

impl Default for PaginationParams {
fn default() -> Self {
Self {
exclude_mined: None,
limit: Some(50),
offset: Some(0),
}
Expand Down