use crate::app::context::AppContext;
use crate::util::{enqueue_order_msg, get_order, update_order_event};
use mostro_core::prelude::*;
use nostr_sdk::prelude::*;
use sqlx_crud::Crud;
pub async fn fiat_sent_action(
ctx: &AppContext,
msg: Message,
event: &UnwrappedMessage,
my_keys: &Keys,
) -> Result<(), MostroError> {
let pool = ctx.pool();
let order = get_order(&msg, pool).await?;
if let Err(cause) = order.check_status(Status::Active) {
return Err(MostroCantDo(cause));
}
if order.get_buyer_pubkey().ok() != Some(event.sender) {
return Err(MostroCantDo(CantDoReason::InvalidPubkey));
}
let next_trade = msg
.get_inner_message_kind()
.get_next_trade_key()
.map_err(MostroInternalErr)?;
let mut order_updated = update_order_event(my_keys, Status::FiatSent, &order)
.await
.map_err(|e| MostroError::MostroInternalErr(ServiceError::NostrError(e.to_string())))?;
let seller_pubkey = order.get_seller_pubkey().map_err(MostroInternalErr)?;
let peer = Peer {
pubkey: event.sender.to_string(),
reputation: None,
};
enqueue_order_msg(
None,
Some(order_updated.id),
Action::FiatSentOk,
Some(Payload::Peer(peer)),
seller_pubkey,
None,
)
.await;
let peer = Peer {
pubkey: seller_pubkey.to_string(),
reputation: None,
};
enqueue_order_msg(
msg.get_inner_message_kind().request_id,
Some(order_updated.id),
Action::FiatSentOk,
Some(Payload::Peer(peer)),
event.sender,
None,
)
.await;
if order.is_range_order() {
if let Some((pubkey, index)) = next_trade {
order_updated.next_trade_pubkey = Some(pubkey);
order_updated.next_trade_index = Some(index as i64);
}
}
order_updated
.update(pool)
.await
.map_err(|e| MostroInternalErr(ServiceError::DbAccessError(e.to_string())))?;
Ok(())
}