| 166 | |
| 167 | #[actix_web::main] |
| 168 | async fn start() -> std::io::Result<()> { |
| 169 | std::env::set_var("RUST_LOG", "debug"); |
| 170 | tracing_subscriber::fmt::init(); |
| 171 | |
| 172 | // get env vars |
| 173 | dotenvy::dotenv().ok(); |
| 174 | let db_url = env::var("DATABASE_URL").expect("DATABASE_URL is not set in .env file"); |
| 175 | let host = env::var("HOST").expect("HOST is not set in .env file"); |
| 176 | let port = env::var("PORT").expect("PORT is not set in .env file"); |
| 177 | let server_url = format!("{host}:{port}"); |
| 178 | |
| 179 | // establish connection to database and apply migrations |
| 180 | // -> create post table if not exists |
| 181 | let conn = Database::connect(&db_url).await.unwrap(); |
| 182 | Migrator::up(&conn, None).await.unwrap(); |
| 183 | |
| 184 | // load tera templates and build app state |
| 185 | let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap(); |
| 186 | let state = AppState { templates, conn }; |
| 187 | |
| 188 | // create server and try to serve over socket if possible |
| 189 | let mut listenfd = ListenFd::from_env(); |
| 190 | let mut server = HttpServer::new(move || { |
| 191 | App::new() |
| 192 | .service(Fs::new("/static", "./api/static")) |
| 193 | .app_data(web::Data::new(state.clone())) |
| 194 | .wrap(middleware::Logger::default()) // enable logger |
| 195 | .default_service(web::route().to(not_found)) |
| 196 | .configure(init) |
| 197 | }); |
| 198 | |
| 199 | server = match listenfd.take_tcp_listener(0)? { |
| 200 | Some(listener) => server.listen(listener)?, |
| 201 | None => server.bind(&server_url)?, |
| 202 | }; |
| 203 | |
| 204 | println!("Starting server at {server_url}"); |
| 205 | server.run().await?; |
| 206 | |
| 207 | Ok(()) |
| 208 | } |
| 209 | |
| 210 | fn init(cfg: &mut web::ServiceConfig) { |
| 211 | cfg.service(list); |