//! a cursor that isn't an existing rkey is an invalid request here, unlike a pds's keyset lookup.
use crate::atproto::{ChainState, Pool, record_file};
use crate::nginx::conf::Block;
use super::{empty, empty_to, map, map_with_default, reroute, spellings};
const RECORD_CID_SHAPE: &str = "~^bafyrei[a-z2-7]{52}$";
pub(crate) fn add(
record_rows: &mut Vec<(String, String)>,
pool: &mut Pool,
repo: &ChainState,
) -> anyhow::Result<()> {
let name = repo.dir_name();
for record in &repo.records {
let current = record.answer["cid"].as_str().unwrap_or_default();
let file = record_file(&record.collection, &record.rkey, current);
pool.put(&file, &serde_json::to_vec(&record.answer)?)?;
for rkey in spellings(&record.rkey) {
for cid in ["", current] {
let key = format!("{name}|{}|{rkey}|{cid}", record.collection);
record_rows.push((key, file.clone()));
}
}
}
Ok(())
}
pub(crate) fn maps(record: Vec<(String, String)>) -> [Block; 2] {
[
map(
"$ks_atp_repo|$arg_collection|$arg_rkey|$arg_cid",
"$ks_atp_rec",
record,
),
map_with_default(
"invalid_request",
"$arg_cid",
"$ks_atp_rec_miss",
record_misses(),
),
]
}
pub(crate) fn location() -> Block {
reroute(
Block::exact("/xrpc/com.atproto.repo.getRecord")
.block(empty("$arg_repo", "invalid_request"))
.block(empty("$arg_collection", "invalid_request"))
.block(empty("$arg_rkey", "invalid_request"))
.block(empty("$ks_atp_repo", "atp_repo_not_found"))
.block(empty_to("$ks_atp_rec", "/_ks_error/$ks_atp_rec_miss")),
"/_ks_atproto/$ks_atp_repo/$ks_atp_rec",
)
}
pub(crate) fn record_misses() -> Vec<(String, String)> {
vec![
(String::new(), "atp_record_not_found".into()),
(RECORD_CID_SHAPE.into(), "atp_record_not_found".into()),
]
}