Files
api/src/main.rs

51 lines
1.5 KiB
Rust

use std::env::var;
use std::error::Error;
use axum::http::{HeaderValue, Method};
use axum::routing::get;
use axum::{Router, serve};
use dotenvy::dotenv;
use sqlx::postgres::PgPool;
use tokio::net::TcpListener;
use tower_http::cors::CorsLayer;
use tower_sessions::cookie::SameSite;
use tower_sessions::{SessionManagerLayer};
use tower_sessions_sqlx_store::PostgresStore;
use tower_sessions_sqlx_store::sqlx::PgPool as SessionPgPool;
mod error;
mod users;
use users::{login, me, logout};
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
dotenv()?;
let db_url = var("DATABASE_URL")?;
let pool = PgPool::connect(&db_url).await?;
let session_pool = SessionPgPool::connect(&db_url).await?;
let session_store = PostgresStore::new(session_pool);
session_store.migrate().await?;
let session = SessionManagerLayer::new(session_store)
.with_secure(false)
.with_same_site(SameSite::Lax);
let app = Router::new()
.route("/status", get(status))
.route("/me", get(me))
.route("/login", get(login))
.route("/logout", get(logout))
.layer(
CorsLayer::new()
.allow_origin("http://localhost:5173".parse::<HeaderValue>().unwrap())
.allow_methods([Method::GET])
.allow_credentials(true),
)
.layer(session)
.with_state(pool);
let listener = TcpListener::bind("0.0.0.0:8080").await?;
Ok(serve(listener, app).await?)
}
async fn status() -> &'static str {
"api online"
}