20260718 新增查询服务 VRP 检索接口
This commit is contained in:
@@ -9,6 +9,7 @@ use serde_json::value::RawValue;
|
||||
use serde_json::{Value, json};
|
||||
use sha2::{Digest, Sha256};
|
||||
|
||||
use crate::query::vrp::VrpRecord;
|
||||
use crate::query_db::{
|
||||
ObjectInstanceRecord, PublicationPointRecord, QUERY_DB_SCHEMA_VERSION, QueryDbError,
|
||||
QueryDbResult, QueryPage, RepositoryRecord, StatsRecord,
|
||||
@@ -23,6 +24,7 @@ pub struct ReportSummary {
|
||||
pub query_audit: Option<Value>,
|
||||
pub download_stats: Option<Value>,
|
||||
pub vrps_count: u64,
|
||||
pub vrps: Vec<VrpRecord>,
|
||||
pub aspas_count: u64,
|
||||
pub warnings_count: u64,
|
||||
pub objects_count: u64,
|
||||
@@ -287,7 +289,13 @@ impl<'de> Visitor<'de> for ReportSummaryVisitor<'_> {
|
||||
out.repos = pps.repos;
|
||||
out.stats = pps.stats;
|
||||
}
|
||||
"vrps" => out.vrps_count = map.next_value::<CountSeq>()?.0,
|
||||
"vrps" => {
|
||||
let vrps = map.next_value_seed(VrpSequenceSeed {
|
||||
run_id: self.run_id,
|
||||
})?;
|
||||
out.vrps_count = vrps.count;
|
||||
out.vrps = vrps.records;
|
||||
}
|
||||
"aspas" => out.aspas_count = map.next_value::<CountSeq>()?.0,
|
||||
"download_stats" => out.download_stats = Some(map.next_value()?),
|
||||
"queryAudit" => out.query_audit = Some(map.next_value()?),
|
||||
@@ -325,6 +333,62 @@ struct PublicationPointsSummary {
|
||||
objects_count: u64,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct RawVrpRecord {
|
||||
asn: u32,
|
||||
prefix: String,
|
||||
max_length: u8,
|
||||
}
|
||||
|
||||
struct VrpSequenceSeed<'a> {
|
||||
run_id: &'a str,
|
||||
}
|
||||
|
||||
struct VrpSequence {
|
||||
count: u64,
|
||||
records: Vec<VrpRecord>,
|
||||
}
|
||||
|
||||
impl<'de> DeserializeSeed<'de> for VrpSequenceSeed<'_> {
|
||||
type Value = VrpSequence;
|
||||
|
||||
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
deserializer.deserialize_seq(VrpSequenceVisitor {
|
||||
run_id: self.run_id,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
struct VrpSequenceVisitor<'a> {
|
||||
run_id: &'a str,
|
||||
}
|
||||
|
||||
impl<'de> Visitor<'de> for VrpSequenceVisitor<'_> {
|
||||
type Value = VrpSequence;
|
||||
|
||||
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
formatter.write_str("VRP array")
|
||||
}
|
||||
|
||||
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
||||
where
|
||||
A: SeqAccess<'de>,
|
||||
{
|
||||
let mut count = 0u64;
|
||||
let mut records = Vec::new();
|
||||
while let Some(raw) = seq.next_element::<RawVrpRecord>()? {
|
||||
let record = VrpRecord::from_report(self.run_id, raw.asn, &raw.prefix, raw.max_length)
|
||||
.map_err(de::Error::custom)?;
|
||||
count += 1;
|
||||
records.push(record);
|
||||
}
|
||||
Ok(VrpSequence { count, records })
|
||||
}
|
||||
}
|
||||
|
||||
struct PublicationPointsSummaryVisitor<'a> {
|
||||
run_id: &'a str,
|
||||
}
|
||||
@@ -1247,7 +1311,10 @@ mod tests {
|
||||
{"rsync_uri":"rsync://repo.example/rpki/a.roa","sha256_hex":"22","kind":"roa","result":"error","detail":"bad roa"}
|
||||
]
|
||||
}],
|
||||
"vrps":[{},{}],
|
||||
"vrps":[
|
||||
{"asn":64496,"prefix":"192.0.2.0/24","max_length":24},
|
||||
{"asn":64497,"prefix":"2001:db8::/32","max_length":48}
|
||||
],
|
||||
"aspas":[{}],
|
||||
"download_stats":{"eventsTotal":0},
|
||||
"queryAudit":{"status":"complete","eventsPath":"validation-events.jsonl"}
|
||||
|
||||
Reference in New Issue
Block a user