47 lines
1.4 KiB
Rust
47 lines
1.4 KiB
Rust
use std::net::SocketAddr;
|
|
use axum::Router;
|
|
use axum::routing::{get, post};
|
|
use sqlx::migrate::MigrateError;
|
|
use tokio::net::TcpListener;
|
|
use crate::config::IceBingoConfig;
|
|
use crate::model::app::AppState;
|
|
|
|
mod config;
|
|
pub(crate) mod model;
|
|
mod api;
|
|
pub(crate) mod error;
|
|
pub(crate) mod util;
|
|
mod database;
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
println!("Starting up");
|
|
let config = IceBingoConfig::load("config.yaml")
|
|
.await.expect("Unable to load config");
|
|
|
|
let state: AppState = AppState::new(config.clone()).await.unwrap();
|
|
migrate(state.clone()).await.expect("Database migration failed");
|
|
|
|
let router = build_router(state);
|
|
let listener = listen(config).await;
|
|
axum::serve::serve(listener, router).await.unwrap()
|
|
}
|
|
|
|
fn build_router(state: AppState) -> Router {
|
|
Router::new()
|
|
.route("/webhook/travelynx", post(api::handlers::webhook::receive_travelynx))
|
|
.route("/card/", get(api::handlers::bingo_card::get))
|
|
.with_state(state)
|
|
}
|
|
|
|
async fn listen(config: IceBingoConfig) -> TcpListener {
|
|
let socket_addr: SocketAddr = (config.http.bind_address, config.http.port).into();
|
|
println!("Listening on {}", socket_addr);
|
|
TcpListener::bind(socket_addr).await.unwrap()
|
|
}
|
|
|
|
async fn migrate(state: AppState) -> Result<(), MigrateError>{
|
|
sqlx::migrate!("./src/sql/migrations")
|
|
.run(&mut state.db.acquire().await?)
|
|
.await
|
|
} |