rustolio-db 0.1.0

An DB extention for the rustolio HTTP-Server
Documentation
//
// SPDX-License-Identifier: MPL-2.0
//
// Copyright (c) 2026 Tobias Binnewies. All rights reserved.
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
//

use rustolio_rpc::prelude::*;
use rustolio_utils::{bytes::Bytes, crypto::signature::SignedValue};

use crate::{Key, KeyType, Value};

#[rpc("/get", ctx = "db")]
pub(super) async fn get(
    msg: Bytes,
    ctx: &'static crate::Service,
) -> std::result::Result<Option<Value>, ServerFnError<String>> {
    use crate::store::OperateStore as _;

    let key = Key::from_value(&msg, KeyType::ReadWrite);
    let get_op = crate::store::get(key, None);
    ctx.handle(get_op).await.server_result()
}

#[rpc("/set", ctx = "db")]
pub(super) async fn set(
    msg: (Bytes, Value),
    ctx: &'static crate::Service,
) -> std::result::Result<(), ServerFnError<String>> {
    use crate::store::OperateStore as _;

    let (key, value) = msg;
    let key = Key::from_value(&key, KeyType::ReadWrite);
    let set_op = crate::store::set(key, value);
    ctx.handle(set_op).await.server_result()
}

#[rpc("/secure_get", ctx = "db")]
pub(super) async fn secure_get(
    msg: SignedValue<Bytes>,
    ctx: &'static crate::Service,
) -> std::result::Result<Option<Value>, ServerFnError<String>> {
    use crate::store::OperateStore as _;

    if msg.verify().is_err() {
        return Err(String::from("Invalid Signature").into());
    }

    let signer = msg.signer();
    let key = Key::from_value(&msg.into_value(), KeyType::ReadWrite);

    let get_op = crate::store::get(key, Some(signer));
    ctx.handle(get_op).await.server_result()
}

#[rpc("/secure_set", ctx = "db")]
pub(super) async fn secure_set(
    msg: SignedValue<(Bytes, Value)>,
    ctx: &'static crate::Service,
) -> std::result::Result<(), ServerFnError<String>> {
    use crate::store::OperateStore as _;

    if msg.verify().is_err() {
        return Err(String::from("Invalid Signature").into());
    }

    let signer = msg.signer();

    let (key, value) = msg.into_value();
    let key = Key::from_value(&key, KeyType::ReadWrite);

    if value.signer() != Some(signer) {
        return Err(crate::Error::NotAllowed.to_string().into());
    }

    let set_op = crate::store::set(key, value);
    ctx.handle(set_op).await.server_result()
}