diff --git a/src/robocraft2/factory.rs b/src/robocraft2/factory.rs index 15f027c..ff1bc46 100644 --- a/src/robocraft2/factory.rs +++ b/src/robocraft2/factory.rs @@ -111,6 +111,9 @@ impl FactoryAPI { if let Some(x) = ¶ms.date_maximum { url.query_pairs_mut().append_pair("dateMaximum", x); } + if let Some(x) = ¶ms.purchased_only { + url.query_pairs_mut().append_pair("purchasedOnly", if *x { "true" } else { "false" }); + } if let Some(x) = ¶ms.creator_id { url.query_pairs_mut().append_pair("creatorId", x); } @@ -122,11 +125,14 @@ impl FactoryAPI { } url.query_pairs_mut().append_pair("sortBy", ¶ms.sort_by); url.query_pairs_mut().append_pair("orderBy", ¶ms.order_by); + url.query_pairs_mut().append_pair("modFilter", ¶ms.moderation_filter); let token = self.token.lock().unwrap().token().await.map_err(FactoryError::Protocol)?; let result = self.client.get(url) .header("Authorization", "Bearer ".to_owned() + &token) .send().await .map_err(FactoryError::Protocol)?; + //println!("result: {}", result.text().await.map_err(FactoryError::Protocol)?); + //todo!() handle_json_response::(result).await } diff --git a/src/robocraft2/factory_json.rs b/src/robocraft2/factory_json.rs index 5e6fb88..447b85c 100644 --- a/src/robocraft2/factory_json.rs +++ b/src/robocraft2/factory_json.rs @@ -1,5 +1,37 @@ use serde::{Deserialize, Serialize}; +pub mod order { + pub const ASCENDING: &str = "ascending"; + pub const DESCENDING: &str = "descending"; + pub(super) fn default() -> &'static str { + ASCENDING + } +} + +pub mod sort { + pub const CPU_POWER: &str = "cpuPower"; + pub const FIRE_POWER: &str = "firePower"; + pub const ENGINE_POWER: &str = "enginePower"; + pub const PRICE: &str = "price"; + pub const DATE: &str = "date"; + pub const CLUSTER_COUNT: &str = "clusterCount"; + pub const VIEWS: &str = "views"; + pub const MOST_PURCHASED: &str = "mostPurchased"; + pub const DEFAULT: &str = "default"; + pub(super) fn default() -> &'static str { + DEFAULT + } +} + +pub mod moderation { + pub const NO_FILTER: &str = "none"; + pub const NEEDS_MODERATION: &str = "needsModeration"; + pub const MODERATED: &str = "moderatedOnly"; + pub(super) fn default() -> &'static str { + NO_FILTER + } +} + #[derive(Deserialize, Serialize, Debug, Clone)] pub struct ErrorPayload { #[serde(rename = "error")] @@ -34,16 +66,20 @@ pub struct SearchPayload { pub date_minimum: Option, #[serde(rename = "dateMaximum")] pub date_maximum: Option, + #[serde(rename = "purchasedOnly")] + pub purchased_only: Option, #[serde(rename = "creatorId")] pub creator_id: Option, // GUID #[serde(rename = "page")] pub page: Option, #[serde(rename = "count")] pub count: Option, - #[serde(rename = "sortBy")] - pub sort_by: String, - #[serde(rename = "orderBy")] - pub order_by: String, + #[serde(rename = "sortBy", default="sort::default")] + pub sort_by: &'static str, + #[serde(rename = "orderBy", default="order::default")] + pub order_by: &'static str, + #[serde(rename = "modFilter", default="moderation::default")] + pub moderation_filter: &'static str, } impl Default for SearchPayload { @@ -60,11 +96,13 @@ impl Default for SearchPayload { cluster_maximum: None, date_minimum: None, date_maximum: None, + purchased_only: None, creator_id: None, page: None, count: None, - sort_by: "default".to_owned(), - order_by: "ascending".to_owned(), + sort_by: sort::DEFAULT, + order_by: order::ASCENDING, + moderation_filter: moderation::NO_FILTER, } } } @@ -98,7 +136,7 @@ pub struct RobotInfo { #[serde(rename = "created")] pub created: String, // date #[serde(rename = "image")] - pub image: String, // base64?? + pub image: Option, // url #[serde(rename = "baseCpu")] pub base_cpu: isize, #[serde(rename = "weaponCpu")] diff --git a/src/robocraft2/mod.rs b/src/robocraft2/mod.rs index 12f10ef..e4e8cb2 100644 --- a/src/robocraft2/mod.rs +++ b/src/robocraft2/mod.rs @@ -5,7 +5,7 @@ mod factory; pub use factory::{FactoryAPI, FactoryError}; mod factory_json; -pub use factory_json::{ErrorPayload, SearchPayload, SearchResponse, SearchResponseItem, RobotInfo, RobotPrice, CreateRobotPayload, CreateRobotResponse, FactoryInfoResponse, PublishRobotPayload, PublishRobotResponse, MyRobotsResponse, GetRobotResponse, ModerateRobotPayload, ReportRobotPayload}; +pub use factory_json::{ErrorPayload, SearchPayload, SearchResponse, SearchResponseItem, RobotInfo, RobotPrice, CreateRobotPayload, CreateRobotResponse, FactoryInfoResponse, PublishRobotPayload, PublishRobotResponse, MyRobotsResponse, GetRobotResponse, ModerateRobotPayload, ReportRobotPayload, order, sort, moderation}; mod portal; pub use self::portal::{PortalTokenProvider, AccountInfo, PortalCheckResponse, ITokenProvider}; diff --git a/tests/robocraft2_factory.rs b/tests/robocraft2_factory.rs index d839972..4469844 100644 --- a/tests/robocraft2_factory.rs +++ b/tests/robocraft2_factory.rs @@ -35,8 +35,7 @@ async fn robocraft2_factory_report() -> Result<(), ()> { } #[cfg(feature = "robocraft2")] -//#[tokio::test] -#[allow(dead_code)] +#[tokio::test] async fn robocraft2_factory_default_query() -> Result<(), ()> { let api = builder().await; let result = api.list().await; @@ -47,13 +46,33 @@ async fn robocraft2_factory_default_query() -> Result<(), ()> { assert_ne!(robot.robot.name, ""); assert_ne!(robot.robot.creator_id, ""); assert_ne!(robot.robot.creator_id, ""); - assert_ne!(robot.robot.image, ""); //println!("RobotInfo.to_string() -> `{}`", robot.robot.to_string()); println!("SearchResponseItem {}", serde_json::to_string_pretty(&robot).unwrap()); } Ok(()) } +#[cfg(feature = "robocraft2")] +#[tokio::test] +async fn robocraft2_factory_sort() -> Result<(), ()> { + let api = builder().await; + let mut query = robocraft2::SearchPayload::default(); + query.sort_by = robocraft2::sort::DEFAULT; + query.order_by = robocraft2::order::ASCENDING; + let result = api.search(query).await; + let robo_info = unwrap_factory2(result); + assert_ne!(robo_info.results.len(), 0); + for robot in &robo_info.results { + assert_ne!(robot.robot.name, ""); + assert_ne!(robot.robot.creator_id, ""); + assert_ne!(robot.robot.creator_id, ""); + //println!("RobotInfo.to_string() -> `{}`", robot.robot.to_string()); + //println!("SearchResponseItem {}", serde_json::to_string_pretty(&robot).unwrap()); + println!("date: {}", robot.robot.created); + } + Ok(()) +} + #[cfg(feature = "robocraft2")] #[tokio::test] @@ -138,7 +157,8 @@ async fn robocraft2_factory_my_bots() -> Result<(), ()> { assert_ne!(robot.name, ""); assert_ne!(robot.creator_id, ""); assert_ne!(robot.creator_id, ""); - assert_ne!(robot.image, ""); + assert_ne!(robot.image, None); + assert_ne!(robot.image.as_ref().unwrap(), ""); println!("My bot `{}`", robot.to_string()); //println!("my vehicle {}", serde_json::to_string_pretty(&robot).unwrap()); } @@ -157,7 +177,8 @@ async fn robocraft2_factory_my_published_bots() -> Result<(), ()> { assert_ne!(robot.name, ""); assert_ne!(robot.creator_id, ""); assert_ne!(robot.creator_id, ""); - assert_ne!(robot.image, ""); + assert_ne!(robot.image, None); + assert_ne!(robot.image.as_ref().unwrap(), ""); println!("My pub bot `{}`", robot.to_string()); //println!("pub vehicle {}", serde_json::to_string_pretty(&robot).unwrap()); } diff --git a/tests/robocraft_factory.rs b/tests/robocraft_factory.rs index 542f3aa..427d6de 100644 --- a/tests/robocraft_factory.rs +++ b/tests/robocraft_factory.rs @@ -1,8 +1,6 @@ #[cfg(feature = "robocraft")] use libfj::robocraft; #[cfg(feature = "robocraft")] -use libfj::robocraft2; -#[cfg(feature = "robocraft")] use std::convert::From; #[cfg(feature = "robocraft")] @@ -77,7 +75,8 @@ async fn robocraft_factory_custom_query() -> Result<(), ()> { } #[cfg(feature = "robocraft")] -#[tokio::test] +//#[tokio::test] +#[allow(dead_code)] async fn robocraft_factory_player_query() -> Result<(), ()> { let result = builder() .text("Zalera57".to_string()) // there is a featured robot by this user, so this should never fail