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()
}