dwn 0.4.0

Rust implementation of a Decentralized Web Node.
Documentation
use dwn_core::{message::descriptor::Descriptor, reply::RecordsReadReply};
use reqwest::StatusCode;
use tracing::warn;

use crate::ProcessContext;

pub async fn handle(
    ProcessContext {
        rs,
        ds,
        validation,
        target,
        msg,
    }: ProcessContext<'_>,
) -> Result<RecordsReadReply, StatusCode> {
    debug_assert!(matches!(msg.descriptor, Descriptor::RecordsRead(_)));

    let Descriptor::RecordsRead(desc) = msg.descriptor else {
        panic!("invalid descriptor: {:?}", msg.descriptor);
    };

    let record = rs.read(ds, target, &desc.record_id).map_err(|e| {
        warn!("Failed to read record {}: {:?}", msg.record_id, e);
        StatusCode::INTERNAL_SERVER_ERROR
    })?;

    let authorized = validation.authenticated.contains(target);

    Ok(RecordsReadReply {
        entry: record.map(|r| r.latest_entry).and_then(|m| {
            if let Descriptor::RecordsWrite(d) = &m.descriptor {
                if d.published != Some(true) && !authorized {
                    None
                } else {
                    Some(m)
                }
            } else {
                None
            }
        }),
    })
}