diff --git a/acldb/Cargo.lock b/acldb/Cargo.lock index 02bd1e6..11a3309 100644 --- a/acldb/Cargo.lock +++ b/acldb/Cargo.lock @@ -22,7 +22,8 @@ dependencies = [ "thiserror", "tokio", "tst", - "utoipa", + "utoipa 3.5.0", + "utoipa-redoc", "utoipa-swagger-ui", ] @@ -264,6 +265,15 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "async-trait" version = "0.1.88" @@ -345,10 +355,10 @@ dependencies = [ ] [[package]] -name = "byteorder" -version = "1.5.0" +name = "bumpalo" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytes" @@ -442,6 +452,17 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "derive_more" version = "0.99.19" @@ -1256,9 +1277,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rust-embed" -version = "6.8.1" +version = "8.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36224c3276f8c4ebc8c20f158eca7ca4359c8db89991c4925132aaaf6702661" +checksum = "e5fbc0ee50fcb99af7cebb442e5df7b5b45e9460ffa3f8f549cd26b862bec49d" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -1267,23 +1288,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "6.8.1" +version = "8.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b94b81e5b2c284684141a2fb9e2a31be90638caf040bf9afbc5a0416afe1ac" +checksum = "6bf418c9a2e3f6663ca38b8a7134cc2c2167c9d69688860e8961e3faa731702e" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "shellexpand", "syn 2.0.100", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "7.8.1" +version = "8.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d38ff6bf570dc3bb7100fce9f7b60c33fa71d80e88da3f2580df4ff2bdded74" +checksum = "08d55b95147fe01265d06b3955db798bdaed52e60e2211c41137701b3aba8e21" dependencies = [ "sha2", "walkdir", @@ -1397,15 +1417,6 @@ dependencies = [ "digest", ] -[[package]] -name = "shellexpand" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" -dependencies = [ - "dirs", -] - [[package]] name = "shlex" version = "1.3.0" @@ -1421,6 +1432,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "slab" version = "0.4.9" @@ -1692,7 +1709,19 @@ dependencies = [ "indexmap", "serde", "serde_json", - "utoipa-gen", + "utoipa-gen 3.5.0", +] + +[[package]] +name = "utoipa" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435c6f69ef38c9017b4b4eea965dfb91e71e53d869e896db40d1cf2441dd75c0" +dependencies = [ + "indexmap", + "serde", + "serde_json", + "utoipa-gen 5.3.1", ] [[package]] @@ -1709,18 +1738,43 @@ dependencies = [ ] [[package]] -name = "utoipa-swagger-ui" -version = "3.1.5" +name = "utoipa-gen" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84614caa239fb25b2bb373a52859ffd94605ceb256eeb1d63436325cf81e3653" +checksum = "a77d306bc75294fd52f3e99b13ece67c02c1a2789190a6f31d32f736624326f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "utoipa-redoc" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6427547f6db7ec006cbbef95f7565952a16f362e298b416d2d497d9706fef72d" dependencies = [ "actix-web", + "serde", + "serde_json", + "utoipa 5.3.1", +] + +[[package]] +name = "utoipa-swagger-ui" +version = "9.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29519b3c485df6b13f4478ac909a491387e9ef70204487c3b64b53749aec0be" +dependencies = [ + "actix-web", + "base64 0.22.1", "mime_guess", "regex", "rust-embed", "serde", "serde_json", - "utoipa", + "url", + "utoipa 5.3.1", "zip", ] @@ -1978,14 +2032,29 @@ dependencies = [ [[package]] name = "zip" -version = "0.6.6" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" dependencies = [ - "byteorder", + "arbitrary", "crc32fast", "crossbeam-utils", "flate2", + "indexmap", + "memchr", + "zopfli", +] + +[[package]] +name = "zopfli" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", ] [[package]] diff --git a/acldb/Cargo.toml b/acldb/Cargo.toml index bb03ae2..b5206af 100644 --- a/acldb/Cargo.toml +++ b/acldb/Cargo.toml @@ -14,7 +14,8 @@ actix-web = "4" actix-rt = "2" actix-cors = "0.6" utoipa = { version = "3.3", features = ["actix_extras"] } -utoipa-swagger-ui = { version = "3.1", features = ["actix-web"] } +utoipa-swagger-ui = { version = "9.0.1", features = ["actix-web"] } +utoipa-redoc = { version = "6.0", features = ["actix-web"] } tokio = { version = "1", features = ["full"] } log = "0.4" env_logger = "0.10" diff --git a/acldb/src/server.rs b/acldb/src/server.rs index d4b6533..e9f8da9 100644 --- a/acldb/src/server.rs +++ b/acldb/src/server.rs @@ -9,7 +9,7 @@ use tokio::sync::RwLock; use serde_json::json; use log::{error, info}; use utoipa::OpenApi; -use utoipa_swagger_ui::SwaggerUi; +use utoipa_redoc::{Redoc, Servable}; use crate::ACLDB; use crate::rpc::{RpcInterface, RpcRequest, RpcResponse, AclUpdateParams, AclRemoveParams, AclDelParams, SetParams, DelParams, GetParams, PrefixParams}; @@ -164,7 +164,7 @@ impl Server { self.register_handlers(); info!("Starting ACLDB server on {}:{}", self.config.host, self.config.port); - info!("Swagger UI available at: http://{}:{}/swagger-ui/", self.config.host, self.config.port); + info!("API documentation available at: http://{}:{}/redoc", self.config.host, self.config.port); // Start the HTTP server HttpServer::new(move || { @@ -180,8 +180,7 @@ impl Server { .route("/rpc", web::post().to(handle_rpc)) .route("/health", web::get().to(health_check)) .service( - SwaggerUi::new("/swagger-ui/{_:.*}") - .url("/api-docs/openapi.json", ApiDoc::openapi()) + Redoc::with_url("/redoc", serde_json::to_value(ApiDoc::openapi()).unwrap()) ) }) .bind(format!("{0}:{1}", self.config.host, self.config.port))? @@ -311,7 +310,7 @@ async fn handle_rpc( /// Process an RPC request async fn process_request( request: &RpcRequest, - rpc_interface: &Arc, + _rpc_interface: &Arc, acldb_factory: &Arc ) -> RpcResponse { match request.method.as_str() { diff --git a/herodb/src/models/mcc/calendar.rs b/herodb/src/models/mcc/calendar.rs index 266a1dc..0d664fc 100644 --- a/herodb/src/models/mcc/calendar.rs +++ b/herodb/src/models/mcc/calendar.rs @@ -40,8 +40,8 @@ impl Calendar { } /// Get all events associated with this calendar - pub fn get_events(&self, db: &SledDB) -> SledDBResult> { - let all_events = db.list()?; + pub fn get_events(&self, db: &DB) -> DbResult> { + let all_events = db.list::()?; let calendar_events = all_events .into_iter() .filter(|event| event.calendar_id == self.id) diff --git a/herodb/src/models/mcc/contacts.rs b/herodb/src/models/mcc/contacts.rs index 2a50f5b..3e279a0 100644 --- a/herodb/src/models/mcc/contacts.rs +++ b/herodb/src/models/mcc/contacts.rs @@ -109,7 +109,7 @@ impl Contact { // Implement Storable trait (provides default dump/load) impl Storable for Contact {} -// Implement SledModel trait +// Implement Model trait impl Model for Contact { fn get_id(&self) -> u32 { self.id diff --git a/herodb/src/models/mcc/event.rs b/herodb/src/models/mcc/event.rs index 1a4f660..43dd40b 100644 --- a/herodb/src/models/mcc/event.rs +++ b/herodb/src/models/mcc/event.rs @@ -85,13 +85,13 @@ impl Event { } /// Get the calendar this event belongs to - pub fn get_calendar(&self, db: &SledDB) -> SledDBResult { - db.get(&self.calendar_id.to_string()) + pub fn get_calendar(&self, db: &DB) -> DbResult { + db.get::(self.calendar_id) } /// Get contacts for all attendees of this event - pub fn get_attendee_contacts(&self, db: &SledDB) -> SledDBResult> { - let all_contacts = db.list()?; + pub fn get_attendee_contacts(&self, db: &DB) -> DbResult> { + let all_contacts = db.list::()?; let attendee_contacts = all_contacts .into_iter() .filter(|contact| self.attendees.contains(&contact.email)) @@ -129,10 +129,10 @@ impl Event { // Implement Storable trait (provides default dump/load) impl Storable for Event {} -// Implement SledModel trait -impl SledModel for Event { - fn get_id(&self) -> String { - self.id.to_string() +// Implement Model trait +impl Model for Event { + fn get_id(&self) -> u32 { + self.id } fn db_prefix() -> &'static str { diff --git a/herodb/src/models/mcc/lib.rs b/herodb/src/models/mcc/lib.rs index 11ae716..8780078 100644 --- a/herodb/src/models/mcc/lib.rs +++ b/herodb/src/models/mcc/lib.rs @@ -12,4 +12,4 @@ pub use contacts::Contact; pub use message::{Message, MessageMeta, MessageStatus}; // Re-export database components from db module -pub use crate::db::{SledDB, SledDBError, SledDBResult, Storable, SledModel, DB}; \ No newline at end of file +pub use crate::db::{DB, DBBuilder, Model, Storable, DbError, DbResult}; \ No newline at end of file diff --git a/herodb/src/models/mcc/mail.rs b/herodb/src/models/mcc/mail.rs index 3054e13..7e85aa1 100644 --- a/herodb/src/models/mcc/mail.rs +++ b/herodb/src/models/mcc/mail.rs @@ -151,10 +151,10 @@ impl Email { // Implement Storable trait (provides default dump/load) impl Storable for Email {} -// Implement SledModel trait -impl SledModel for Email { - fn get_id(&self) -> String { - self.id.to_string() +// Implement Model trait +impl Model for Email { + fn get_id(&self) -> u32 { + self.id } fn db_prefix() -> &'static str { diff --git a/herodb/src/models/mcc/message.rs b/herodb/src/models/mcc/message.rs index c92e727..6d490af 100644 --- a/herodb/src/models/mcc/message.rs +++ b/herodb/src/models/mcc/message.rs @@ -108,8 +108,8 @@ impl Message { } /// Get all messages in the same thread - pub fn get_thread_messages(&self, db: &SledDB) -> SledDBResult> { - let all_messages = db.list()?; + pub fn get_thread_messages(&self, db: &DB) -> DbResult> { + let all_messages = db.list::()?; let thread_messages = all_messages .into_iter() .filter(|msg| msg.thread_id == self.thread_id) @@ -122,10 +122,10 @@ impl Message { // Implement Storable trait (provides default dump/load) impl Storable for Message {} -// Implement SledModel trait -impl SledModel for Message { - fn get_id(&self) -> String { - self.id.to_string() +// Implement Model trait +impl Model for Message { + fn get_id(&self) -> u32 { + self.id } fn db_prefix() -> &'static str {