FrostByte/server/src/main.rs

85 lines
2.5 KiB
Rust
Executable file

use actix_cors::Cors;
use actix_files::Files;
use actix_web::http::header::{CacheControl, CacheDirective};
use actix_web::middleware;
use actix_web::web::Data;
use actix_web::{web::scope, App, HttpServer};
use log::info;
mod db;
mod jwt;
mod routes;
mod state;
mod types;
mod util;
use jwt::Authentication;
use routes::{get_comments, get_posts, login, new_comment, new_post, post_by_id, register};
use state::CaptchaState;
use state::ServerState;
use util::hex_string;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let mut builder = env_logger::Builder::new();
builder
.filter(None, log::LevelFilter::Debug)
.filter_module("sqlx", log::LevelFilter::Warn)
.init();
let data = ServerState::new().await;
let capt_db = CaptchaState::new();
let auth = Authentication::new("secret".as_bytes());
#[cfg(debug_assertions)]
{
for _ in 0..10 {
let s = hex_string(10);
info!("Adding captcha key: {}", &s);
capt_db.capthca_db.lock().unwrap().insert(s);
}
}
info!("Spinning up server on http://localhost:8080");
HttpServer::new(move || {
let cors = Cors::default()
.allowed_origin("https://shitpost.se")
.allowed_methods(vec!["GET", "POST"])
.max_age(3600);
// In debug mode, allow any origin
#[cfg(debug_assertions)]
let cors = cors.allow_any_origin();
App::new()
.wrap(cors)
.wrap(middleware::Compress::default())
.wrap(middleware::Logger::new("%s %r"))
.wrap(middleware::NormalizePath::trim())
.wrap(
middleware::DefaultHeaders::new()
.add(CacheControl(vec![CacheDirective::MaxAge(31536000)])),
)
.service(
scope("/api")
.service(get_posts)
.service(new_post)
.service(new_comment)
.service(get_comments)
.service(post_by_id)
.service(login)
.service(register)
.app_data(Data::new(data.clone()))
.app_data(Data::new(capt_db.clone()))
.app_data(Data::new(auth.clone())),
)
.service(
Files::new("/", "./public")
.index_file("index.html")
.default_handler(actix_files::NamedFile::open("./public/index.html").unwrap()),
)
})
.bind("0.0.0.0:8080")?
.run()
.await
}