lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

commit 4f6389d9ae96b7a525ed062576dedc939a92d097
parent 70ebbfbfb612fd57dc99456f816c0c7d45dae969
Author: triesap <tyson@radroots.org>
Date:   Sat, 27 Jun 2026 21:45:13 +0000

trade: source order workflow projection bindings

- Remove the SDK-local trade order workflow projection descriptor.
- Generate the projection from the rr-rs source trade DTO root.
- Import event-owned order support types from generated event bindings.
- Drop stale discount fields and required event evidence from trade types.

Diffstat:
Mcrates/trade_bindings/src/dto.rs | 32++------------------------------
Mcrates/trade_bindings/src/lib.rs | 39++++++++++++++++++++++++++-------------
Mtools/sdk_xtask_import/src/dto_roots.rs | 46+++++++++++++++++++++++++++++++++++++++++++---
3 files changed, 71 insertions(+), 46 deletions(-)

diff --git a/crates/trade_bindings/src/dto.rs b/crates/trade_bindings/src/dto.rs @@ -4,7 +4,8 @@ use dto_bindgen_core::{ VariantShape, WireFieldNames, }; use radroots_trade::{ - listing::model::RadrootsTradeListingTotal, workflow::RadrootsTradeWorkflowState, + listing::model::RadrootsTradeListingTotal, order::RadrootsTradeOrderWorkflowProjection, + workflow::RadrootsTradeWorkflowState, }; pub fn dto_roots() -> Vec<RootDescriptor> { @@ -35,7 +36,6 @@ pub fn dto_roots() -> Vec<RootDescriptor> { RootDescriptor::new::<RadrootsTradeOrderQuery>(), RootDescriptor::new::<RadrootsTradeOrderSort>(), RootDescriptor::new::<RadrootsTradeOrderSortField>(), - RootDescriptor::new::<RadrootsTradeOrderWorkflowProjection>(), RootDescriptor::new::<RadrootsTradeReviewPriority>(), RootDescriptor::new::<RadrootsTradeReviewQueueEntry>(), RootDescriptor::new::<RadrootsTradeReviewStatus>(), @@ -58,7 +58,6 @@ macro_rules! imported_ts_type { imported_ts_type!(RadrootsCoreDecimalImport, "RadrootsCoreDecimal"); imported_ts_type!(RadrootsCoreDiscountImport, "RadrootsCoreDiscount"); -imported_ts_type!(RadrootsCoreDiscountValueImport, "RadrootsCoreDiscountValue"); imported_ts_type!(RadrootsCoreMoneyImport, "RadrootsCoreMoney"); imported_ts_type!(RadrootsCoreQuantityImport, "RadrootsCoreQuantity"); imported_ts_type!(RadrootsCoreQuantityPriceImport, "RadrootsCoreQuantityPrice"); @@ -80,12 +79,9 @@ imported_ts_type!( "RadrootsListingPublicLocation" ); imported_ts_type!(RadrootsListingProductImport, "RadrootsListingProduct"); -imported_ts_type!(RadrootsNostrEventPtrImport, "RadrootsNostrEventPtr"); imported_ts_type!(RadrootsPlotRefImport, "RadrootsPlotRef"); imported_ts_type!(RadrootsResourceAreaRefImport, "RadrootsResourceAreaRef"); -imported_ts_type!(RadrootsOrderEconomicLineImport, "RadrootsOrderEconomicLine"); imported_ts_type!(RadrootsOrderEventTypeImport, "RadrootsOrderEventType"); -imported_ts_type!(RadrootsOrderItemImport, "RadrootsOrderItem"); #[derive(dto_bindgen::Dto)] pub struct RadrootsTradeFacetCount { @@ -275,7 +271,6 @@ pub struct RadrootsTradeMarketplaceOrderSummary { pub last_message_type: RadrootsOrderEventTypeImport, pub item_count: u32, pub total_bin_count: u32, - pub has_requested_discounts: bool, pub last_reason: Option<String>, } @@ -372,29 +367,6 @@ pub enum RadrootsTradeOrderSortField { } #[derive(dto_bindgen::Dto)] -pub struct RadrootsTradeOrderWorkflowProjection { - pub order_id: String, - pub listing_addr: String, - pub buyer_pubkey: String, - pub seller_pubkey: String, - pub items: Vec<RadrootsOrderItemImport>, - pub requested_discounts: Option<Vec<RadrootsOrderEconomicLineImport>>, - pub status: RadrootsTradeWorkflowState, - pub listing_snapshot: Option<RadrootsNostrEventPtrImport>, - pub root_event_id: String, - pub last_event_id: String, - pub last_discount_request: Option<RadrootsCoreDiscountValueImport>, - pub last_discount_offer: Option<RadrootsCoreDiscountValueImport>, - pub accepted_discount: Option<RadrootsCoreDiscountValueImport>, - pub last_reason: Option<String>, - pub last_discount_decline_reason: Option<String>, - pub revision_count: u32, - pub cancellation_count: u32, - pub last_message_type: RadrootsOrderEventTypeImport, - pub last_actor_pubkey: String, -} - -#[derive(dto_bindgen::Dto)] pub enum RadrootsTradeReviewPriority { #[serde(rename = "low")] Low, diff --git a/crates/trade_bindings/src/lib.rs b/crates/trade_bindings/src/lib.rs @@ -7,6 +7,7 @@ pub use dto::dto_roots; #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum TradeTypeDisposition { SourceTradeRoot, + SourceTradeSupport, EventsBindingImport, SdkLocalPackageShape, } @@ -38,7 +39,10 @@ pub const TRADE_TYPE_INVENTORY: &[TradeTypeInventoryEntry] = &[ event_import("RadrootsListingProduct"), event_import("RadrootsListingPublicLocation"), event_import("RadrootsListingStatus"), + event_import("RadrootsOrderEconomics"), event_import("RadrootsOrderEventType"), + event_import("RadrootsOrderInventoryCommitment"), + source_support("RadrootsOrderIssue"), local_shape("RadrootsTradeFacetCount"), source_root("RadrootsTradeListing"), local_shape("RadrootsTradeListingBackofficeOverlay"), @@ -65,7 +69,7 @@ pub const TRADE_TYPE_INVENTORY: &[TradeTypeInventoryEntry] = &[ local_shape("RadrootsTradeOrderQuery"), local_shape("RadrootsTradeOrderSort"), local_shape("RadrootsTradeOrderSortField"), - local_shape("RadrootsTradeOrderWorkflowProjection"), + source_root("RadrootsTradeOrderWorkflowProjection"), local_shape("RadrootsTradeReviewPriority"), local_shape("RadrootsTradeReviewQueueEntry"), local_shape("RadrootsTradeReviewStatus"), @@ -94,8 +98,6 @@ pub const TRADE_LARGE_INTEGER_POLICIES: &[TradeLargeIntegerPolicyEntry] = &[ "RadrootsTradeOrderBackofficeView", "open_moderation_flag_count", ), - json_number_safe_count("RadrootsTradeOrderWorkflowProjection", "revision_count"), - json_number_safe_count("RadrootsTradeOrderWorkflowProjection", "cancellation_count"), ]; const fn source_root(export_name: &'static str) -> TradeTypeInventoryEntry { @@ -105,6 +107,13 @@ const fn source_root(export_name: &'static str) -> TradeTypeInventoryEntry { } } +const fn source_support(export_name: &'static str) -> TradeTypeInventoryEntry { + TradeTypeInventoryEntry { + export_name, + disposition: TradeTypeDisposition::SourceTradeSupport, + } +} + const fn event_import(export_name: &'static str) -> TradeTypeInventoryEntry { TradeTypeInventoryEntry { export_name, @@ -165,7 +174,10 @@ mod tests { "RadrootsListingProduct", "RadrootsListingPublicLocation", "RadrootsListingStatus", + "RadrootsOrderEconomics", "RadrootsOrderEventType", + "RadrootsOrderInventoryCommitment", + "RadrootsOrderIssue", "RadrootsTradeFacetCount", "RadrootsTradeListing", "RadrootsTradeListingBackofficeOverlay", @@ -213,7 +225,9 @@ mod tests { "RadrootsListingProduct", "RadrootsListingPublicLocation", "RadrootsListingStatus", + "RadrootsOrderEconomics", "RadrootsOrderEventType", + "RadrootsOrderInventoryCommitment", ] { assert_eq!( disposition(export_name), @@ -236,12 +250,21 @@ mod tests { "RadrootsTradeListing", "RadrootsTradeListingSubtotal", "RadrootsTradeListingTotal", + "RadrootsTradeOrderWorkflowProjection", "RadrootsTradeWorkflowState" ] ); } #[test] + fn trade_source_support_types_are_marked_for_source_registry() { + assert_eq!( + disposition("RadrootsOrderIssue"), + TradeTypeDisposition::SourceTradeSupport + ); + } + + #[test] fn trade_large_integer_policy_covers_current_count_fields() { let actual = TRADE_LARGE_INTEGER_POLICIES .iter() @@ -306,16 +329,6 @@ mod tests { "open_moderation_flag_count", super::TradeLargeIntegerPolicy::JsonNumberSafeCount ), - ( - "RadrootsTradeOrderWorkflowProjection", - "revision_count", - super::TradeLargeIntegerPolicy::JsonNumberSafeCount - ), - ( - "RadrootsTradeOrderWorkflowProjection", - "cancellation_count", - super::TradeLargeIntegerPolicy::JsonNumberSafeCount - ), ] ); } diff --git a/tools/sdk_xtask_import/src/dto_roots.rs b/tools/sdk_xtask_import/src/dto_roots.rs @@ -157,9 +157,16 @@ const TRADE_EXTERNAL_OVERRIDES: &[DtoExternalOverride] = &[ events_override("RadrootsNostrEventPtr"), events_override("RadrootsPlotRef"), events_override("RadrootsResourceAreaRef"), + events_override("RadrootsOrderEconomicActor"), + events_override("RadrootsOrderEconomicEffect"), + events_override("RadrootsOrderEconomicItem"), events_override("RadrootsOrderEconomicLine"), + events_override("RadrootsOrderEconomicLineKind"), + events_override("RadrootsOrderEconomics"), events_override("RadrootsOrderEventType"), + events_override("RadrootsOrderInventoryCommitment"), events_override("RadrootsOrderItem"), + events_override("RadrootsOrderPricingBasis"), ]; const TRADE_REQUIRED_EXTERNAL_PACKAGE_IMPORTS: &[&str] = @@ -217,7 +224,7 @@ pub fn replica_db_schema_types_module() -> Result<DtoTypesModule, String> { pub fn trade_types_module() -> Result<DtoTypesModule, String> { let root_set = package_root_set("trade").ok_or_else(|| "missing trade DTO roots".to_owned())?; let registry = root_set.registry(); - let options = trade_import_options(DtoRegistryRenderOptions::default())?; + let options = trade_import_options(&registry, DtoRegistryRenderOptions::default())?; let rendered = render_registry_types(&registry, &options)?; validate_external_override_usage(&rendered, TRADE_EXTERNAL_OVERRIDES)?; Ok(rendered) @@ -286,11 +293,19 @@ fn with_checked_external_type( } fn trade_import_options( + registry: &Registry, mut options: DtoRegistryRenderOptions, ) -> Result<DtoRegistryRenderOptions, String> { let package_exports = generated_external_package_exports()?; for override_target in TRADE_EXTERNAL_OVERRIDES { validate_external_override_target(*override_target, &package_exports)?; + if let Ok(type_id) = registry.type_id_by_export_name(override_target.target_type) { + options = options.with_external_type( + type_id, + override_target.import_name, + override_target.from, + ); + } options = options.with_external_override( override_target.target_type, override_target.import_name, @@ -624,6 +639,7 @@ mod tests { "RadrootsEventsIndexedIndexCheckpoint", ]; const TRADE_TYPE_INVENTORY: &[&str] = &[ + "RadrootsOrderIssue", "RadrootsTradeFacetCount", "RadrootsTradeListing", "RadrootsTradeListingBackofficeOverlay", @@ -760,7 +776,9 @@ mod tests { #[test] fn trade_external_override_targets_resolve_to_generated_exports() { - trade_import_options(DtoRegistryRenderOptions::default()) + let registry = package_root_set("trade").expect("trade roots").registry(); + + trade_import_options(&registry, DtoRegistryRenderOptions::default()) .expect("trade external overrides validate"); } @@ -918,10 +936,22 @@ mod tests { .get("@radroots/events-bindings") .is_some_and(|names| names.contains("RadrootsOrderEventType")) ); + assert!( + imports + .get("@radroots/events-bindings") + .is_some_and(|names| names.contains("RadrootsOrderEconomics")) + ); + assert!( + imports + .get("@radroots/events-bindings") + .is_some_and(|names| names.contains("RadrootsOrderInventoryCommitment")) + ); for duplicate in [ "export type RadrootsListing = ", "export type RadrootsFarmRef = ", + "export type RadrootsOrderEconomics = ", + "export type RadrootsOrderInventoryCommitment = ", "export type RadrootsCommercialMessagePayload = ", "export type RadrootsCommercialMessageType = ", "export type RadrootsOrderStatus = ", @@ -936,6 +966,7 @@ mod tests { ); assert!(marketplace_order_summary.contains("status: RadrootsTradeWorkflowState")); assert!(marketplace_order_summary.contains("last_message_type: RadrootsOrderEventType")); + assert!(!marketplace_order_summary.contains("has_requested_discounts")); let order_query = type_declaration(TRADE_BINDINGS_TYPES_TS, "RadrootsTradeOrderQuery"); assert!(order_query.contains("status?: RadrootsTradeWorkflowState | null")); @@ -945,8 +976,17 @@ mod tests { "RadrootsTradeOrderWorkflowProjection", ); assert!(workflow_projection.contains("status: RadrootsTradeWorkflowState")); - assert!(workflow_projection.contains("last_message_type: RadrootsOrderEventType")); + assert!(workflow_projection.contains("request_event_id?: string | null")); + assert!(workflow_projection.contains("last_event_id?: string | null")); + assert!(workflow_projection.contains("listing_addr?: string | null")); for stale_counter in [ + "root_event_id", + "last_message_type", + "last_discount_request", + "last_discount_offer", + "accepted_discount", + "last_discount_decline_reason", + "has_requested_discounts", "question_count", "answer_count", "discount_request_count",