sdk

Radroots SDK and bindings
git clone https://radroots.dev/git/sdk.git
Log | Files | Refs | README

commit 3cae34b3248f448691e05585b2030133260f5591
parent 56efb90bc4b94143861ec543a9e85a4a656300df
Author: triesap <tyson@radroots.org>
Date:   Fri, 26 Jun 2026 05:58:17 +0000

sdk: expose geonames runtime asset API

Diffstat:
MCargo.lock | 19+++++++++++++++++++
MCargo.toml | 2++
Mcrates/events_bindings/src/lib.rs | 4++--
Mcrates/events_bindings/src/model.rs | 85++++++++++++++-----------------------------------------------------------------
Mcrates/sdk/Cargo.toml | 4++++
Acrates/sdk/src/geonames.rs | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcrates/sdk/src/lib.rs | 19+++++++++++++++++++
Mcrates/sdk/tests/facade.rs | 8+++-----
Acrates/sdk/tests/geonames.rs | 48++++++++++++++++++++++++++++++++++++++++++++++++
Mcrates/trade_bindings/src/dto.rs | 7+++++--
Mcrates/trade_bindings/src/lib.rs | 6+++---
Mpackages/events-bindings/src/generated/kinds.ts | 31+++++++++----------------------
Mpackages/events-bindings/src/generated/types.ts | 138++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mpackages/trade-bindings/src/generated/types.ts | 6+++---
Mtools/xtask/src/dto_roots.rs | 6+++---
15 files changed, 293 insertions(+), 179 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -1797,6 +1797,21 @@ dependencies = [ ] [[package]] +name = "radroots_geocoder" +version = "0.1.0-alpha.2" +dependencies = [ + "hex", + "radroots_runtime_paths", + "reqwest", + "rusqlite", + "serde", + "sha2", + "tempfile", + "thiserror 1.0.69", + "url", +] + +[[package]] name = "radroots_identity" version = "0.1.0-alpha.2" dependencies = [ @@ -2046,6 +2061,7 @@ dependencies = [ "radroots_event_store", "radroots_events", "radroots_events_codec", + "radroots_geocoder", "radroots_identity", "radroots_nostr", "radroots_nostr_connect", @@ -2056,6 +2072,7 @@ dependencies = [ "radroots_replica_db", "radroots_replica_db_schema", "radroots_replica_sync", + "radroots_runtime_paths", "radroots_sql_core", "radroots_trade", "reqwest", @@ -2250,7 +2267,9 @@ checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", + "futures-channel", "futures-core", + "futures-util", "http", "http-body", "http-body-util", diff --git a/Cargo.toml b/Cargo.toml @@ -34,6 +34,7 @@ radroots_event_store = { path = "../lib/crates/event_store", version = "0.1.0-al radroots_events = { path = "../lib/crates/events", version = "0.1.0-alpha.2", default-features = false } radroots_events_codec = { path = "../lib/crates/events_codec", version = "0.1.0-alpha.2", default-features = false } radroots_events_indexed = { path = "../lib/crates/events_indexed", version = "0.1.0-alpha.2", default-features = false } +radroots_geocoder = { path = "../lib/crates/geocoder", version = "0.1.0-alpha.2" } radroots_identity = { path = "../lib/crates/identity", version = "0.1.0-alpha.2", default-features = false, features = [ "std", ] } @@ -46,6 +47,7 @@ radroots_relay_transport = { path = "../lib/crates/relay_transport", version = " radroots_replica_db = { path = "../lib/crates/replica_db", version = "0.1.0-alpha.2", default-features = false } radroots_replica_db_schema = { path = "../lib/crates/replica_db_schema", version = "0.1.0-alpha.2", default-features = false } radroots_replica_sync = { path = "../lib/crates/replica_sync", version = "0.1.0-alpha.2", default-features = false } +radroots_runtime_paths = { path = "../lib/crates/runtime_paths", version = "0.1.0-alpha.2", default-features = false } radroots_sdk_sql_wasm_runtime = { path = "crates/sql_wasm_runtime", version = "0.1.0-alpha.2" } radroots_sql_core = { path = "../lib/crates/sql_core", version = "0.1.0-alpha.2", default-features = false } radroots_trade = { path = "../lib/crates/trade", version = "0.1.0-alpha.2", default-features = false, features = [ diff --git a/crates/events_bindings/src/lib.rs b/crates/events_bindings/src/lib.rs @@ -18,7 +18,7 @@ mod tests { assert!(constants.contains(RADROOTS_LISTING_PRODUCT_TAG_KEYS[0])); assert!(kinds_ts.contains("KIND_LISTING")); assert!(kinds_ts.contains(&kinds::KIND_LISTING.to_string())); - assert!(kinds_ts.contains("KIND_TRADE_LISTING_ORDER_REQ")); - assert!(kinds_ts.contains(&kinds::KIND_TRADE_LISTING_ORDER_REQ.to_string())); + assert!(kinds_ts.contains("KIND_ORDER_REQUEST")); + assert!(kinds_ts.contains(&kinds::KIND_ORDER_REQUEST.to_string())); } } diff --git a/crates/events_bindings/src/model.rs b/crates/events_bindings/src/model.rs @@ -88,38 +88,32 @@ const EVENT_KIND_EXPORTS: &[(&str, u32)] = &[ ("KIND_LISTING", kinds::KIND_LISTING), ("KIND_APPLICATION_HANDLER", kinds::KIND_APPLICATION_HANDLER), ( - "KIND_TRADE_LISTING_VALIDATE_REQ", - kinds::KIND_TRADE_LISTING_VALIDATE_REQ, + "KIND_TRADE_LISTING_VALIDATION_REQUEST", + kinds::KIND_TRADE_LISTING_VALIDATION_REQUEST, ), ( - "KIND_TRADE_LISTING_VALIDATE_RES", - kinds::KIND_TRADE_LISTING_VALIDATE_RES, + "KIND_TRADE_LISTING_VALIDATION_RESULT", + kinds::KIND_TRADE_LISTING_VALIDATION_RESULT, ), ( - "KIND_WORKER_TRADE_TRANSITION_PROOF_REQ", - kinds::KIND_WORKER_TRADE_TRANSITION_PROOF_REQ, + "KIND_TRADE_TRANSITION_PROOF_REQUEST", + kinds::KIND_TRADE_TRANSITION_PROOF_REQUEST, ), ( - "KIND_WORKER_TRADE_TRANSITION_PROOF_RES", - kinds::KIND_WORKER_TRADE_TRANSITION_PROOF_RES, + "KIND_TRADE_TRANSITION_PROOF_RESULT", + kinds::KIND_TRADE_TRANSITION_PROOF_RESULT, ), - ("KIND_TRADE_ORDER_REQUEST", kinds::KIND_TRADE_ORDER_REQUEST), + ("KIND_ORDER_REQUEST", kinds::KIND_ORDER_REQUEST), + ("KIND_ORDER_DECISION", kinds::KIND_ORDER_DECISION), ( - "KIND_TRADE_ORDER_RESPONSE", - kinds::KIND_TRADE_ORDER_RESPONSE, + "KIND_ORDER_REVISION_PROPOSAL", + kinds::KIND_ORDER_REVISION_PROPOSAL, ), ( - "KIND_TRADE_ORDER_DECISION", - kinds::KIND_TRADE_ORDER_DECISION, - ), - ( - "KIND_TRADE_ORDER_REVISION", - kinds::KIND_TRADE_ORDER_REVISION, - ), - ( - "KIND_TRADE_ORDER_REVISION_RESPONSE", - kinds::KIND_TRADE_ORDER_REVISION_RESPONSE, + "KIND_ORDER_REVISION_DECISION", + kinds::KIND_ORDER_REVISION_DECISION, ), + ("KIND_ORDER_CANCELLATION", kinds::KIND_ORDER_CANCELLATION), ("KIND_TRADE_QUESTION", kinds::KIND_TRADE_QUESTION), ("KIND_TRADE_ANSWER", kinds::KIND_TRADE_ANSWER), ( @@ -138,7 +132,6 @@ const EVENT_KIND_EXPORTS: &[(&str, u32)] = &[ "KIND_TRADE_FORBIDDEN_3431", kinds::KIND_TRADE_FORBIDDEN_3431, ), - ("KIND_TRADE_CANCEL", kinds::KIND_TRADE_CANCEL), ( "KIND_TRADE_FULFILLMENT_UPDATE", kinds::KIND_TRADE_FULFILLMENT_UPDATE, @@ -148,54 +141,6 @@ const EVENT_KIND_EXPORTS: &[(&str, u32)] = &[ "KIND_TRADE_VALIDATION_RECEIPT", kinds::KIND_TRADE_VALIDATION_RECEIPT, ), - ( - "KIND_TRADE_LISTING_ORDER_REQ", - kinds::KIND_TRADE_LISTING_ORDER_REQ, - ), - ( - "KIND_TRADE_LISTING_ORDER_RES", - kinds::KIND_TRADE_LISTING_ORDER_RES, - ), - ( - "KIND_TRADE_LISTING_ORDER_REVISION_REQ", - kinds::KIND_TRADE_LISTING_ORDER_REVISION_REQ, - ), - ( - "KIND_TRADE_LISTING_ORDER_REVISION_RES", - kinds::KIND_TRADE_LISTING_ORDER_REVISION_RES, - ), - ( - "KIND_TRADE_LISTING_QUESTION_REQ", - kinds::KIND_TRADE_LISTING_QUESTION_REQ, - ), - ( - "KIND_TRADE_LISTING_ANSWER_RES", - kinds::KIND_TRADE_LISTING_ANSWER_RES, - ), - ( - "KIND_TRADE_LISTING_DISCOUNT_REQ", - kinds::KIND_TRADE_LISTING_DISCOUNT_REQ, - ), - ( - "KIND_TRADE_LISTING_DISCOUNT_OFFER_RES", - kinds::KIND_TRADE_LISTING_DISCOUNT_OFFER_RES, - ), - ( - "KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ", - kinds::KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ, - ), - ( - "KIND_TRADE_LISTING_CANCEL_REQ", - kinds::KIND_TRADE_LISTING_CANCEL_REQ, - ), - ( - "KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ", - kinds::KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ, - ), - ( - "KIND_TRADE_LISTING_RECEIPT_REQ", - kinds::KIND_TRADE_LISTING_RECEIPT_REQ, - ), ("KIND_JOB_REQUEST_MIN", kinds::KIND_JOB_REQUEST_MIN), ("KIND_JOB_REQUEST_MAX", kinds::KIND_JOB_REQUEST_MAX), ("KIND_JOB_RESULT_MIN", kinds::KIND_JOB_RESULT_MIN), diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml @@ -58,8 +58,10 @@ runtime = [ "dep:hex", "dep:radroots_authority", "dep:radroots_event_store", + "dep:radroots_geocoder", "dep:radroots_outbox", "dep:radroots_relay_transport", + "dep:radroots_runtime_paths", "dep:sha2", "dep:sqlx", "dep:uuid", @@ -104,9 +106,11 @@ radroots_authority = { workspace = true, optional = true, default-features = fal radroots_event_store = { workspace = true, optional = true, default-features = false } radroots_events = { workspace = true, default-features = false } radroots_events_codec = { workspace = true, default-features = false } +radroots_geocoder = { workspace = true, optional = true } radroots_outbox = { workspace = true, optional = true, default-features = false } radroots_publish_proxy_protocol = { workspace = true, optional = true, default-features = false } radroots_relay_transport = { workspace = true, optional = true, default-features = false } +radroots_runtime_paths = { workspace = true, optional = true, default-features = false } radroots_trade = { workspace = true, default-features = false } radroots_identity = { workspace = true, optional = true, default-features = false } radroots_nostr = { workspace = true, optional = true, default-features = false } diff --git a/crates/sdk/src/geonames.rs b/crates/sdk/src/geonames.rs @@ -0,0 +1,89 @@ +#![cfg(feature = "runtime")] + +use std::path::{Path, PathBuf}; + +pub use radroots_geocoder::{ + GEONAMES_1_0_ASSET, GEONAMES_ASSET_BYTE_SIZE, GEONAMES_ASSET_FILE_NAME, GEONAMES_ASSET_HOST, + GEONAMES_ASSET_SHA256, GEONAMES_ASSET_URL, GEONAMES_ASSET_VERSION, GeoNamesAssetFetcher, + GeoNamesAssetSpec, GeoNamesAssetState, GeoNamesAssetStatus, GeoNamesBlockingHttpFetcher, + Geocoder, GeocoderCountryListResult, GeocoderError, GeocoderPoint, GeocoderReverseOptions, + GeocoderReverseResult, +}; +use radroots_geocoder::{ + ensure_default_geonames_asset_in_cache_root, ensure_geonames_asset_in_cache_root_with_fetcher, + inspect_default_geonames_asset_in_cache_root, inspect_geonames_asset_path, +}; +use radroots_runtime_paths::{ + default_shared_geonames_database_path_from_cache_root, + default_shared_geonames_root_from_cache_root, +}; + +pub fn radroots_sdk_geonames_database_path_from_cache_root( + cache_root: impl AsRef<Path>, +) -> PathBuf { + default_shared_geonames_database_path_from_cache_root(cache_root, GEONAMES_ASSET_VERSION) +} + +pub fn radroots_sdk_geonames_database_path_from_cache_root_for_version( + cache_root: impl AsRef<Path>, + version: &str, +) -> PathBuf { + default_shared_geonames_database_path_from_cache_root(cache_root, version) +} + +pub fn radroots_sdk_geonames_root_from_cache_root(cache_root: impl AsRef<Path>) -> PathBuf { + default_shared_geonames_root_from_cache_root(cache_root) +} + +pub fn radroots_sdk_inspect_geonames_database_in_cache_root( + cache_root: impl AsRef<Path>, +) -> Result<GeoNamesAssetStatus, GeocoderError> { + inspect_default_geonames_asset_in_cache_root(cache_root) +} + +pub fn radroots_sdk_inspect_geonames_database_path_with_spec( + path: impl AsRef<Path>, + spec: &GeoNamesAssetSpec, +) -> Result<GeoNamesAssetStatus, GeocoderError> { + inspect_geonames_asset_path(path, spec) +} + +pub fn radroots_sdk_ensure_geonames_database_in_cache_root( + cache_root: impl AsRef<Path>, +) -> Result<GeoNamesAssetStatus, GeocoderError> { + ensure_default_geonames_asset_in_cache_root(cache_root) +} + +pub fn radroots_sdk_ensure_geonames_database_in_cache_root_with_fetcher<F>( + cache_root: impl AsRef<Path>, + fetcher: &F, +) -> Result<GeoNamesAssetStatus, GeocoderError> +where + F: GeoNamesAssetFetcher, +{ + ensure_geonames_asset_in_cache_root_with_fetcher(cache_root, &GEONAMES_1_0_ASSET, fetcher) +} + +pub fn radroots_sdk_ensure_geonames_database_in_cache_root_with_spec_and_fetcher<F>( + cache_root: impl AsRef<Path>, + spec: &GeoNamesAssetSpec, + fetcher: &F, +) -> Result<GeoNamesAssetStatus, GeocoderError> +where + F: GeoNamesAssetFetcher, +{ + ensure_geonames_asset_in_cache_root_with_fetcher(cache_root, spec, fetcher) +} + +pub fn radroots_sdk_open_verified_geonames_database( + path: impl AsRef<Path>, +) -> Result<Geocoder, GeocoderError> { + Geocoder::open_verified_geonames_asset(path, &GEONAMES_1_0_ASSET) +} + +pub fn radroots_sdk_open_verified_geonames_database_with_spec( + path: impl AsRef<Path>, + spec: &GeoNamesAssetSpec, +) -> Result<Geocoder, GeocoderError> { + Geocoder::open_verified_geonames_asset(path, spec) +} diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs @@ -19,6 +19,8 @@ mod farm; #[cfg(feature = "runtime")] mod farms_runtime; #[cfg(feature = "runtime")] +mod geonames; +#[cfg(feature = "runtime")] mod idempotency; #[cfg(feature = "identity-models")] mod identity; @@ -54,6 +56,23 @@ pub use crate::farms_runtime::{ FarmPreparePublishRequest, FarmPublishPlan, }; #[cfg(feature = "runtime")] +pub use crate::geonames::{ + GEONAMES_1_0_ASSET, GEONAMES_ASSET_BYTE_SIZE, GEONAMES_ASSET_FILE_NAME, GEONAMES_ASSET_HOST, + GEONAMES_ASSET_SHA256, GEONAMES_ASSET_URL, GEONAMES_ASSET_VERSION, GeoNamesAssetFetcher, + GeoNamesAssetSpec, GeoNamesAssetState, GeoNamesAssetStatus, GeoNamesBlockingHttpFetcher, + Geocoder, GeocoderCountryListResult, GeocoderError, GeocoderPoint, GeocoderReverseOptions, + GeocoderReverseResult, radroots_sdk_ensure_geonames_database_in_cache_root, + radroots_sdk_ensure_geonames_database_in_cache_root_with_fetcher, + radroots_sdk_ensure_geonames_database_in_cache_root_with_spec_and_fetcher, + radroots_sdk_geonames_database_path_from_cache_root, + radroots_sdk_geonames_database_path_from_cache_root_for_version, + radroots_sdk_geonames_root_from_cache_root, + radroots_sdk_inspect_geonames_database_in_cache_root, + radroots_sdk_inspect_geonames_database_path_with_spec, + radroots_sdk_open_verified_geonames_database, + radroots_sdk_open_verified_geonames_database_with_spec, +}; +#[cfg(feature = "runtime")] pub use crate::idempotency::{SDK_IDEMPOTENCY_KEY_MAX_LEN, SdkIdempotencyKey}; #[cfg(feature = "runtime")] pub use crate::listings_runtime::{ diff --git a/crates/sdk/tests/facade.rs b/crates/sdk/tests/facade.rs @@ -10,7 +10,7 @@ use radroots_events::kinds::{ }; use radroots_events::listing::{ RadrootsListing, RadrootsListingAvailability, RadrootsListingBin, - RadrootsListingDeliveryMethod, RadrootsListingLocation, RadrootsListingProduct, + RadrootsListingDeliveryMethod, RadrootsListingProduct, RadrootsListingPublicLocation, RadrootsListingStatus, }; use radroots_events::order::{ @@ -103,14 +103,12 @@ fn sample_listing() -> RadrootsListing { status: RadrootsListingStatus::Active, }), delivery_method: Some(RadrootsListingDeliveryMethod::Pickup), - location: Some(RadrootsListingLocation { + location: Some(RadrootsListingPublicLocation { primary: "North Farm".into(), city: None, region: None, country: None, - lat: None, - lng: None, - geohash: None, + geohash: "9q8yy".into(), }), images: None, } diff --git a/crates/sdk/tests/geonames.rs b/crates/sdk/tests/geonames.rs @@ -0,0 +1,48 @@ +#![cfg(feature = "runtime")] + +use radroots_sdk::{ + GEONAMES_ASSET_HOST, GEONAMES_ASSET_VERSION, GeoNamesAssetState, + radroots_sdk_geonames_database_path_from_cache_root, + radroots_sdk_geonames_database_path_from_cache_root_for_version, + radroots_sdk_geonames_root_from_cache_root, + radroots_sdk_inspect_geonames_database_in_cache_root, +}; + +#[test] +fn sdk_geonames_facade_resolves_shared_cache_paths_and_reports_missing_state() { + let tempdir = tempfile::tempdir().expect("tempdir"); + let cache_root = tempdir.path().join("cache"); + + assert_eq!(GEONAMES_ASSET_HOST, "assets.radroots.io"); + assert_eq!(GEONAMES_ASSET_VERSION, "1.0"); + assert_eq!( + radroots_sdk_geonames_root_from_cache_root(&cache_root), + cache_root.join("shared").join("geonames") + ); + assert_eq!( + radroots_sdk_geonames_database_path_from_cache_root(&cache_root), + cache_root + .join("shared") + .join("geonames") + .join("geonames-1.0.db") + ); + assert_eq!( + radroots_sdk_geonames_database_path_from_cache_root_for_version(&cache_root, "1.1"), + cache_root + .join("shared") + .join("geonames") + .join("geonames-1.1.db") + ); + + let status = + radroots_sdk_inspect_geonames_database_in_cache_root(&cache_root).expect("inspection"); + assert_eq!(status.state, GeoNamesAssetState::Missing); + assert_eq!(status.version, "1.0"); + assert_eq!( + status.path, + cache_root + .join("shared") + .join("geonames") + .join("geonames-1.0.db") + ); +} diff --git a/crates/trade_bindings/src/dto.rs b/crates/trade_bindings/src/dto.rs @@ -74,7 +74,10 @@ imported_ts_type!( "RadrootsListingDeliveryMethod" ); imported_ts_type!(RadrootsListingImageImport, "RadrootsListingImage"); -imported_ts_type!(RadrootsListingLocationImport, "RadrootsListingLocation"); +imported_ts_type!( + RadrootsListingPublicLocationImport, + "RadrootsListingPublicLocation" +); imported_ts_type!(RadrootsListingProductImport, "RadrootsListingProduct"); imported_ts_type!(RadrootsNostrEventPtrImport, "RadrootsNostrEventPtr"); imported_ts_type!(RadrootsPlotRefImport, "RadrootsPlotRef"); @@ -207,7 +210,7 @@ pub struct RadrootsTradeListingProjection { pub inventory_available: Option<RadrootsCoreDecimalImport>, pub availability: Option<RadrootsListingAvailabilityImport>, pub delivery_method: Option<RadrootsListingDeliveryMethodImport>, - pub location: Option<RadrootsListingLocationImport>, + pub location: Option<RadrootsListingPublicLocationImport>, pub images: Option<Vec<RadrootsListingImageImport>>, pub order_count: u32, pub open_order_count: u32, diff --git a/crates/trade_bindings/src/lib.rs b/crates/trade_bindings/src/lib.rs @@ -35,8 +35,8 @@ pub const TRADE_TYPE_INVENTORY: &[TradeTypeInventoryEntry] = &[ event_import("RadrootsListingAvailability"), event_import("RadrootsListingBin"), event_import("RadrootsListingDeliveryMethod"), - event_import("RadrootsListingLocation"), event_import("RadrootsListingProduct"), + event_import("RadrootsListingPublicLocation"), event_import("RadrootsListingStatus"), local_shape("RadrootsTradeFacetCount"), source_root("RadrootsTradeListing"), @@ -181,8 +181,8 @@ mod tests { "RadrootsListingAvailability", "RadrootsListingBin", "RadrootsListingDeliveryMethod", - "RadrootsListingLocation", "RadrootsListingProduct", + "RadrootsListingPublicLocation", "RadrootsListingStatus", "RadrootsTradeFacetCount", "RadrootsTradeListing", @@ -230,8 +230,8 @@ mod tests { "RadrootsListingAvailability", "RadrootsListingBin", "RadrootsListingDeliveryMethod", - "RadrootsListingLocation", "RadrootsListingProduct", + "RadrootsListingPublicLocation", "RadrootsListingStatus", "RadrootsTradeMessageType", "RadrootsTradeOrderStatus", diff --git a/packages/events-bindings/src/generated/kinds.ts b/packages/events-bindings/src/generated/kinds.ts @@ -51,37 +51,24 @@ export const KIND_ACCOUNT_CLAIM = 30380; export const KIND_APP_DATA = 30078; export const KIND_LISTING = 30402; export const KIND_APPLICATION_HANDLER = 31990; -export const KIND_TRADE_LISTING_VALIDATE_REQ = 5321; -export const KIND_TRADE_LISTING_VALIDATE_RES = 6321; -export const KIND_WORKER_TRADE_TRANSITION_PROOF_REQ = 5322; -export const KIND_WORKER_TRADE_TRANSITION_PROOF_RES = 6322; -export const KIND_TRADE_ORDER_REQUEST = 3422; -export const KIND_TRADE_ORDER_RESPONSE = 3423; -export const KIND_TRADE_ORDER_DECISION = 3423; -export const KIND_TRADE_ORDER_REVISION = 3424; -export const KIND_TRADE_ORDER_REVISION_RESPONSE = 3425; +export const KIND_TRADE_LISTING_VALIDATION_REQUEST = 5321; +export const KIND_TRADE_LISTING_VALIDATION_RESULT = 6321; +export const KIND_TRADE_TRANSITION_PROOF_REQUEST = 5322; +export const KIND_TRADE_TRANSITION_PROOF_RESULT = 6322; +export const KIND_ORDER_REQUEST = 3422; +export const KIND_ORDER_DECISION = 3423; +export const KIND_ORDER_REVISION_PROPOSAL = 3424; +export const KIND_ORDER_REVISION_DECISION = 3425; +export const KIND_ORDER_CANCELLATION = 3432; export const KIND_TRADE_QUESTION = 3426; export const KIND_TRADE_ANSWER = 3427; export const KIND_TRADE_DISCOUNT_REQUEST = 3428; export const KIND_TRADE_DISCOUNT_OFFER = 3429; export const KIND_TRADE_DISCOUNT_ACCEPT = 3430; export const KIND_TRADE_FORBIDDEN_3431 = 3431; -export const KIND_TRADE_CANCEL = 3432; export const KIND_TRADE_FULFILLMENT_UPDATE = 3433; export const KIND_TRADE_RECEIPT = 3434; export const KIND_TRADE_VALIDATION_RECEIPT = 3440; -export const KIND_TRADE_LISTING_ORDER_REQ = 3422; -export const KIND_TRADE_LISTING_ORDER_RES = 3423; -export const KIND_TRADE_LISTING_ORDER_REVISION_REQ = 3424; -export const KIND_TRADE_LISTING_ORDER_REVISION_RES = 3425; -export const KIND_TRADE_LISTING_QUESTION_REQ = 3426; -export const KIND_TRADE_LISTING_ANSWER_RES = 3427; -export const KIND_TRADE_LISTING_DISCOUNT_REQ = 3428; -export const KIND_TRADE_LISTING_DISCOUNT_OFFER_RES = 3429; -export const KIND_TRADE_LISTING_DISCOUNT_ACCEPT_REQ = 3430; -export const KIND_TRADE_LISTING_CANCEL_REQ = 3432; -export const KIND_TRADE_LISTING_FULFILLMENT_UPDATE_REQ = 3433; -export const KIND_TRADE_LISTING_RECEIPT_REQ = 3434; export const KIND_JOB_REQUEST_MIN = 5000; export const KIND_JOB_REQUEST_MAX = 5999; export const KIND_JOB_RESULT_MIN = 6000; diff --git a/packages/events-bindings/src/generated/types.ts b/packages/events-bindings/src/generated/types.ts @@ -19,14 +19,20 @@ export type JobPaymentRequest = { amount_sat: number, bolt11?: string | null, }; export type RadrootsAccountClaim = { username: string, pubkey: string, nip05?: string | null, }; -export type RadrootsActiveTradeEnvelope<T> = { version: number, domain: RadrootsTradeDomain, type: RadrootsActiveTradeMessageType, order_id: string, listing_addr: string, payload: T, }; - -export type RadrootsActiveTradeMessageType = "TradeOrderRequested" | "TradeOrderDecision" | "TradeOrderRevisionProposed" | "TradeOrderRevisionDecision" | "TradeOrderCancelled"; - export type RadrootsAppData = { d_tag: string, content: string, }; export type RadrootsComment = { root: RadrootsNostrEventRef, parent: RadrootsNostrEventRef, content: string, }; +export type RadrootsCommercialDomain = "trade:listing"; + +export type RadrootsCommercialEnvelope<T> = { version: number, domain: RadrootsCommercialDomain, type: RadrootsCommercialMessageType, order_id?: string | null, listing_addr: string, payload: T, }; + +export type RadrootsCommercialMessagePayload = { kind: "listing_validate_request", amount: RadrootsTradeListingValidateRequest, } | { kind: "listing_validate_result", amount: RadrootsTradeListingValidateResult, } | { kind: "trade_order_requested", amount: RadrootsOrderRequest, } | { kind: "order_response", amount: RadrootsOrderResponse, } | { kind: "order_revision", amount: RadrootsOrderRevision, } | { kind: "order_revision_accept", amount: RadrootsOrderRevisionResponse, } | { kind: "order_revision_decline", amount: RadrootsOrderRevisionResponse, } | { kind: "question", amount: RadrootsListingQuestion, } | { kind: "answer", amount: RadrootsListingAnswer, } | { kind: "discount_request", amount: RadrootsListingDiscountRequest, } | { kind: "discount_offer", amount: RadrootsListingDiscountOffer, } | { kind: "discount_accept", amount: RadrootsListingDiscountDecision, } | { kind: "discount_decline", amount: RadrootsListingDiscountDecision, } | { kind: "cancel", amount: RadrootsListingCancel, }; + +export type RadrootsCommercialMessageType = "listing_validate_request" | "listing_validate_result" | "order_request" | "order_response" | "order_revision" | "order_revision_accept" | "order_revision_decline" | "question" | "answer" | "discount_request" | "discount_offer" | "discount_accept" | "discount_decline" | "cancel"; + +export type RadrootsCommercialTransportLane = "service" | "public"; + export type RadrootsCoop = { d_tag: string, name: string, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, location?: RadrootsCoopLocation | null, tags?: Array<string> | null, }; export type RadrootsCoopLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, }; @@ -37,9 +43,9 @@ export type RadrootsDocument = { d_tag: string, doc_type: string, title: string, export type RadrootsDocumentSubject = { pubkey: string, address?: string | null, }; -export type RadrootsFarm = { d_tag: string, name: string, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, location?: RadrootsFarmLocation | null, tags?: Array<string> | null, }; +export type RadrootsFarm = { d_tag: string, name: string, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, location?: RadrootsFarmPublicLocation | null, tags?: Array<string> | null, }; -export type RadrootsFarmLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs?: RadrootsGcsLocation | null, }; +export type RadrootsFarmPublicLocation = { primary: string, city?: string | null, region?: string | null, country?: string | null, geohash: string, }; export type RadrootsFarmRef = { pubkey: string, d_tag: string, }; @@ -75,24 +81,38 @@ export type RadrootsListEntry = { tag: string, values: Array<string>, }; export type RadrootsListSet = { d_tag: string, content: string, entries: Array<RadrootsListEntry>, title?: string | null, description?: string | null, image?: string | null, }; -export type RadrootsListing = { d_tag: string, published_at?: number | null, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsListingBin>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingLocation | null, images?: Array<RadrootsListingImage> | null, }; +export type RadrootsListing = { d_tag: string, published_at?: number | null, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsListingBin>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingPublicLocation | null, images?: Array<RadrootsListingImage> | null, }; + +export type RadrootsListingAnswer = { question_id: string, }; export type RadrootsListingAvailability = { kind: "window", amount: { start?: number | null, end?: number | null, }, } | { kind: "status", amount: { status: RadrootsListingStatus, }, }; export type RadrootsListingBin = { bin_id: string, quantity: RadrootsCoreQuantity, price_per_canonical_unit: RadrootsCoreQuantityPrice, display_amount?: RadrootsCoreDecimal | null, display_unit?: RadrootsCoreUnit | null, display_label?: string | null, display_price?: RadrootsCoreMoney | null, display_price_unit?: RadrootsCoreUnit | null, }; +export type RadrootsListingCancel = { reason?: string | null, }; + export type RadrootsListingDeliveryMethod = { kind: "pickup", } | { kind: "local_delivery", } | { kind: "shipping", } | { kind: "other", amount: { method: string, }, }; +export type RadrootsListingDiscountDecision = { kind: "accept", amount: { value: RadrootsCoreDiscountValue, }, } | { kind: "decline", amount: { reason?: string | null, }, }; + +export type RadrootsListingDiscountOffer = { discount_id: string, value: RadrootsCoreDiscountValue, }; + +export type RadrootsListingDiscountRequest = { discount_id: string, value: RadrootsCoreDiscountValue, }; + export type RadrootsListingImage = { url: string, size?: RadrootsListingImageSize | null, }; export type RadrootsListingImageSize = { w: number, h: number, }; -export type RadrootsListingLocation = { primary: string, city?: string | null, region?: string | null, country?: string | null, lat?: number | null, lng?: number | null, geohash?: string | null, }; +export type RadrootsListingParseError = { InvalidKind: number, } | { MissingTag: string, } | { InvalidTag: string, } | { InvalidNumber: string, } | "InvalidUnit" | "InvalidCurrency" | { InvalidJson: string, } | { InvalidDiscount: string, }; export type RadrootsListingProduct = { key: string, title: string, category: string, summary?: string | null, process?: string | null, lot?: string | null, location?: string | null, profile?: string | null, year?: string | null, }; export type RadrootsListingProductTagKeys = readonly ["key", "title", "category", "summary", "process", "lot", "location", "profile", "year"]; +export type RadrootsListingPublicLocation = { primary: string, city?: string | null, region?: string | null, country?: string | null, geohash: string, }; + +export type RadrootsListingQuestion = { question_id: string, }; + export type RadrootsListingStatus = { kind: "active", } | { kind: "sold", } | { kind: "other", amount: { value: string, }, }; export type RadrootsMessage = { recipients: Array<RadrootsMessageRecipient>, content: string, reply_to?: RadrootsNostrEventPtr | null, subject?: string | null, }; @@ -109,104 +129,84 @@ export type RadrootsNostrEventPtr = { id: string, relays?: string | null, }; export type RadrootsNostrEventRef = { id: string, author: string, kind: number, d_tag?: string | null, relays?: Array<string> | null, }; -export type RadrootsPlot = { d_tag: string, farm: RadrootsFarmRef, name: string, about?: string | null, location?: RadrootsPlotLocation | null, tags?: Array<string> | null, }; - -export type RadrootsPlotLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, }; - -export type RadrootsPlotRef = { pubkey: string, d_tag: string, }; - -export type RadrootsPost = { content: string, }; - -export type RadrootsProfile = { name: string, display_name?: string | null, nip05?: string | null, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, lud06?: string | null, lud16?: string | null, bot?: string | null, }; - -export type RadrootsProfileType = "individual" | "farm" | "coop" | "any" | "radrootsd"; - -export type RadrootsReaction = { root: RadrootsNostrEventRef, content: string, }; - -export type RadrootsRelayDocument = { name?: string | null, description?: string | null, pubkey?: string | null, contact?: string | null, supported_nips?: Array<number> | null, software?: string | null, version?: string | null, }; - -export type RadrootsResourceArea = { d_tag: string, name: string, about?: string | null, location: RadrootsResourceAreaLocation, tags?: Array<string> | null, }; - -export type RadrootsResourceAreaLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, }; - -export type RadrootsResourceAreaRef = { pubkey: string, d_tag: string, }; +export type RadrootsOrderCancellation = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, reason: string, }; -export type RadrootsResourceHarvestCap = { d_tag: string, resource_area: RadrootsResourceAreaRef, product: RadrootsResourceHarvestProduct, start: bigint, end: bigint, cap_quantity: RadrootsCoreQuantity, display_amount?: RadrootsCoreDecimal | null, display_unit?: RadrootsCoreUnit | null, display_label?: string | null, tags?: Array<string> | null, }; +export type RadrootsOrderChange = { kind: "bin_count", amount: { item_index: number, bin_count: number, }, } | { kind: "item_add", amount: { item: RadrootsOrderItem, }, } | { kind: "item_remove", amount: { item_index: number, }, }; -export type RadrootsResourceHarvestProduct = { key: string, category?: string | null, }; +export type RadrootsOrderDecision = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, decision: RadrootsOrderDecisionOutcome, }; -export type RadrootsSeal = { content: string, }; +export type RadrootsOrderDecisionOutcome = { decision: "accepted", inventory_commitments: Array<RadrootsOrderInventoryCommitment>, } | { decision: "declined", reason: string, }; -export type RadrootsTradeAnswer = { question_id: string, }; +export type RadrootsOrderEconomicActor = "buyer" | "seller"; -export type RadrootsTradeDiscountDecision = { kind: "accept", amount: { value: RadrootsCoreDiscountValue, }, } | { kind: "decline", amount: { reason?: string | null, }, }; +export type RadrootsOrderEconomicEffect = "increase" | "decrease"; -export type RadrootsTradeDiscountOffer = { discount_id: string, value: RadrootsCoreDiscountValue, }; +export type RadrootsOrderEconomicItem = { bin_id: string, bin_count: number, quantity_amount: RadrootsCoreDecimal, quantity_unit: RadrootsCoreUnit, unit_price_amount: RadrootsCoreDecimal, unit_price_currency: RadrootsCoreCurrency, line_subtotal: RadrootsCoreMoney, }; -export type RadrootsTradeDiscountRequest = { discount_id: string, value: RadrootsCoreDiscountValue, }; +export type RadrootsOrderEconomicLine = { id: string, kind: RadrootsOrderEconomicLineKind, actor: RadrootsOrderEconomicActor, effect: RadrootsOrderEconomicEffect, amount: RadrootsCoreMoney, reason: string, }; -export type RadrootsTradeDomain = "trade:listing"; +export type RadrootsOrderEconomicLineKind = "listing_discount" | "basket_adjustment" | "revision_adjustment"; -export type RadrootsTradeEconomicActor = "buyer" | "seller"; +export type RadrootsOrderEconomicTotals = { subtotal: RadrootsCoreMoney, discount_total: RadrootsCoreMoney, adjustment_total: RadrootsCoreMoney, total: RadrootsCoreMoney, }; -export type RadrootsTradeEconomicEffect = "increase" | "decrease"; +export type RadrootsOrderEconomics = { quote_id: string, quote_version: number, pricing_basis: RadrootsOrderPricingBasis, currency: RadrootsCoreCurrency, items: Array<RadrootsOrderEconomicItem>, discounts: Array<RadrootsOrderEconomicLine>, adjustments: Array<RadrootsOrderEconomicLine>, subtotal: RadrootsCoreMoney, discount_total: RadrootsCoreMoney, adjustment_total: RadrootsCoreMoney, total: RadrootsCoreMoney, }; -export type RadrootsTradeEconomicLineKind = "listing_discount" | "basket_adjustment" | "revision_adjustment"; +export type RadrootsOrderEnvelope<T> = { version: number, domain: RadrootsCommercialDomain, type: RadrootsOrderEventType, order_id: string, listing_addr: string, payload: T, }; -export type RadrootsTradeEnvelope<T> = { version: number, domain: RadrootsTradeDomain, type: RadrootsTradeMessageType, order_id?: string | null, listing_addr: string, payload: T, }; +export type RadrootsOrderEventType = "TradeOrderRequested" | "TradeOrderDecision" | "TradeOrderRevisionProposed" | "TradeOrderRevisionDecision" | "TradeOrderCancelled"; -export type RadrootsTradeInventoryCommitment = { bin_id: string, bin_count: number, }; +export type RadrootsOrderInventoryCommitment = { bin_id: string, bin_count: number, }; -export type RadrootsTradeListingCancel = { reason?: string | null, }; +export type RadrootsOrderItem = { bin_id: string, bin_count: number, }; -export type RadrootsTradeListingParseError = { InvalidKind: number, } | { MissingTag: string, } | { InvalidTag: string, } | { InvalidNumber: string, } | "InvalidUnit" | "InvalidCurrency" | { InvalidJson: string, } | { InvalidDiscount: string, }; +export type RadrootsOrderPricingBasis = "listing_event"; -export type RadrootsTradeListingValidateRequest = { listing_event?: RadrootsNostrEventPtr | null, }; +export type RadrootsOrderRequest = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, items: Array<RadrootsOrderItem>, economics: RadrootsOrderEconomics, }; -export type RadrootsTradeListingValidateResult = { valid: boolean, errors: Array<RadrootsTradeListingValidationError>, }; +export type RadrootsOrderResponse = { accepted: boolean, reason?: string | null, }; -export type RadrootsTradeListingValidationError = { kind: "invalid_kind", amount: { kind: number, }, } | { kind: "missing_listing_id", } | { kind: "listing_event_not_found", amount: { listing_addr: string, }, } | { kind: "listing_event_fetch_failed", amount: { listing_addr: string, }, } | { kind: "parse_error", amount: { error: RadrootsTradeListingParseError, }, } | { kind: "invalid_seller", } | { kind: "missing_farm_profile", } | { kind: "missing_farm_record", } | { kind: "missing_title", } | { kind: "missing_description", } | { kind: "missing_product_type", } | { kind: "missing_bins", } | { kind: "missing_primary_bin", } | { kind: "invalid_bin", } | { kind: "missing_price", } | { kind: "invalid_price", } | { kind: "missing_inventory", } | { kind: "invalid_inventory", } | { kind: "missing_availability", } | { kind: "missing_location", } | { kind: "missing_delivery_method", }; +export type RadrootsOrderRevision = { revision_id: string, changes: Array<RadrootsOrderChange>, }; -export type RadrootsTradeMessagePayload = { kind: "listing_validate_request", amount: RadrootsTradeListingValidateRequest, } | { kind: "listing_validate_result", amount: RadrootsTradeListingValidateResult, } | { kind: "trade_order_requested", amount: RadrootsTradeOrderRequested, } | { kind: "order_response", amount: RadrootsTradeOrderResponse, } | { kind: "order_revision", amount: RadrootsTradeOrderRevision, } | { kind: "order_revision_accept", amount: RadrootsTradeOrderRevisionResponse, } | { kind: "order_revision_decline", amount: RadrootsTradeOrderRevisionResponse, } | { kind: "question", amount: RadrootsTradeQuestion, } | { kind: "answer", amount: RadrootsTradeAnswer, } | { kind: "discount_request", amount: RadrootsTradeDiscountRequest, } | { kind: "discount_offer", amount: RadrootsTradeDiscountOffer, } | { kind: "discount_accept", amount: RadrootsTradeDiscountDecision, } | { kind: "discount_decline", amount: RadrootsTradeDiscountDecision, } | { kind: "cancel", amount: RadrootsTradeListingCancel, }; +export type RadrootsOrderRevisionDecision = { decision: "accepted", } | { decision: "declined", reason: string, }; -export type RadrootsTradeMessageType = "listing_validate_request" | "listing_validate_result" | "order_request" | "order_response" | "order_revision" | "order_revision_accept" | "order_revision_decline" | "question" | "answer" | "discount_request" | "discount_offer" | "discount_accept" | "discount_decline" | "cancel"; +export type RadrootsOrderRevisionDecisionEvent = { revision_id: string, order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, root_event_id: string, prev_event_id: string, decision: RadrootsOrderRevisionDecision, }; -export type RadrootsTradeOrderCancelled = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, reason: string, }; +export type RadrootsOrderRevisionProposed = { revision_id: string, order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, root_event_id: string, prev_event_id: string, items: Array<RadrootsOrderItem>, economics: RadrootsOrderEconomics, reason: string, }; -export type RadrootsTradeOrderChange = { kind: "bin_count", amount: { item_index: number, bin_count: number, }, } | { kind: "item_add", amount: { item: RadrootsTradeOrderItem, }, } | { kind: "item_remove", amount: { item_index: number, }, }; +export type RadrootsOrderRevisionResponse = { accepted: boolean, reason?: string | null, }; -export type RadrootsTradeOrderDecision = { decision: "accepted", inventory_commitments: Array<RadrootsTradeInventoryCommitment>, } | { decision: "declined", reason: string, }; +export type RadrootsOrderStatus = "draft" | "validated" | "requested" | "questioned" | "revised" | "accepted" | "declined" | "cancelled"; -export type RadrootsTradeOrderDecisionEvent = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, decision: RadrootsTradeOrderDecision, }; +export type RadrootsPlot = { d_tag: string, farm: RadrootsFarmRef, name: string, about?: string | null, location?: RadrootsPlotLocation | null, tags?: Array<string> | null, }; -export type RadrootsTradeOrderEconomicItem = { bin_id: string, bin_count: number, quantity_amount: RadrootsCoreDecimal, quantity_unit: RadrootsCoreUnit, unit_price_amount: RadrootsCoreDecimal, unit_price_currency: RadrootsCoreCurrency, line_subtotal: RadrootsCoreMoney, }; +export type RadrootsPlotLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, }; -export type RadrootsTradeOrderEconomicLine = { id: string, kind: RadrootsTradeEconomicLineKind, actor: RadrootsTradeEconomicActor, effect: RadrootsTradeEconomicEffect, amount: RadrootsCoreMoney, reason: string, }; +export type RadrootsPlotRef = { pubkey: string, d_tag: string, }; -export type RadrootsTradeOrderEconomicTotals = { subtotal: RadrootsCoreMoney, discount_total: RadrootsCoreMoney, adjustment_total: RadrootsCoreMoney, total: RadrootsCoreMoney, }; +export type RadrootsPost = { content: string, }; -export type RadrootsTradeOrderEconomics = { quote_id: string, quote_version: number, pricing_basis: RadrootsTradePricingBasis, currency: RadrootsCoreCurrency, items: Array<RadrootsTradeOrderEconomicItem>, discounts: Array<RadrootsTradeOrderEconomicLine>, adjustments: Array<RadrootsTradeOrderEconomicLine>, subtotal: RadrootsCoreMoney, discount_total: RadrootsCoreMoney, adjustment_total: RadrootsCoreMoney, total: RadrootsCoreMoney, }; +export type RadrootsProfile = { name: string, display_name?: string | null, nip05?: string | null, about?: string | null, website?: string | null, picture?: string | null, banner?: string | null, lud06?: string | null, lud16?: string | null, bot?: string | null, }; -export type RadrootsTradeOrderItem = { bin_id: string, bin_count: number, }; +export type RadrootsProfileType = "individual" | "farm" | "coop" | "any" | "radrootsd"; -export type RadrootsTradeOrderRequested = { order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, items: Array<RadrootsTradeOrderItem>, economics: RadrootsTradeOrderEconomics, }; +export type RadrootsReaction = { root: RadrootsNostrEventRef, content: string, }; -export type RadrootsTradeOrderResponse = { accepted: boolean, reason?: string | null, }; +export type RadrootsRelayDocument = { name?: string | null, description?: string | null, pubkey?: string | null, contact?: string | null, supported_nips?: Array<number> | null, software?: string | null, version?: string | null, }; -export type RadrootsTradeOrderRevision = { revision_id: string, changes: Array<RadrootsTradeOrderChange>, }; +export type RadrootsResourceArea = { d_tag: string, name: string, about?: string | null, location: RadrootsResourceAreaLocation, tags?: Array<string> | null, }; -export type RadrootsTradeOrderRevisionDecision = { decision: "accepted", } | { decision: "declined", reason: string, }; +export type RadrootsResourceAreaLocation = { primary?: string | null, city?: string | null, region?: string | null, country?: string | null, gcs: RadrootsGcsLocation, }; -export type RadrootsTradeOrderRevisionDecisionEvent = { revision_id: string, order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, root_event_id: string, prev_event_id: string, decision: RadrootsTradeOrderRevisionDecision, }; +export type RadrootsResourceAreaRef = { pubkey: string, d_tag: string, }; -export type RadrootsTradeOrderRevisionProposed = { revision_id: string, order_id: string, listing_addr: string, buyer_pubkey: string, seller_pubkey: string, root_event_id: string, prev_event_id: string, items: Array<RadrootsTradeOrderItem>, economics: RadrootsTradeOrderEconomics, reason: string, }; +export type RadrootsResourceHarvestCap = { d_tag: string, resource_area: RadrootsResourceAreaRef, product: RadrootsResourceHarvestProduct, start: bigint, end: bigint, cap_quantity: RadrootsCoreQuantity, display_amount?: RadrootsCoreDecimal | null, display_unit?: RadrootsCoreUnit | null, display_label?: string | null, tags?: Array<string> | null, }; -export type RadrootsTradeOrderRevisionResponse = { accepted: boolean, reason?: string | null, }; +export type RadrootsResourceHarvestProduct = { key: string, category?: string | null, }; -export type RadrootsTradeOrderStatus = "draft" | "validated" | "requested" | "questioned" | "revised" | "accepted" | "declined" | "cancelled"; +export type RadrootsSeal = { content: string, }; -export type RadrootsTradePricingBasis = "listing_event"; +export type RadrootsTradeListingValidateRequest = { listing_event?: RadrootsNostrEventPtr | null, }; -export type RadrootsTradeQuestion = { question_id: string, }; +export type RadrootsTradeListingValidateResult = { valid: boolean, errors: Array<RadrootsTradeListingValidationError>, }; -export type RadrootsTradeTransportLane = "service" | "public"; +export type RadrootsTradeListingValidationError = { kind: "invalid_kind", amount: { kind: number, }, } | { kind: "missing_listing_id", } | { kind: "listing_event_not_found", amount: { listing_addr: string, }, } | { kind: "listing_event_fetch_failed", amount: { listing_addr: string, }, } | { kind: "parse_error", amount: { error: RadrootsListingParseError, }, } | { kind: "invalid_seller", } | { kind: "missing_farm_profile", } | { kind: "missing_farm_record", } | { kind: "missing_title", } | { kind: "missing_description", } | { kind: "missing_product_type", } | { kind: "missing_bins", } | { kind: "missing_primary_bin", } | { kind: "invalid_bin", } | { kind: "missing_price", } | { kind: "invalid_price", } | { kind: "missing_inventory", } | { kind: "invalid_inventory", } | { kind: "missing_availability", } | { kind: "missing_location", } | { kind: "missing_delivery_method", }; diff --git a/packages/trade-bindings/src/generated/types.ts b/packages/trade-bindings/src/generated/types.ts @@ -16,8 +16,8 @@ import type { RadrootsListingBin, RadrootsListingDeliveryMethod, RadrootsListingImage, - RadrootsListingLocation, RadrootsListingProduct, + RadrootsListingPublicLocation, RadrootsNostrEventPtr, RadrootsPlotRef, RadrootsResourceAreaRef, @@ -30,7 +30,7 @@ import type { export type RadrootsTradeFacetCount = { key: string, count: number, }; -export type RadrootsTradeListing = { listing_id: string, listing_addr: string, seller_pubkey: string, title: string, description: string, product_type: string, primary_bin_id: string, bin_quantity: RadrootsCoreQuantity, unit: RadrootsCoreUnit, unit_price: RadrootsCoreMoney, inventory_available: RadrootsCoreDecimal, availability: RadrootsListingAvailability, location: RadrootsListingLocation, delivery_method: RadrootsListingDeliveryMethod, listing: RadrootsListing, }; +export type RadrootsTradeListing = { listing_id: string, listing_addr: string, seller_pubkey: string, title: string, description: string, product_type: string, primary_bin_id: string, bin_quantity: RadrootsCoreQuantity, unit: RadrootsCoreUnit, unit_price: RadrootsCoreMoney, inventory_available: RadrootsCoreDecimal, availability: RadrootsListingAvailability, location: RadrootsListingPublicLocation, delivery_method: RadrootsListingDeliveryMethod, listing: RadrootsListing, }; export type RadrootsTradeListingBackofficeOverlay = { listing_addr: string, review_queue?: RadrootsTradeReviewQueueEntry | null, moderation_flags: Array<RadrootsTradeModerationFlag>, }; @@ -44,7 +44,7 @@ export type RadrootsTradeListingFacets = { seller_pubkeys: Array<RadrootsTradeFa export type RadrootsTradeListingMarketStatus = "unknown" | "window" | "active" | "sold" | { other: { value: string, }, }; -export type RadrootsTradeListingProjection = { listing_addr: string, seller_pubkey: string, listing_id: string, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsTradeListingBinProjection>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingLocation | null, images?: Array<RadrootsListingImage> | null, order_count: number, open_order_count: number, terminal_order_count: number, }; +export type RadrootsTradeListingProjection = { listing_addr: string, seller_pubkey: string, listing_id: string, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsTradeListingBinProjection>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingPublicLocation | null, images?: Array<RadrootsListingImage> | null, order_count: number, open_order_count: number, terminal_order_count: number, }; export type RadrootsTradeListingQuery = { seller_pubkey?: string | null, farm_pubkey?: string | null, farm_id?: string | null, product_key?: string | null, product_category?: string | null, listing_status?: RadrootsTradeListingMarketStatus | null, }; diff --git a/tools/xtask/src/dto_roots.rs b/tools/xtask/src/dto_roots.rs @@ -262,8 +262,8 @@ fn trade_import_options(mut options: DtoRegistryRenderOptions) -> DtoRegistryRen "RadrootsListingBin", "RadrootsListingDeliveryMethod", "RadrootsListingImage", - "RadrootsListingLocation", "RadrootsListingProduct", + "RadrootsListingPublicLocation", "RadrootsListingStatus", "RadrootsNostrEventPtr", "RadrootsPlotRef", @@ -380,7 +380,7 @@ mod tests { "RadrootsDocument", "RadrootsDocumentSubject", "RadrootsFarm", - "RadrootsFarmLocation", + "RadrootsFarmPublicLocation", "RadrootsFarmRef", "RadrootsFollow", "RadrootsFollowProfile", @@ -404,9 +404,9 @@ mod tests { "RadrootsListingDeliveryMethod", "RadrootsListingImage", "RadrootsListingImageSize", - "RadrootsListingLocation", "RadrootsListingProduct", "RadrootsListingProductTagKeys", + "RadrootsListingPublicLocation", "RadrootsListingStatus", "RadrootsMessage", "RadrootsMessageFile",