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 parser::common::{print_info_line, print_key_value, print_section_header},
12 util::{print_dm_events, send_dm, wait_for_dm},
13};
14
15fn get_user_rate(rating: &u8, order_id: &Uuid) -> Result<Payload> {
17 if let Some(rating) = RATING_BOUNDARIES.iter().find(|r| r == &rating) {
18 print_section_header("⭐ Rate User");
19 print_key_value("📋", "Order ID", &order_id.to_string());
20 print_key_value("⭐", "Rating", &format!("{}/5", rating));
21 print_info_line("💡", "Sending user rating...");
22 println!();
23 Ok(Payload::RatingUser(*rating))
24 } else {
25 print_section_header("❌ Invalid Rating");
26 print_key_value("⭐", "Rating", &rating.to_string());
27 print_info_line("💡", "Rating must be between 1 and 5");
28 print_info_line("📊", "Valid ratings: 1, 2, 3, 4, 5");
29 Err(anyhow::anyhow!("Rating must be in the range 1 - 5"))
30 }
31}
32
33pub async fn execute_rate_user(order_id: &Uuid, rating: &u8, ctx: &Context) -> Result<()> {
34 let rating_content = get_user_rate(rating, order_id)?;
36
37 let trade_keys =
39 if let Ok(order_to_vote) = Order::get_by_id(&ctx.pool, &order_id.to_string()).await {
40 match order_to_vote.trade_keys.as_ref() {
41 Some(trade_keys) => Keys::parse(trade_keys)?,
42 None => {
43 return Err(anyhow::anyhow!("No trade_keys found for this order"));
44 }
45 }
46 } else {
47 return Err(anyhow::anyhow!("order {} not found", order_id));
48 };
49
50 let rate_message = Message::new_order(
52 Some(*order_id),
53 None,
54 None,
55 Action::RateUser,
56 Some(rating_content),
57 )
58 .as_json()
59 .map_err(|_| anyhow::anyhow!("Failed to serialize message"))?;
60
61 let sent_message = send_dm(
62 &ctx.client,
63 Some(&ctx.identity_keys),
64 &trade_keys,
65 &ctx.mostro_pubkey,
66 rate_message,
67 None,
68 false,
69 );
70
71 let recv_event = wait_for_dm(ctx, Some(&trade_keys), sent_message).await?;
73
74 let fake_request_id = Uuid::new_v4().as_u128() as u64;
77 print_dm_events(recv_event, fake_request_id, ctx, Some(&trade_keys)).await?;
78
79 Ok(())
80}