rs_starter/core/
bootstrap_server.rs1extern crate log;
2use std::{time::Duration};
3
4use log4rs;
5
6use actix_web::{web, middleware, web::Data, Route, App, HttpServer};
7use tera::{Tera};
8
9use crate::middlewares::access_filter::Logger;
10
11use crate::core::builtin_handles::{favicon, favicon_svg};
12use crate::core::builtin_handles::{index, info, readme, stream, about, developer};
13use crate::core::builtin_handles::{errors, throw_error, not_found};
14use crate::core::builtin_handles::{static_handler, tls_builder, cors, access_limiter};
15
16use crate::repository::mongodb_repo::MongoRepo;
17use crate::services::user_service::{create_user, get_user, update_user, delete_user, get_all_users};
18
19pub struct Server {
20 }
22
23fn config(cfg: &mut web::ServiceConfig) {
24
25 let h1: Route = web::get().to(stream);
26 let r1 = ("/stream", h1);
27
28 cfg.service(favicon)
29 .service(favicon_svg)
30 .route("/", web::get().to(index))
31 .route("/index", web::get().to(index))
32 .route("/home", web::get().to(index))
33 .route(r1.0, r1.1)
34 .route("/readme", web::get().to(readme))
35 .route("/info", web::get().to(info))
36 .route("/hey", web::get().to(|| async { "Hey there! 啊啊送积分啦;送积分啦" }))
37 .route("/about", web::get().to(about))
38 .route("/throw-error/{id}", web::get().to(throw_error));
39
40 cfg.service(create_user)
42 .service(get_user)
43 .service(update_user)
44 .service(delete_user)
45 .service(get_all_users);
46
47 cfg.service(
49 web::scope("/developer")
50 .wrap(access_limiter())
51 .route("", web::get().to(developer))
52 .route("/index", web::get().to(developer))
53 .route("/home", web::get().to(developer))
54 )
55 .service(errors);
57
58 cfg.configure(static_handler);
59
60}
61
62impl Server {
63
64 pub fn new() -> Self {
66 Self {
67 }
69 }
70
71 pub async fn run(self) {
72
73 log4rs::init_file("resources/log4rs.yaml", Default::default()).unwrap();
76
77 let db_data = Data::new(MongoRepo::init().await);
78 let tmpl_data = Data::new(Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap());
79
80 let new_app = move || {
81
82 let logger = Logger::new("%{r}a \"%r\" %s %b %D")
83 .exclude("/favicon.ico")
84 .exclude("/favicon.svg")
85 .exclude_regex("^/static")
86 ;
87
88 App::new()
89 .app_data(tmpl_data.clone())
90 .app_data(db_data.clone())
91 .wrap(cors())
92 .wrap(logger)
93 .wrap(middleware::NormalizePath::new(middleware::TrailingSlash::Trim))
94 .configure(|wc|config(wc))
95 .default_service(
96 web::route().to(not_found)
97 )
98
99 };
100
101 HttpServer::new(new_app)
102 .backlog(8192)
103 .workers(4)
104 .keep_alive(Duration::from_secs(75))
105 .bind(format!("0.0.0.0:{}", 8000))
106 .unwrap_or_else(|_| panic!("🔥 Couldn't start the server at port {}", 8000))
107 .bind_openssl("127.0.0.1:8443", tls_builder())
108 .expect("Failed to bind to port: 8443")
109 .run()
110 .await
111 .expect("Failed to run server")
112
113 }
114
115}