mod api; mod entity; mod service; use std::env; use actix_files::Files; use actix_web::{web, App, HttpServer, middleware}; use listenfd::ListenFd; use sea_orm::{Database, DatabaseConnection}; use migration::{Migrator, MigratorTrait}; #[derive(Debug, Clone)] struct AppState { conn: DatabaseConnection, } #[actix_web::main] async fn main() -> std::io::Result<()> { std::env::set_var("RUST_LOG", "debug"); tracing_subscriber::fmt::init(); // get env vars dotenvy::dotenv().ok(); let db_url = env::var("DATABASE_URL").expect("DATABASE_URL is not set in .env file"); let host = env::var("HOST").expect("HOST is not set in .env file"); let port = env::var("PORT").expect("PORT is not set in .env file"); let server_url = format!("{host}:{port}"); // establish connection to database and apply migrations // -> create post table if not exists let conn = Database::connect(&db_url).await.unwrap(); Migrator::up(&conn, None).await.unwrap(); let state = AppState { conn }; // create server and try to serve over socket if possible let mut listenfd = ListenFd::from_env(); let mut server = HttpServer::new(move || { App::new() .service(Files::new("/static", "./static")) .app_data(web::Data::new(state.clone())) .wrap(middleware::Logger::default()) .configure(init) }); server = match listenfd.take_tcp_listener(0)? { Some(listener) => server.listen(listener)?, None => server.bind(&server_url)?, }; println!("Starting server at {server_url}"); server.run().await?; Ok(()) } fn init(cfg: &mut web::ServiceConfig) { cfg.service(api::tag::create); cfg.service(api::tag::delete); cfg.service(api::tag::list); }