mostro_client/cli/
rate_user.rs1use anyhow::Result;
2use mostro_core::prelude::*;
3use nostr_sdk::prelude::*;
4use uuid::Uuid;
5
6const RATING_BOUNDARIES: [u8; 5] = [1, 2, 3, 4, 5];
7
8use crate::{
9 cli::Context,
10 db::Order,
11 util::{print_dm_events, send_dm, wait_for_dm},
12};
13
14fn get_user_rate(rating: &u8) -> Result<Payload> {
16 if let Some(rating) = RATING_BOUNDARIES.iter().find(|r| r == &rating) {
17 Ok(Payload::RatingUser(*rating))
18 } else {
19 Err(anyhow::anyhow!("Rating must be in the range 1 - 5"))
20 }
21}
22
23pub async fn execute_rate_user(order_id: &Uuid, rating: &u8, ctx: &Context) -> Result<()> {
24 let rating_content = get_user_rate(rating)?;
26
27 let trade_keys =
29 if let Ok(order_to_vote) = Order::get_by_id(&ctx.pool, &order_id.to_string()).await {
30 match order_to_vote.trade_keys.as_ref() {
31 Some(trade_keys) => Keys::parse(trade_keys)?,
32 None => {
33 return Err(anyhow::anyhow!("No trade_keys found for this order"));
34 }
35 }
36 } else {
37 return Err(anyhow::anyhow!("order {} not found", order_id));
38 };
39
40 let rate_message = Message::new_order(
42 Some(*order_id),
43 None,
44 None,
45 Action::RateUser,
46 Some(rating_content),
47 )
48 .as_json()
49 .map_err(|_| anyhow::anyhow!("Failed to serialize message"))?;
50
51 let sent_message = send_dm(
52 &ctx.client,
53 Some(&ctx.identity_keys),
54 &trade_keys,
55 &ctx.mostro_pubkey,
56 rate_message,
57 None,
58 false,
59 );
60
61 let recv_event = wait_for_dm(ctx, Some(&trade_keys), sent_message).await?;
63
64 let fake_request_id = Uuid::new_v4().as_u128() as u64;
67 print_dm_events(recv_event, fake_request_id, ctx, Some(&trade_keys)).await?;
68
69 Ok(())
70}