rhi

Coordinated trade for connected markets
git clone https://radroots.dev/git/rhi.git
Log | Files | Refs | README | LICENSE

commit 66a1c2a8a8da64eb26bc8756439fa511d3e53d4f
parent 4c44307be7ab95c70cf026ce3f119869cd0f5cff
Author: triesap <137732411+triesap@users.noreply.github.com>
Date:   Sat, 26 Apr 2025 22:19:29 +0000

Refactor to use `radroots-common` listing order types.

Diffstat:
MCargo.lock | 7++++++-
Mcrates/rhi/Cargo.toml | 1-
Mcrates/rhi/src/handlers/job_request_order.rs | 40+++-------------------------------------
Mcrates/rhi/src/models/event_classified.rs | 33++++++++++++++++++---------------
Mcrates/rhi/src/models/mod.rs | 1-
Dcrates/rhi/src/models/order_classified.rs | 51---------------------------------------------------
6 files changed, 27 insertions(+), 106 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -1409,6 +1409,12 @@ checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" [[package]] name = "radroots-common" version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "thiserror 1.0.69", + "typeshare", +] [[package]] name = "rand" @@ -1526,7 +1532,6 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", - "typeshare", "uuid", ] diff --git a/crates/rhi/Cargo.toml b/crates/rhi/Cargo.toml @@ -20,6 +20,5 @@ thiserror = "1.0" tokio = { version = "1", features = ["full"] } tracing = "0.1" tracing-subscriber = "0.3" -typeshare = "1.0.0" uuid = { version = "1.16.0", features = ["v4"] } radroots-common = { path = "../radroots-common" } diff --git a/crates/rhi/src/handlers/job_request_order.rs b/crates/rhi/src/handlers/job_request_order.rs @@ -4,7 +4,7 @@ use nostr::{ key::Keys, }; use nostr_sdk::{Client, client::Error as NostrClientError}; -use serde::Deserialize; +use radroots_common::models::listing_order_request::ListingOrderRequest; use thiserror::Error; use tracing::info; @@ -35,40 +35,6 @@ pub enum JobRequestOrderError { Unsatisfiable(String), } -#[derive(Debug, Deserialize)] -pub struct JobRequestOrderDataQuantity { - pub amount: f64, - pub unit: String, - pub count: u32, - pub mass_g: f64, - pub label: String, -} - -#[derive(Debug, Deserialize)] -pub struct JobRequestOrderDataPrice { - pub amount: f64, - pub currency: String, - pub quantity_amount: f64, - pub quantity_unit: String, -} - -#[derive(Debug, Deserialize)] -pub struct JobRequestOrderDataOrder { - pub price: JobRequestOrderDataPrice, - pub quantity: JobRequestOrderDataQuantity, -} - -#[derive(Debug, Deserialize)] -pub struct JobRequestOrderDataEvent { - pub id: String, -} - -#[derive(Debug, Deserialize)] -pub struct JobRequestOrderData { - pub event: JobRequestOrderDataEvent, - pub order: JobRequestOrderDataOrder, -} - pub async fn handle_job_request_order( event_job_request: Event, _keys: Keys, @@ -76,7 +42,7 @@ pub async fn handle_job_request_order( _job_req: JobRequest, job_req_input: JobRequestInput, ) -> Result<(), JobRequestError> { - let order_data: JobRequestOrderData = serde_json::from_str(&job_req_input.data) + let order_data: ListingOrderRequest = serde_json::from_str(&job_req_input.data) .map_err(|e| JobRequestOrderError::ParseReference(e.to_string()))?; let ref_id = &order_data.event.id; @@ -87,7 +53,7 @@ pub async fn handle_job_request_order( let ref_classified = EventClassified::from_event(&ref_event) .map_err(|_| JobRequestOrderError::ParseReference(ref_id.clone()))?; - let order_result = ref_classified.calculate_order(&order_data.order)?; + let order_result = ref_classified.calculate_order(&order_data.payload)?; let payload = serde_json::to_string(&order_result)?; let tags = vec![Tag::custom( diff --git a/crates/rhi/src/models/event_classified.rs b/crates/rhi/src/models/event_classified.rs @@ -3,7 +3,7 @@ use nostr::{EventId, event::Event}; use serde::{Deserialize, Serialize}; use crate::{ - handlers::job_request_order::{JobRequestOrderDataOrder, JobRequestOrderError}, + handlers::job_request_order::JobRequestOrderError, utils::{ nostr::{ nostr_tag_match_geohash, nostr_tag_match_l, nostr_tag_match_location, @@ -13,9 +13,12 @@ use crate::{ }, }; -use super::order_classified::{ - OrderClassifiedDiscount, OrderClassifiedPrice, OrderClassifiedQuantity, OrderClassifiedResult, - OrderClassifiedTotal, +use radroots_common::models::{ + listing_order::{ + ListingOrder, ListingOrderDiscount, ListingOrderPrice, ListingOrderQuantity, + ListingOrderSubtotal, ListingOrderTotal, + }, + listing_order_request::ListingOrderRequestPayload, }; #[derive(Debug, Serialize, Deserialize, Clone, Default)] @@ -280,8 +283,8 @@ impl EventClassified { pub fn calculate_order( &self, - order: &JobRequestOrderDataOrder, - ) -> Result<OrderClassifiedResult, JobRequestOrderError> { + order: &ListingOrderRequestPayload, + ) -> Result<ListingOrder, JobRequestOrderError> { let quantity = &order.quantity; let price = &order.price; @@ -331,7 +334,7 @@ impl EventClassified { let unit_price = tier.amount / tier.quantity_amount; let subtotal = (unit_price * converted_qty * 100.0).round() / 100.0; - let mut discounts: Vec<OrderClassifiedDiscount> = Vec::new(); + let mut discounts: Vec<ListingOrderDiscount> = Vec::new(); let package_key = format!( "{}-{}-{}", quantity.amount, @@ -355,7 +358,7 @@ impl EventClassified { } else { (*value * 100.0).round() / 100.0 }; - discounts.push(OrderClassifiedDiscount { + discounts.push(ListingOrderDiscount { discount_type: "subtotal".into(), threshold: Some(*threshold), threshold_unit: None, @@ -388,7 +391,7 @@ impl EventClassified { let qty_in_dis = convert_mass(total_qty, &qty_unit, &dis_unit); let amt = (qty_in_dis * discount_per_unit * 100.0).round() / 100.0; - discounts.push(OrderClassifiedDiscount { + discounts.push(ListingOrderDiscount { discount_type: "mass".into(), threshold: Some(*threshold), threshold_unit: Some(threshold_unit.clone()), @@ -411,7 +414,7 @@ impl EventClassified { let amt = (*discount_per_unit * quantity.count as f64 * 100.0).round() / 100.0; - discounts.push(OrderClassifiedDiscount { + discounts.push(ListingOrderDiscount { discount_type: "quantity".into(), threshold: Some(*min_count as f64), threshold_unit: None, @@ -428,26 +431,26 @@ impl EventClassified { let total_discount: f64 = discounts.iter().map(|d| d.discount_amount).sum(); let total = ((subtotal - total_discount) * 100.0).round() / 100.0; - Ok(OrderClassifiedResult { - quantity: OrderClassifiedQuantity { + Ok(ListingOrder { + quantity: ListingOrderQuantity { amount: quantity.amount, unit: quantity.unit.clone(), label: quantity.label.clone(), }, - price: OrderClassifiedPrice { + price: ListingOrderPrice { amount: tier.amount, currency: tier.currency.clone(), quantity_amount: tier.quantity_amount, quantity_unit: price.quantity_unit.clone(), }, discounts, - subtotal: OrderClassifiedTotal { + subtotal: ListingOrderSubtotal { price_amount: subtotal, price_currency: tier.currency.clone(), quantity_amount: total_qty, quantity_unit: quantity.unit.clone(), }, - total: OrderClassifiedTotal { + total: ListingOrderTotal { price_amount: total, price_currency: tier.currency.clone(), quantity_amount: total_qty, diff --git a/crates/rhi/src/models/mod.rs b/crates/rhi/src/models/mod.rs @@ -1,2 +1 @@ pub mod event_classified; -pub mod order_classified; diff --git a/crates/rhi/src/models/order_classified.rs b/crates/rhi/src/models/order_classified.rs @@ -1,51 +0,0 @@ -use serde::{Deserialize, Serialize}; -use typeshare::typeshare; - -#[typeshare] -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct OrderClassifiedResult { - pub quantity: OrderClassifiedQuantity, - pub price: OrderClassifiedPrice, - pub discounts: Vec<OrderClassifiedDiscount>, - pub subtotal: OrderClassifiedTotal, - pub total: OrderClassifiedTotal, -} - -#[typeshare] -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct OrderClassifiedQuantity { - pub amount: f64, - pub unit: String, - pub label: String, -} - -#[typeshare] -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct OrderClassifiedPrice { - pub amount: f64, - pub currency: String, - pub quantity_amount: f64, - pub quantity_unit: String, -} - -#[typeshare] -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct OrderClassifiedDiscount { - pub discount_type: String, - pub threshold: Option<f64>, - pub threshold_unit: Option<String>, - pub discount_per_unit: Option<f64>, - pub discount_unit: Option<String>, - pub discount_percent: Option<f64>, - pub discount_amount: f64, - pub currency: String, -} - -#[typeshare] -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct OrderClassifiedTotal { - pub price_amount: f64, - pub price_currency: String, - pub quantity_amount: f64, - pub quantity_unit: String, -}