captains-log/backend/src/main.rs
Drew Galbraith 4552c347c6
Some checks failed
Check / Backend (push) Successful in 6m55s
Check / Frontend (push) Successful in 2m2s
Docker Build / Build and Push Backend Image (push) Failing after 11m21s
Docker Build / Build and Push Frontend Image (push) Successful in 5m44s
Create a plan for implementing projects and also create the backend API. (#19)
Creates projects to organize tasks under. (Note the migration also contains the tables for creating folders for projects as well because adding foreign keys is a PITA in sqlite apparently).

Reviewed-on: #19
Co-authored-by: Drew Galbraith <drew@tiramisu.one>
Co-committed-by: Drew Galbraith <drew@tiramisu.one>
2025-10-28 04:13:12 +00:00

51 lines
1.5 KiB
Rust

use axum::{Router, routing::get};
use tower_http::cors::{Any, CorsLayer};
mod database;
mod models;
mod services;
#[tokio::main]
async fn main() {
tracing_subscriber::fmt::init();
let database_url = std::env::var("DATABASE_URL").unwrap_or("sqlite:local.db".to_string());
let binding = database::DatabaseConfig { database_url };
let pool = database::create_pool(&binding)
.await
.expect("Failed to create database pool");
sqlx::migrate!().run(&pool).await.expect("Failed t");
let cors = if let Ok(domain) = std::env::var("CAPTAINS_LOG_URL") {
CorsLayer::new()
.allow_origin([domain.parse::<axum::http::HeaderValue>().unwrap()])
.allow_methods(Any)
.allow_headers(Any)
} else {
CorsLayer::new()
.allow_origin(Any)
.allow_methods(Any)
.allow_headers(Any)
};
let app = Router::new()
.route("/health", get(health))
.nest("/api/tasks", services::create_task_router())
.nest("/api/projects", services::create_project_router())
.layer(cors)
.with_state(pool);
let port = std::env::var("PORT").unwrap_or("3000".to_string());
let addr = format!("0.0.0.0:{}", port);
let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
tracing::info!("API Server listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap();
}
async fn health() -> &'static str {
"Ok"
}