rs_starter/core/
bootstrap_server.rs

1extern 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    // apps: Vec<Box<dyn Fn(&mut ServiceConfig) + Send + Sync + 'static>>,
21}
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    // user
41    cfg.service(create_user)
42       .service(get_user)
43       .service(update_user)
44       .service(delete_user)
45       .service(get_all_users);
46
47    // developers
48    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       // error handle
56       .service(errors);
57
58    cfg.configure(static_handler);
59    
60}
61
62impl Server {
63
64    // Creates a new Server struct to configure.
65    pub fn new() -> Self {
66        Self {
67            // apps: vec![],
68        }
69    }
70
71    pub async fn run(self) {
72
73        // std::env::set_var("RUST_LOG", "debug");
74        
75        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}