2024-06-24 22:46:04 +02:00
|
|
|
// SPDX-FileCopyrightText: 2024 Simon Bruder <simon@sbruder.de>
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
|
|
|
|
use std::env;
|
|
|
|
|
|
|
|
use actix_web::{web, App, HttpServer};
|
2024-07-07 14:55:05 +02:00
|
|
|
use diesel::pg::Pg;
|
|
|
|
use diesel_async::async_connection_wrapper::AsyncConnectionWrapper;
|
|
|
|
use diesel_async::pg::AsyncPgConnection;
|
|
|
|
use diesel_async::pooled_connection::deadpool::Pool;
|
|
|
|
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
|
|
|
|
use diesel_async::AsyncConnection;
|
2024-06-24 22:46:04 +02:00
|
|
|
use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
|
2024-06-25 13:30:51 +02:00
|
|
|
use log::{debug, info};
|
2024-06-24 22:46:04 +02:00
|
|
|
|
|
|
|
pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
|
|
|
|
|
2024-07-07 14:55:05 +02:00
|
|
|
// adapted from https://github.com/weiznich/diesel_async/blob/002c67e4d09acd9b38d0fb08ff0efc24954b2558/examples/sync-wrapper/src/main.rs#L36-L48
|
|
|
|
async fn run_migrations<A: AsyncConnection<Backend = Pg> + 'static>(async_connection: A) {
|
|
|
|
let mut async_wrapper: AsyncConnectionWrapper<A> =
|
|
|
|
AsyncConnectionWrapper::from(async_connection);
|
|
|
|
|
|
|
|
web::block(move || {
|
|
|
|
async_wrapper.run_pending_migrations(MIGRATIONS).unwrap();
|
|
|
|
})
|
|
|
|
.await
|
|
|
|
.expect("failed to run migrations");
|
|
|
|
}
|
|
|
|
|
2024-06-24 22:46:04 +02:00
|
|
|
#[actix_web::main]
|
|
|
|
async fn main() -> std::io::Result<()> {
|
|
|
|
env_logger::init();
|
|
|
|
|
2024-07-07 14:55:05 +02:00
|
|
|
let manager = AsyncDieselConnectionManager::<AsyncPgConnection>::new(
|
2024-06-24 22:46:04 +02:00
|
|
|
env::var("DATABASE_URL").expect("DATABASE_URL must be set"),
|
|
|
|
);
|
2024-07-07 14:55:05 +02:00
|
|
|
let pool: Pool<AsyncPgConnection> = Pool::builder(manager)
|
|
|
|
.build()
|
2024-06-24 22:46:04 +02:00
|
|
|
.expect("database URL must be valid");
|
|
|
|
|
2024-07-07 14:55:05 +02:00
|
|
|
run_migrations(pool.get().await.unwrap()).await;
|
2024-06-24 22:46:04 +02:00
|
|
|
|
|
|
|
let address = env::var("LISTEN_ADDRESS").unwrap_or("::1".to_string());
|
|
|
|
let port = env::var("LISTEN_PORT").map_or(8080, |s| {
|
|
|
|
s.parse::<u16>().expect("failed to parse LISTEN_PORT")
|
|
|
|
});
|
2024-06-25 13:30:51 +02:00
|
|
|
let static_root = env::var("STATIC_ROOT").unwrap_or("static".to_string());
|
2024-06-24 22:46:04 +02:00
|
|
|
|
2024-06-25 13:30:51 +02:00
|
|
|
info!("Starting on {address}:{port} with static files from {static_root}");
|
|
|
|
debug!("Serving static files from {static_root}");
|
2024-06-24 22:46:04 +02:00
|
|
|
|
|
|
|
HttpServer::new(move || {
|
|
|
|
App::new()
|
|
|
|
.app_data(web::Data::new(pool.clone()))
|
2024-06-25 13:30:51 +02:00
|
|
|
.service(web::scope("/api/v1").configure(li7y::api::v1::config))
|
2024-06-24 22:46:04 +02:00
|
|
|
.service(actix_files::Files::new("/static", &static_root))
|
2024-07-03 14:19:58 +02:00
|
|
|
.configure(li7y::frontend::config)
|
2024-06-24 22:46:04 +02:00
|
|
|
})
|
|
|
|
.bind((address, port))?
|
|
|
|
.run()
|
|
|
|
.await
|
|
|
|
}
|