diff --git a/Cargo.lock b/Cargo.lock index 618502d..fc3837a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -436,6 +436,7 @@ dependencies = [ name = "compliance-core" version = "0.1.0" dependencies = [ + "bson", "chrono", "hex", "mongodb", diff --git a/Cargo.toml b/Cargo.toml index 10cb989..8e7a9a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ unwrap_used = "deny" expect_used = "deny" [workspace.dependencies] -compliance-core = { path = "compliance-core" } +compliance-core = { path = "compliance-core", default-features = false } serde = { version = "1", features = ["derive"] } serde_json = "1" tokio = { version = "1", features = ["full"] } diff --git a/compliance-agent/Cargo.toml b/compliance-agent/Cargo.toml index aabd3ea..d0a5e61 100644 --- a/compliance-agent/Cargo.toml +++ b/compliance-agent/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" workspace = true [dependencies] -compliance-core = { workspace = true } +compliance-core = { workspace = true, features = ["mongodb"] } serde = { workspace = true } serde_json = { workspace = true } tokio = { workspace = true } diff --git a/compliance-core/Cargo.toml b/compliance-core/Cargo.toml index 5bd151a..4bf4ce0 100644 --- a/compliance-core/Cargo.toml +++ b/compliance-core/Cargo.toml @@ -6,6 +6,10 @@ edition = "2021" [lints] workspace = true +[features] +default = ["mongodb"] +mongodb = ["dep:mongodb"] + [dependencies] serde = { workspace = true } serde_json = { workspace = true } @@ -15,4 +19,5 @@ sha2 = { workspace = true } hex = { workspace = true } uuid = { workspace = true } secrecy = { workspace = true } -mongodb = { workspace = true } +bson = "2" +mongodb = { workspace = true, optional = true } diff --git a/compliance-core/src/error.rs b/compliance-core/src/error.rs index a6aba6b..a4f0633 100644 --- a/compliance-core/src/error.rs +++ b/compliance-core/src/error.rs @@ -3,8 +3,13 @@ use thiserror::Error; #[derive(Error, Debug)] pub enum CoreError { #[error("Database error: {0}")] + #[cfg(feature = "mongodb")] Database(#[from] mongodb::error::Error), + #[error("Database error: {0}")] + #[cfg(not(feature = "mongodb"))] + Database(String), + #[error("Serialization error: {0}")] Serialization(#[from] serde_json::Error), diff --git a/compliance-core/src/models/cve.rs b/compliance-core/src/models/cve.rs index 2800613..b7ef144 100644 --- a/compliance-core/src/models/cve.rs +++ b/compliance-core/src/models/cve.rs @@ -12,7 +12,7 @@ pub enum CveSource { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CveAlert { #[serde(rename = "_id", skip_serializing_if = "Option::is_none")] - pub id: Option, + pub id: Option, pub cve_id: String, pub repo_id: String, pub affected_package: String, diff --git a/compliance-core/src/models/finding.rs b/compliance-core/src/models/finding.rs index ad8a365..0bcbf3b 100644 --- a/compliance-core/src/models/finding.rs +++ b/compliance-core/src/models/finding.rs @@ -50,7 +50,7 @@ impl std::fmt::Display for FindingStatus { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Finding { #[serde(rename = "_id", skip_serializing_if = "Option::is_none")] - pub id: Option, + pub id: Option, pub repo_id: String, pub fingerprint: String, pub scanner: String, diff --git a/compliance-core/src/models/issue.rs b/compliance-core/src/models/issue.rs index 8b4e694..f4f82ec 100644 --- a/compliance-core/src/models/issue.rs +++ b/compliance-core/src/models/issue.rs @@ -42,7 +42,7 @@ impl std::fmt::Display for IssueStatus { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TrackerIssue { #[serde(rename = "_id", skip_serializing_if = "Option::is_none")] - pub id: Option, + pub id: Option, pub finding_id: String, pub tracker_type: TrackerType, pub external_id: String, diff --git a/compliance-core/src/models/repository.rs b/compliance-core/src/models/repository.rs index b9d815a..aa8ee41 100644 --- a/compliance-core/src/models/repository.rs +++ b/compliance-core/src/models/repository.rs @@ -14,7 +14,7 @@ pub enum ScanTrigger { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TrackedRepository { #[serde(rename = "_id", skip_serializing_if = "Option::is_none")] - pub id: Option, + pub id: Option, pub name: String, pub git_url: String, pub default_branch: String, diff --git a/compliance-core/src/models/sbom.rs b/compliance-core/src/models/sbom.rs index ec6f371..1590fed 100644 --- a/compliance-core/src/models/sbom.rs +++ b/compliance-core/src/models/sbom.rs @@ -12,7 +12,7 @@ pub struct VulnRef { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SbomEntry { #[serde(rename = "_id", skip_serializing_if = "Option::is_none")] - pub id: Option, + pub id: Option, pub repo_id: String, pub name: String, pub version: String, diff --git a/compliance-core/src/models/scan.rs b/compliance-core/src/models/scan.rs index 99ddb74..b444440 100644 --- a/compliance-core/src/models/scan.rs +++ b/compliance-core/src/models/scan.rs @@ -49,7 +49,7 @@ pub enum ScanPhase { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ScanRun { #[serde(rename = "_id", skip_serializing_if = "Option::is_none")] - pub id: Option, + pub id: Option, pub repo_id: String, pub trigger: ScanTrigger, pub commit_sha: Option, diff --git a/compliance-dashboard/Cargo.toml b/compliance-dashboard/Cargo.toml index fcc48d6..b585c71 100644 --- a/compliance-dashboard/Cargo.toml +++ b/compliance-dashboard/Cargo.toml @@ -12,11 +12,12 @@ path = "../bin/main.rs" workspace = true [features] -web = ["dioxus/web", "dioxus/router", "dioxus/fullstack", "dep:reqwest", "dep:web-sys"] +web = ["dioxus/web", "dioxus/router", "dioxus/fullstack", "dep:web-sys"] server = [ "dioxus/server", "dioxus/router", "dioxus/fullstack", + "compliance-core/mongodb", "dep:axum", "dep:mongodb", "dep:reqwest", @@ -29,7 +30,7 @@ server = [ ] [dependencies] -compliance-core = { workspace = true } +compliance-core = { workspace = true, default-features = false } dioxus = "=0.7.3" dioxus-free-icons = { version = "0.10", features = ["bootstrap"] } serde = { workspace = true } diff --git a/compliance-dashboard/src/infrastructure/mod.rs b/compliance-dashboard/src/infrastructure/mod.rs index 762ff29..3244c5d 100644 --- a/compliance-dashboard/src/infrastructure/mod.rs +++ b/compliance-dashboard/src/infrastructure/mod.rs @@ -1,13 +1,23 @@ -pub mod config; -pub mod database; -pub mod error; +// Server function modules (compiled for both web and server; +// the #[server] macro generates client stubs for the web target) pub mod findings; pub mod issues; pub mod repositories; pub mod sbom; pub mod scans; -pub mod server; -pub mod server_state; pub mod stats; +// Server-only modules +#[cfg(feature = "server")] +pub mod config; +#[cfg(feature = "server")] +pub mod database; +#[cfg(feature = "server")] +pub mod error; +#[cfg(feature = "server")] +pub mod server; +#[cfg(feature = "server")] +pub mod server_state; + +#[cfg(feature = "server")] pub use server::server_start; diff --git a/compliance-dashboard/src/lib.rs b/compliance-dashboard/src/lib.rs index 2a61e0f..422137c 100644 --- a/compliance-dashboard/src/lib.rs +++ b/compliance-dashboard/src/lib.rs @@ -1,8 +1,6 @@ pub mod app; pub mod components; +pub mod infrastructure; pub mod pages; -#[cfg(feature = "server")] -pub mod infrastructure; - pub use app::App;