use jacquard_common::{
Data,
types::{
cid::Cid,
nsid::Nsid,
recordkey::{RecordKey, Rkey},
},
};
use super::*;
#[derive(Deserialize)]
pub struct GetRecord {
pub collection: Nsid,
pub repo: AtIdentifier,
pub rkey: RecordKey<Rkey>,
}
#[derive(Serialize)]
pub struct GetRecordOutput {
pub uri: AtUri,
#[serde(skip_serializing_if = "Option::is_none")]
pub cid: Option<Cid>,
pub value: Data,
}
pub async fn handle(
State(hydrant): State<Hydrant>,
ExtractXrpc(req): ExtractXrpc<GetRecord>,
) -> XrpcResult<Json<GetRecordOutput>> {
let repo = hydrant
.repos
.resolve(&req.repo)
.await
.map_err(internal_error)?;
if let Some(reason) = unavailable(&repo).await.map_err(internal_error)? {
return Err(record_unavailable(reason));
}
let record = repo
.get_record(&req.collection, &req.rkey.0)
.await
.map_err(internal_error)?;
let Some(record) = record else {
return Err(xrpc_error(StatusCode::NOT_FOUND, "RecordNotFound", None));
};
Ok(Json(GetRecordOutput {
uri: AtUri::from_parts_owned(
record.did.as_str(),
req.collection.as_str(),
req.rkey.as_ref(),
)
.unwrap(),
cid: Some(record.cid),
value: record.value,
}))
}