mostro_client/cli/
rate_user.rs

1use anyhow::Result;
2use mostro_core::prelude::*;
3use nostr_sdk::prelude::*;
4use uuid::Uuid;
5
6use crate::{
7    db::{connect, Order},
8    util::send_message_sync,
9};
10
11pub async fn execute_rate_user(
12    order_id: &Uuid,
13    rating: &u8,
14    identity_keys: &Keys,
15    mostro_key: PublicKey,
16    client: &Client,
17) -> Result<()> {
18    // User rating
19    let rating_content;
20
21    // Check boundaries
22    if let 1..=5 = *rating {
23        rating_content = Payload::RatingUser(*rating);
24    } else {
25        println!("Rating must be in the range 1 - 5");
26        std::process::exit(0);
27    }
28
29    let pool = connect().await?;
30
31    let trade_keys = if let Ok(order_to_vote) = Order::get_by_id(&pool, &order_id.to_string()).await
32    {
33        match order_to_vote.trade_keys.as_ref() {
34            Some(trade_keys) => Keys::parse(trade_keys)?,
35            None => {
36                anyhow::bail!("No trade_keys found for this order");
37            }
38        }
39    } else {
40        println!("order {} not found", order_id);
41        std::process::exit(0)
42    };
43
44    // Create rating message of counterpart
45    let rate_message = Message::new_order(
46        Some(*order_id),
47        None,
48        None,
49        Action::RateUser,
50        Some(rating_content),
51    );
52
53    send_message_sync(
54        client,
55        Some(identity_keys),
56        &trade_keys,
57        mostro_key,
58        rate_message,
59        true,
60        false,
61    )
62    .await?;
63
64    std::process::exit(0);
65}