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:
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,
-}