Some checks failed
CI / Deploy Agent (push) Has been skipped
CI / Deploy Dashboard (push) Has been skipped
CI / Deploy Docs (push) Has been skipped
CI / Deploy MCP (push) Has been skipped
CI / Deploy Agent (pull_request) Has been skipped
CI / Deploy Dashboard (pull_request) Has been skipped
CI / Deploy Docs (pull_request) Has been skipped
CI / Format (push) Failing after 3s
CI / Clippy (push) Failing after 2m44s
CI / Security Audit (push) Has been skipped
CI / Tests (push) Has been skipped
CI / Format (pull_request) Failing after 3s
CI / Clippy (pull_request) Failing after 2m51s
CI / Security Audit (pull_request) Has been skipped
CI / Tests (pull_request) Has been skipped
CI / Detect Changes (push) Has been skipped
CI / Detect Changes (pull_request) Has been skipped
CI / Deploy MCP (pull_request) Has been skipped
- Add gitleaks secret detection, lint scanning (clippy/eslint/ruff), and LLM code review scanners - Enhance LLM triage with multi-action support (confirm/downgrade/upgrade/dismiss), surrounding code context, and file-path classification confidence adjustment - Add text search, column sorting, and bulk status update to findings dashboard - Fix finding detail page status refresh and add developer feedback field - Fix BSON DateTime deserialization across all models with shared serde helpers - Add scan progress spinner with polling to repositories page - Batch OSV.dev queries to avoid "Too many queries" errors - Add gitleaks, semgrep, and ruff to Dockerfile.agent for deployment Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
78 lines
2.2 KiB
Rust
78 lines
2.2 KiB
Rust
use chrono::{DateTime, Utc};
|
|
use serde::{Deserialize, Deserializer, Serialize};
|
|
|
|
use super::issue::TrackerType;
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum ScanTrigger {
|
|
Scheduled,
|
|
Webhook,
|
|
Manual,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct TrackedRepository {
|
|
#[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
|
|
pub id: Option<bson::oid::ObjectId>,
|
|
#[serde(default)]
|
|
pub name: String,
|
|
#[serde(default)]
|
|
pub git_url: String,
|
|
#[serde(default = "default_branch")]
|
|
pub default_branch: String,
|
|
pub local_path: Option<String>,
|
|
pub scan_schedule: Option<String>,
|
|
#[serde(default)]
|
|
pub webhook_enabled: bool,
|
|
pub tracker_type: Option<TrackerType>,
|
|
pub tracker_owner: Option<String>,
|
|
pub tracker_repo: Option<String>,
|
|
pub last_scanned_commit: Option<String>,
|
|
#[serde(default, deserialize_with = "deserialize_findings_count")]
|
|
pub findings_count: u32,
|
|
#[serde(default = "chrono::Utc::now", with = "super::serde_helpers::bson_datetime")]
|
|
pub created_at: DateTime<Utc>,
|
|
#[serde(default = "chrono::Utc::now", with = "super::serde_helpers::bson_datetime")]
|
|
pub updated_at: DateTime<Utc>,
|
|
}
|
|
|
|
fn default_branch() -> String {
|
|
"main".to_string()
|
|
}
|
|
|
|
fn deserialize_findings_count<'de, D>(deserializer: D) -> Result<u32, D::Error>
|
|
where
|
|
D: Deserializer<'de>,
|
|
{
|
|
let bson = bson::Bson::deserialize(deserializer)?;
|
|
match &bson {
|
|
bson::Bson::Int32(n) => Ok(*n as u32),
|
|
bson::Bson::Int64(n) => Ok(*n as u32),
|
|
bson::Bson::Double(n) => Ok(*n as u32),
|
|
_ => Ok(0),
|
|
}
|
|
}
|
|
|
|
impl TrackedRepository {
|
|
pub fn new(name: String, git_url: String) -> Self {
|
|
let now = Utc::now();
|
|
Self {
|
|
id: None,
|
|
name,
|
|
git_url,
|
|
default_branch: "main".to_string(),
|
|
local_path: None,
|
|
scan_schedule: None,
|
|
webhook_enabled: false,
|
|
tracker_type: None,
|
|
tracker_owner: None,
|
|
tracker_repo: None,
|
|
last_scanned_commit: None,
|
|
findings_count: 0,
|
|
created_at: now,
|
|
updated_at: now,
|
|
}
|
|
}
|
|
}
|