diff options
| author | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-11-28 16:30:02 +0100 |
|---|---|---|
| committer | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-11-28 16:30:02 +0100 |
| commit | a62ab5c6dacaddb67931d7ac160bc7faaa707737 (patch) | |
| tree | a35fa3540fbb89f575ab1ea72f9b23ace399e01c /crates/rocie-server/src/main.rs | |
| parent | chore(crates/rocie-client): Re-generate (diff) | |
| download | server-a62ab5c6dacaddb67931d7ac160bc7faaa707737.zip | |
feat(crates/rocie-server): Get closer to feature parity between rocie and grocy
Diffstat (limited to 'crates/rocie-server/src/main.rs')
| -rw-r--r-- | crates/rocie-server/src/main.rs | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/crates/rocie-server/src/main.rs b/crates/rocie-server/src/main.rs index 2329b0b..dc5be0b 100644 --- a/crates/rocie-server/src/main.rs +++ b/crates/rocie-server/src/main.rs @@ -1,5 +1,10 @@ use actix_cors::Cors; -use actix_web::{App, HttpServer, middleware::Logger, web::Data}; +use actix_web::{ + App, HttpServer, + cookie::{Key, SameSite}, + middleware::Logger, + web::Data, +}; use clap::Parser; use utoipa::OpenApi; @@ -10,6 +15,9 @@ mod app; mod cli; mod storage; +use actix_identity::IdentityMiddleware; +use actix_session::{SessionMiddleware, storage::CookieSessionStore}; + #[actix_web::main] #[expect( clippy::needless_for_each, @@ -22,14 +30,25 @@ async fn main() -> Result<(), std::io::Error> { api::get::product::product_by_id, api::get::product::product_by_name, api::get::product::product_suggestion_by_name, - api::get::product::products, + api::get::product::products_registered, + api::get::product::products_in_storage, + api::get::product::products_by_product_parent_id_indirect, + api::get::product::products_by_product_parent_id_direct, + api::get::product_parent::product_parents, + api::get::product_parent::product_parents_toplevel, + api::get::product_parent::product_parents_under, + api::get::recipe::recipe_by_id, + api::get::recipe::recipes, api::get::unit::units, + api::get::unit::units_by_property_id, api::get::unit::unit_by_id, api::get::unit_property::unit_property_by_id, api::get::unit_property::unit_properties, api::get::inventory::amount_by_id, api::set::product::register_product, api::set::product::associate_barcode, + api::set::product_parent::register_product_parent, + api::set::recipe::add_recipe, api::set::unit::register_unit, api::set::unit_property::register_unit_property, api::set::barcode::buy_barcode, @@ -45,6 +64,11 @@ async fn main() -> Result<(), std::io::Error> { env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); + // When using `Key::generate()` it is important to initialize outside of the + // `HttpServer::new` closure. When deployed the secret key should be read from a + // configuration file or environment variables. + let secret_key = Key::generate(); + let args = CliArgs::parse(); match args.command { @@ -67,6 +91,18 @@ async fn main() -> Result<(), std::io::Error> { .wrap(Logger::new( r#"%a "%r" -> %s %b ("%{Referer}i" "%{User-Agent}i" %T s)"#, )) + // Install the identity framework before middle-ware (as actix is filo). + .wrap(IdentityMiddleware::default()) + .wrap( + SessionMiddleware::builder( + CookieSessionStore::default(), + secret_key.clone(), + ) + .cookie_secure(true) + .cookie_http_only(true) + .cookie_same_site(SameSite::Strict) + .build(), + ) .app_data(Data::clone(&data)) .configure(api::get::register_paths) .configure(api::set::register_paths) |
