u/server/src/main.rs
2023-03-04 22:34:40 -05:00

60 lines
1.6 KiB
Rust

use axum::{
extract::DefaultBodyLimit,
routing::{delete, get, post},
Router, Server,
};
use sqlx::SqlitePool;
use std::{net::SocketAddr, path::PathBuf, sync::Arc};
use tokio::net::TcpListener;
use tokio_stream::wrappers::TcpListenerStream;
mod auth;
mod routes;
mod state;
mod utils;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
dotenvy::dotenv().ok();
println!("connecting to database");
let pool = SqlitePool::connect("u.db").await?;
println!("running migrations");
sqlx::migrate!().run(&pool).await?;
utils::check_admin_key(&pool).await?;
let port = std::env::var("U_PORT").unwrap_or_else(|_| "8075".to_string());
let files_dir = std::env::var("U_FILES_DIR").unwrap_or_else(|_| "files".to_string());
let files_dir = PathBuf::from(files_dir);
if !files_dir.exists() {
std::fs::create_dir(&files_dir)?;
}
let state = Arc::new(state::State {
db: pool,
files_dir,
});
let router = Router::default()
.route("/i/:id", get(routes::i))
.route("/i/:id", delete(routes::delete))
.route("/api/upload", post(routes::upload))
.route("/api/new_key", post(routes::new_key))
.layer(DefaultBodyLimit::max(1_000_000_000))
.with_state(Arc::clone(&state));
let addr: SocketAddr = format!("0.0.0.0:{}", port).parse()?;
println!("listening on {}", addr);
let listener = TcpListener::bind(addr).await?;
let stream = TcpListenerStream::new(listener);
let acceptor = hyper::server::accept::from_stream(stream);
Server::builder(acceptor)
.serve(router.into_make_service())
.await?;
Ok(())
}