You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.3 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. #[macro_use]
  2. extern crate diesel;
  3. #[macro_use]
  4. extern crate comp;
  5. #[macro_use]
  6. extern crate validator_derive;
  7. extern crate bcrypt;
  8. extern crate custom_error;
  9. extern crate regex;
  10. extern crate validator;
  11. use actix_web::{
  12. error, get, middleware, post, web, App, Error, HttpRequest, HttpResponse, HttpServer, Responder,
  13. };
  14. use yarte::Template;
  15. use actix_web_httpauth::middleware::HttpAuthentication;
  16. use actix_http::cookie::SameSite;
  17. use actix_identity::{CookieIdentityPolicy, IdentityService};
  18. use rand::Rng;
  19. use actix_files as fs;
  20. use diesel::prelude::*;
  21. use diesel::r2d2::{self, ConnectionManager};
  22. // use middlewares::csrf;
  23. // use routes;
  24. // use routes::users;
  25. // use utils;
  26. mod actions;
  27. mod errors;
  28. mod middlewares;
  29. mod models;
  30. mod routes;
  31. mod schema;
  32. mod types;
  33. mod utils;
  34. #[macro_use]
  35. extern crate log;
  36. use serde::{Deserialize, Serialize};
  37. #[derive(Debug, Serialize, Deserialize)]
  38. struct MyObj {
  39. name: String,
  40. // number: i32,
  41. }
  42. #[get("/{id}/{name}")]
  43. async fn index(info: web::Path<(u32, String)>) -> Result<HttpResponse, Error> {
  44. let (id, name) = (info.0, info.1.clone());
  45. let template = models::CardTemplate {
  46. title: "My Title",
  47. body: name,
  48. num: id,
  49. };
  50. template
  51. .call()
  52. .map(|body| HttpResponse::Ok().content_type("text/html").body(body))
  53. .map_err(|_| error::ErrorInternalServerError("Error while parsing template"))
  54. }
  55. /// This handler uses json extractor
  56. #[post("/extractor")]
  57. async fn extract_my_obj(item: web::Json<MyObj>) -> HttpResponse {
  58. debug!("model: {:?}", item);
  59. HttpResponse::Ok().json(item.0) // <- send response
  60. }
  61. pub struct UserServiceImpl;
  62. impl UserServiceImpl {
  63. pub fn new() -> Self {
  64. UserServiceImpl {}
  65. }
  66. }
  67. #[actix_rt::main]
  68. async fn main() -> std::io::Result<()> {
  69. std::env::set_var("RUST_LOG", "debug");
  70. env_logger::init();
  71. dotenv::dotenv().ok();
  72. let basic_auth_middleware = HttpAuthentication::basic(utils::auth::validator);
  73. // set up database connection pool
  74. let connspec = std::env::var("DATABASE_URL").expect("DATABASE_URL NOT FOUND");
  75. let manager = ConnectionManager::<SqliteConnection>::new(connspec);
  76. let pool = r2d2::Pool::builder()
  77. .build(manager)
  78. .expect("Failed to create pool.");
  79. let addr = std::env::var("BIND_ADDRESS").expect("BIND ADDRESS NOT FOUND");
  80. info!("Starting server {}", addr);
  81. let private_key = rand::thread_rng().gen::<[u8; 32]>();
  82. let app = move || {
  83. App::new()
  84. .data(pool.clone())
  85. .wrap(IdentityService::new(
  86. CookieIdentityPolicy::new(&private_key)
  87. .name("my-app-auth")
  88. .secure(false)
  89. .same_site(SameSite::Lax),
  90. ))
  91. .wrap(middleware::Logger::default())
  92. .service(web::scope("/chat").wrap(basic_auth_middleware.clone()))
  93. // .service(extract_my_obj)
  94. // .service(index)
  95. .service(routes::users::get_user)
  96. .service(routes::users::add_user)
  97. .service(routes::users::get_all_users)
  98. .service(routes::auth::login)
  99. .service(routes::auth::logout)
  100. .service(routes::auth::index)
  101. .service(fs::Files::new("/", "./static"))
  102. };
  103. HttpServer::new(app).bind(addr)?.run().await
  104. }