use crate::app::context::AppContext;
use crate::util::{enqueue_order_msg, get_user_orders_by_id};
use mostro_core::prelude::*;
use nostr_sdk::prelude::*;
pub async fn orders_action(
ctx: &AppContext,
msg: Message,
event: &UnwrappedMessage,
) -> Result<(), MostroError> {
let pool = ctx.pool();
let payload = msg.get_inner_message_kind().get_payload();
let ids = match payload {
Some(Payload::Ids(ids)) => ids,
_ => return Err(MostroCantDo(CantDoReason::InvalidParameters)),
};
if ids.is_empty() {
return Err(MostroCantDo(CantDoReason::InvalidParameters));
}
let mostro_settings = &ctx.settings().mostro;
if ids.len() > mostro_settings.max_orders_per_response as usize {
return Err(MostroCantDo(CantDoReason::TooManyRequests));
}
let orders = get_user_orders_by_id(pool, ids, &event.identity.to_string()).await?;
if orders.is_empty() {
return Err(MostroCantDo(CantDoReason::NotFound));
}
let small_orders = orders
.into_iter()
.map(|order| {
let mut small = SmallOrder::from(order);
small.buyer_invoice = None;
small
})
.collect::<Vec<SmallOrder>>();
let response_payload = Payload::Orders(small_orders);
enqueue_order_msg(
msg.get_inner_message_kind().request_id,
None,
Action::Orders,
Some(response_payload),
event.sender,
None,
)
.await;
Ok(())
}