mnemonic-hash-checker: initial commit
This commit is contained in:
parent
51c8b33ca0
commit
b74747d443
mnemonic-hash-checker
|
@ -0,0 +1 @@
|
|||
target
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,19 @@
|
|||
[package]
|
||||
name = "mnemonic-hash-checker"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
axum = { version = "0.6.20", features = ["headers", "macros", "tracing"] }
|
||||
clap = { version = "4.3.19", features = ["derive"] }
|
||||
color-eyre = "0.6.2"
|
||||
deadpool-postgres = "0.10.5"
|
||||
serde = { version = "1.0.181", features = ["serde_derive"] }
|
||||
tokio = { version = "1.29.1", features = ["full", "fs", "tracing"] }
|
||||
tokio-postgres = "0.7.8"
|
||||
tower-http = { version = "0.4.3", features = ["trace", "catch-panic"] }
|
||||
tracing = "0.1.37"
|
||||
tracing-error = "0.2.0"
|
||||
tracing-subscriber = { version = "0.3.17", features = ["env-filter", "fmt", "ansi", "json"] }
|
|
@ -0,0 +1,95 @@
|
|||
use std::net::SocketAddr;
|
||||
use std::sync::Arc;
|
||||
|
||||
use axum::{extract::Path, routing::get, Extension, Json, Router};
|
||||
|
||||
use color_eyre::eyre::Result;
|
||||
|
||||
use deadpool_postgres::{Config, ManagerConfig, Pool, RecyclingMethod, Runtime};
|
||||
use tokio_postgres::NoTls;
|
||||
|
||||
use tower_http::catch_panic::CatchPanicLayer;
|
||||
use tower_http::trace::TraceLayer;
|
||||
|
||||
use tracing_subscriber::filter::{EnvFilter, LevelFilter};
|
||||
use tracing_subscriber::fmt::format::FmtSpan;
|
||||
use tracing_subscriber::prelude::*;
|
||||
|
||||
use tracing::{debug, info};
|
||||
|
||||
struct State {
|
||||
pool: Pool,
|
||||
}
|
||||
|
||||
fn setup_registry() {
|
||||
let envfilter = EnvFilter::builder()
|
||||
.with_default_directive(LevelFilter::DEBUG.into())
|
||||
.from_env_lossy();
|
||||
tracing_subscriber::registry()
|
||||
.with(envfilter)
|
||||
.with(tracing_subscriber::fmt::layer().with_span_events(FmtSpan::CLOSE))
|
||||
.with(tracing_error::ErrorLayer::default())
|
||||
.init();
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(pool))]
|
||||
async fn check_hash(hash: &str, pool: &Pool) -> Result<bool> {
|
||||
let client = pool.get().await?;
|
||||
let query = client
|
||||
.prepare_cached("SELECT hash FROM testing WHERE hash = $1")
|
||||
.await?;
|
||||
let rows = client.query(&query, &[&hash]).await?;
|
||||
if let Some(row) = rows.get(0) {
|
||||
let retrieved_hash: String = row.try_get(0)?;
|
||||
Ok(hash == retrieved_hash)
|
||||
} else {
|
||||
Ok(false)
|
||||
}
|
||||
}
|
||||
|
||||
// Note: Exposes *zero* information of potential errors to clients.
|
||||
#[tracing::instrument(skip(hash, state))]
|
||||
async fn check_hash_slug(
|
||||
Path(hash): Path<String>,
|
||||
Extension(state): Extension<Arc<State>>,
|
||||
) -> Json<Option<bool>> {
|
||||
let result = check_hash(&hash, &state.pool).await;
|
||||
if let Err(e) = &result {
|
||||
debug!(%e, "Error while performing lookup");
|
||||
}
|
||||
Json(result.ok())
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
setup_registry();
|
||||
color_eyre::install()?;
|
||||
|
||||
let addr: SocketAddr = "0.0.0.0:8000".parse()?;
|
||||
let mut config = Config::new();
|
||||
config.dbname = Some("postgres".to_string());
|
||||
config.host = Some("localhost".to_string());
|
||||
config.password = Some("sandwich".to_string());
|
||||
config.port = Some(5432);
|
||||
config.user = Some("postgres".to_string());
|
||||
config.manager = Some(ManagerConfig {
|
||||
recycling_method: RecyclingMethod::Fast,
|
||||
});
|
||||
let pool = config.create_pool(Some(Runtime::Tokio1), NoTls)?;
|
||||
|
||||
let state = State { pool };
|
||||
|
||||
let app = Router::new()
|
||||
.route("/check/:hash", get(check_hash_slug))
|
||||
.layer(CatchPanicLayer::new())
|
||||
.layer(Extension(Arc::new(state)))
|
||||
.layer(TraceLayer::new_for_http());
|
||||
|
||||
info!("server go nyoom");
|
||||
|
||||
axum::Server::bind(&addr)
|
||||
.serve(app.into_make_service())
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue