sdk_v1_local_enqueue_and_mock_sync.rs (4414B)
1 use radroots_authority::RadrootsActorContext; 2 use radroots_core::{ 3 RadrootsCoreCurrency, RadrootsCoreDecimal, RadrootsCoreMoney, RadrootsCoreQuantity, 4 RadrootsCoreQuantityPrice, RadrootsCoreUnit, 5 }; 6 use radroots_events::contract::RadrootsActorRole; 7 use radroots_events::ids::{RadrootsDTag, RadrootsInventoryBinId}; 8 use radroots_nostr::prelude::RadrootsNostrKeys; 9 use radroots_relay_transport::RadrootsMockRelayPublishAdapter; 10 use radroots_sdk::protocol::farm::RadrootsFarmRef; 11 use radroots_sdk::protocol::listing::{ 12 RadrootsListing, RadrootsListingBin, RadrootsListingProduct, 13 }; 14 use radroots_sdk::{ 15 ListingPreparePublishRequest, OrderStatusRequest, PushOutboxRequest, RadrootsSdk, 16 RadrootsSdkLocalKeySigner, RadrootsSdkSignerProvider, RadrootsSdkTimestamp, SdkIdempotencyKey, 17 SdkRelayTargetPolicy, SdkRelayTargetSet, SdkRelayUrlPolicy, 18 }; 19 20 const LOCAL_RELAY: &str = "ws://localhost:7777"; 21 22 #[tokio::main] 23 async fn main() -> Result<(), Box<dyn std::error::Error>> { 24 let keys = RadrootsNostrKeys::generate(); 25 let seller = keys.public_key().to_hex(); 26 let signer = RadrootsSdkLocalKeySigner::new(keys)?; 27 let sdk = RadrootsSdk::builder() 28 .fixed_clock(RadrootsSdkTimestamp::from_unix_seconds(1_700_000_000)) 29 .signer_provider(RadrootsSdkSignerProvider::LocalKey(signer)) 30 .build() 31 .await?; 32 let actor = RadrootsActorContext::test(seller.as_str(), [RadrootsActorRole::Seller])?; 33 let targets = SdkRelayTargetSet::new([LOCAL_RELAY], SdkRelayUrlPolicy::Localhost)?; 34 let target_policy = SdkRelayTargetPolicy::explicit(targets); 35 36 let prepared = sdk 37 .listings() 38 .prepare_publish(ListingPreparePublishRequest::new( 39 actor.clone(), 40 sample_listing(seller.as_str()), 41 ))?; 42 let enqueue = sdk 43 .listings() 44 .enqueue_prepared_publish( 45 &actor, 46 prepared, 47 target_policy, 48 Some(SdkIdempotencyKey::new("sdk-v1-local-example")?), 49 ) 50 .await?; 51 let adapter = RadrootsMockRelayPublishAdapter::new(); 52 let push = sdk 53 .sync() 54 .push_outbox_with_adapter(&adapter, PushOutboxRequest::new().with_limit(1)) 55 .await?; 56 let order_status = sdk 57 .orders() 58 .status(OrderStatusRequest::parse("example-order-1")?) 59 .await?; 60 61 println!("queued listing event: {}", enqueue.signed_event_id.as_str()); 62 println!("published events: {}", push.published_events); 63 println!("order found: {}", order_status.found); 64 Ok(()) 65 } 66 67 fn sample_listing(seller: &str) -> RadrootsListing { 68 RadrootsListing { 69 d_tag: RadrootsDTag::parse("AAAAAAAAAAAAAAAAAAAAAQ").expect("d tag"), 70 published_at: None, 71 farm: RadrootsFarmRef { 72 pubkey: seller.to_owned(), 73 d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_owned(), 74 }, 75 product: RadrootsListingProduct { 76 key: "coffee".to_owned(), 77 title: "Coffee".to_owned(), 78 category: "coffee".to_owned(), 79 summary: Some("Single origin coffee".to_owned()), 80 process: None, 81 lot: None, 82 location: None, 83 profile: None, 84 year: None, 85 }, 86 primary_bin_id: RadrootsInventoryBinId::parse("bin-1").expect("bin id"), 87 bins: vec![RadrootsListingBin { 88 bin_id: RadrootsInventoryBinId::parse("bin-1").expect("bin id"), 89 quantity: RadrootsCoreQuantity::new( 90 RadrootsCoreDecimal::from(1000u32), 91 RadrootsCoreUnit::MassG, 92 ), 93 price_per_canonical_unit: RadrootsCoreQuantityPrice { 94 amount: RadrootsCoreMoney::new( 95 RadrootsCoreDecimal::from(20u32), 96 RadrootsCoreCurrency::USD, 97 ), 98 quantity: RadrootsCoreQuantity::new( 99 RadrootsCoreDecimal::from(1u32), 100 RadrootsCoreUnit::MassG, 101 ), 102 }, 103 display_amount: None, 104 display_unit: None, 105 display_label: None, 106 display_price: None, 107 display_price_unit: None, 108 }], 109 resource_area: None, 110 plot: None, 111 discounts: None, 112 inventory_available: None, 113 availability: None, 114 delivery_method: None, 115 location: None, 116 images: None, 117 } 118 }