use adler_core::{CheckOutcome, Site};
use serde::{Deserialize, Serialize};
use crate::scan::{FinishedScan, ScanId};
#[derive(Serialize)]
pub(super) struct Health {
pub(super) ok: bool,
pub(super) version: &'static str,
}
#[derive(Serialize)]
pub(super) struct SiteSummary {
name: String,
url: String,
tags: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
popularity: Option<u32>,
}
impl From<&Site> for SiteSummary {
fn from(s: &Site) -> Self {
Self {
name: s.name.clone(),
url: s.url.as_str().to_owned(),
tags: s.tags.clone(),
popularity: s.popularity,
}
}
}
#[derive(Clone, Debug, Serialize)]
pub(super) struct DisabledSiteSummary {
pub(super) name: String,
pub(super) url: String,
pub(super) tags: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) popularity: Option<u32>,
pub(super) disabled_reason: String,
}
impl From<&Site> for DisabledSiteSummary {
fn from(s: &Site) -> Self {
Self {
name: s.name.clone(),
url: s.url.as_str().to_owned(),
tags: s.tags.clone(),
popularity: s.popularity,
disabled_reason: s
.disabled_reason
.clone()
.unwrap_or_else(|| "disabled in registry".to_owned()),
}
}
}
#[derive(Serialize)]
pub(super) struct SitesResponse {
pub(super) sites: Vec<SiteSummary>,
pub(super) disabled: Vec<DisabledSiteSummary>,
}
#[derive(Serialize)]
pub(super) struct AccessSummary {
pub(super) egress: Vec<adler_core::EgressSummary>,
pub(super) sessions: Vec<SessionName>,
}
#[derive(Serialize)]
pub(super) struct SessionName {
pub(super) name: String,
}
#[derive(Serialize)]
pub(super) struct ScanListEntry {
pub(super) scan_id: ScanId,
pub(super) username: String,
pub(super) site_count: usize,
pub(super) started_at_ms: u64,
pub(super) elapsed_ms: u64,
pub(super) status: &'static str,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) summary: Option<crate::scan::Summary>,
}
#[derive(Debug, Deserialize, Default)]
pub(super) struct StartScanRequest {
pub(super) username: String,
#[serde(default)]
pub(super) only: Vec<String>,
#[serde(default)]
pub(super) exclude: Vec<String>,
#[serde(default)]
pub(super) tag: Vec<String>,
#[serde(default)]
pub(super) exclude_tag: Vec<String>,
#[serde(default)]
pub(super) top: Option<u32>,
#[serde(default)]
pub(super) nsfw: bool,
#[serde(default)]
pub(super) concurrency: Option<std::num::NonZeroUsize>,
#[serde(default)]
pub(super) deadline_secs: Option<u64>,
#[serde(default)]
pub(super) egress_names: Vec<String>,
}
#[derive(Serialize)]
pub(super) struct StartScanResponse {
pub(super) scan_id: ScanId,
pub(super) username: String,
pub(super) site_count: usize,
}
#[derive(Debug, Deserialize, Default)]
pub(super) struct RefilterRequest {
#[serde(default)]
pub(super) only: Vec<String>,
#[serde(default)]
pub(super) exclude: Vec<String>,
#[serde(default)]
pub(super) tag: Vec<String>,
#[serde(default)]
pub(super) exclude_tag: Vec<String>,
#[serde(default)]
pub(super) top: Option<u32>,
#[serde(default)]
pub(super) nsfw: bool,
#[serde(default)]
pub(super) concurrency: Option<std::num::NonZeroUsize>,
#[serde(default)]
pub(super) deadline_secs: Option<u64>,
#[serde(default)]
pub(super) egress_names: Vec<String>,
}
impl From<&RefilterRequest> for StartScanRequest {
fn from(r: &RefilterRequest) -> Self {
Self {
username: String::new(),
only: r.only.clone(),
exclude: r.exclude.clone(),
tag: r.tag.clone(),
exclude_tag: r.exclude_tag.clone(),
top: r.top,
nsfw: r.nsfw,
concurrency: r.concurrency,
deadline_secs: r.deadline_secs,
egress_names: r.egress_names.clone(),
}
}
}
#[derive(Serialize)]
pub(super) struct RefilterResponse {
pub(super) scan_id: ScanId,
pub(super) derived_from: ScanId,
pub(super) carried_outcomes: usize,
pub(super) site_count: usize,
}
#[derive(Serialize)]
#[serde(tag = "status", rename_all = "snake_case")]
pub(super) enum ScanSnapshot {
Running {
username: String,
site_count: usize,
elapsed_ms: u64,
partial: Vec<adler_core::CheckOutcome>,
},
Finished {
username: String,
site_count: usize,
#[serde(flatten)]
finished: FinishedScan,
},
}
#[derive(Debug, Deserialize)]
pub(super) struct RetryRequest {
pub(super) site: String,
}
#[derive(Serialize)]
pub(super) struct RetryResponse {
pub(super) outcome: CheckOutcome,
}
#[derive(Serialize)]
pub(super) struct StartEvent {
pub(super) username: String,
}