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.

143 lines
4.0 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
4 years ago
4 years ago
4 years ago
3 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 derive_new;
  5. extern crate bcrypt;
  6. extern crate custom_error;
  7. extern crate regex;
  8. extern crate validator;
  9. use actix_web::{cookie::SameSite, middleware, web, App, HttpServer};
  10. use actix_files as fs;
  11. use actix_identity::{CookieIdentityPolicy, IdentityService};
  12. use rand::Rng;
  13. use diesel::prelude::*;
  14. use diesel::r2d2::{self, ConnectionManager};
  15. use listenfd::ListenFd;
  16. use std::io;
  17. use std::io::ErrorKind;
  18. use types::DbPool;
  19. mod actions;
  20. mod errors;
  21. mod middlewares;
  22. mod models;
  23. mod routes;
  24. mod schema;
  25. mod services;
  26. mod types;
  27. mod utils;
  28. #[macro_use]
  29. extern crate log;
  30. #[derive(Clone)]
  31. pub struct AppConfig {
  32. hash_cost: u32,
  33. pool: DbPool,
  34. }
  35. #[actix_web::main]
  36. async fn main() -> std::io::Result<()> {
  37. std::env::set_var("RUST_LOG", "debug");
  38. env_logger::init();
  39. dotenv::dotenv().map_err(|err| {
  40. io::Error::new(
  41. ErrorKind::Other,
  42. format!("Failed to set up env: {:?}", err),
  43. )
  44. })?;
  45. // let _basic_auth_middleware =
  46. // HttpAuthentication::basic(utils::auth::validator);
  47. // set up database connection pool
  48. let connspec = std::env::var("DATABASE_URL").map_err(|err| {
  49. io::Error::new(
  50. ErrorKind::Other,
  51. format!("Database url is not set: {:?}", err),
  52. )
  53. })?;
  54. let manager = ConnectionManager::<SqliteConnection>::new(connspec);
  55. let pool = r2d2::Pool::builder().build(manager).map_err(|err| {
  56. io::Error::new(
  57. ErrorKind::Other,
  58. format!("Failed to create pool: {:?}", err),
  59. )
  60. })?;
  61. {
  62. let conn = &pool.get().map_err(|err| {
  63. io::Error::new(
  64. ErrorKind::Other,
  65. format!("Failed to get connection: {:?}", err),
  66. )
  67. })?;
  68. diesel_migrations::run_pending_migrations(conn).map_err(|err| {
  69. io::Error::new(
  70. ErrorKind::Other,
  71. format!("Error running migrations: {:?}", err),
  72. )
  73. })?;
  74. }
  75. let hash_cost = std::env::var("HASH_COST")
  76. .map_err(|e| e.to_string())
  77. .and_then(|x| x.parse::<u32>().map_err(|e| e.to_string()))
  78. .unwrap_or_else(|err| {
  79. info!(
  80. "Error getting hash cost: {:?}. Using default cost of 8",
  81. err
  82. );
  83. 8
  84. });
  85. let config: AppConfig = AppConfig {
  86. pool: pool.clone(),
  87. hash_cost,
  88. };
  89. // let user_controller = UserController {
  90. // user_service: &user_service,
  91. // };
  92. let addr = std::env::var("BIND_ADDRESS")
  93. .unwrap_or_else(|_| "127.0.0.1:7800".to_owned());
  94. info!("Starting server at {}", addr);
  95. let private_key = rand::thread_rng().gen::<[u8; 32]>();
  96. let app = move || {
  97. App::new()
  98. .data(config.clone())
  99. .wrap(IdentityService::new(
  100. CookieIdentityPolicy::new(&private_key)
  101. .name("my-app-auth")
  102. .secure(false)
  103. .same_site(SameSite::Lax),
  104. ))
  105. .wrap(middleware::Logger::default())
  106. .service(
  107. web::scope("/api/authzd") // endpoint requiring authentication
  108. // .wrap(_basic_auth_middleware.clone())
  109. .service(routes::users::get_user)
  110. .service(routes::users::get_all_users),
  111. )
  112. // .route("/api/users/get", web::get().to(user_controller.get_user.into()))
  113. .service(web::scope("/api/public")) // public endpoint - not implemented yet
  114. .service(routes::auth::login)
  115. .service(routes::auth::logout)
  116. .service(routes::auth::index)
  117. .service(routes::users::add_user)
  118. .service(fs::Files::new("/", "./static"))
  119. };
  120. // HttpServer::new(app).bind(addr)?.run().await
  121. let mut listenfd = ListenFd::from_env();
  122. let server = HttpServer::new(app);
  123. let server = match listenfd.take_tcp_listener(0)? {
  124. Some(l) => server.listen(l),
  125. None => server.bind(addr),
  126. }?;
  127. server.run().await
  128. }