mostro_client/cli/
rate_user.rs

1use 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
14// Get the user rate
15fn 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    // Check boundaries
25    let rating_content = get_user_rate(rating)?;
26
27    // Get the trade keys
28    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    // Create rating message of counterpart
41    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    // Wait for incoming DM
62    let recv_event = wait_for_dm(ctx, Some(&trade_keys), sent_message).await?;
63
64    // Parse the incoming DM
65    // use a fake request id
66    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}