Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [Template Part Revisions](https://developer.wordpress.org/rest-api/reference/wp_template_part-revisions/) endpoint
- WordPress.com Publicize endpoints (`/sites/<site>/publicize/connections` and `/sites/<site>/publicize/services`) for listing, creating, updating, and deleting Jetpack Social connections
- WordPress.com `/me/connections` (keyring) endpoint for listing third-party OAuth connections used by Jetpack Social
- WordPress.com `/products` endpoint
- `WpApiCache` APIs to remove cached data for a self-hosted site (by URL) or a WordPress.com site (by site ID), with matching Swift wrappers on `WordPressApiCache`
- `WpDerivedRequest` now supports plain `get` requests
- `WpDerivedRequest` now supports `additional_query_pairs`
Expand Down
6 changes: 6 additions & 0 deletions wp_api/src/wp_com/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use super::endpoint::{
me_connections_endpoint::{MeConnectionsRequestBuilder, MeConnectionsRequestExecutor},
me_endpoint::{MeRequestBuilder, MeRequestExecutor},
oauth2::{Oauth2RequestBuilder, Oauth2RequestExecutor},
products_endpoint::{ProductsRequestBuilder, ProductsRequestExecutor},
publicize_endpoint::{PublicizeRequestBuilder, PublicizeRequestExecutor},
stats_city_views_endpoint::{StatsCityViewsRequestBuilder, StatsCityViewsRequestExecutor},
stats_clicks_endpoint::{StatsClicksRequestBuilder, StatsClicksRequestExecutor},
Expand Down Expand Up @@ -74,6 +75,7 @@ pub struct WpComApiRequestBuilder {
me: Arc<MeRequestBuilder>,
me_connections: Arc<MeConnectionsRequestBuilder>,
oauth2: Arc<Oauth2RequestBuilder>,
products: Arc<ProductsRequestBuilder>,
publicize: Arc<PublicizeRequestBuilder>,
sites: Arc<SitesRequestBuilder>,
stats_city_views: Arc<StatsCityViewsRequestBuilder>,
Expand Down Expand Up @@ -117,6 +119,7 @@ impl WpComApiRequestBuilder {
me,
me_connections,
oauth2,
products,
publicize,
sites,
stats_city_views,
Expand Down Expand Up @@ -171,6 +174,7 @@ pub struct WpComApiClient {
me: Arc<MeRequestExecutor>,
me_connections: Arc<MeConnectionsRequestExecutor>,
oauth2: Arc<Oauth2RequestExecutor>,
products: Arc<ProductsRequestExecutor>,
publicize: Arc<PublicizeRequestExecutor>,
sites: Arc<SitesRequestExecutor>,
stats_city_views: Arc<StatsCityViewsRequestExecutor>,
Expand Down Expand Up @@ -215,6 +219,7 @@ impl WpComApiClient {
me,
me_connections,
oauth2,
products,
publicize,
sites,
stats_city_views,
Expand Down Expand Up @@ -252,6 +257,7 @@ api_client_generate_endpoint_impl!(WpComApi, languages);
api_client_generate_endpoint_impl!(WpComApi, me);
api_client_generate_endpoint_impl!(WpComApi, me_connections);
api_client_generate_endpoint_impl!(WpComApi, oauth2);
api_client_generate_endpoint_impl!(WpComApi, products);
api_client_generate_endpoint_impl!(WpComApi, publicize);
api_client_generate_endpoint_impl!(WpComApi, sites);
api_client_generate_endpoint_impl!(WpComApi, stats_city_views);
Expand Down
1 change: 1 addition & 0 deletions wp_api/src/wp_com/endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pub mod languages_endpoint;
pub mod me_connections_endpoint;
pub mod me_endpoint;
pub mod oauth2;
pub mod products_endpoint;
pub mod publicize_endpoint;
pub mod segments_endpoint;
pub mod sites_endpoint;
Expand Down
106 changes: 106 additions & 0 deletions wp_api/src/wp_com/endpoint/products_endpoint.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
use crate::{
request::endpoint::{AsNamespace, DerivedRequest},
wp_com::{
WpComNamespace,
products::{ProductMap, ProductsParams},
},
};
use wp_derive_request_builder::WpDerivedRequest;

#[derive(WpDerivedRequest)]
enum ProductsRequest {
#[get(url = "/products", params = &ProductsParams, output = ProductMap)]
List,
}

impl DerivedRequest for ProductsRequest {
fn namespace(&self) -> impl AsNamespace {
WpComNamespace::RestV1_1
}
}

#[cfg(test)]
mod tests {
use super::*;
use crate::{
request::endpoint::ApiUrlResolver,
wp_com::{
endpoint::tests::{
fixture_wp_com_api_url_resolver, validate_wp_com_rest_v1_1_endpoint,
},
language::WPComLanguage,
products::{ProductTypeFilter, ProductsParams},
},
};
use rstest::*;
use std::sync::Arc;

#[rstest]
fn list_no_filter(endpoint: ProductsRequestEndpoint) {
validate_wp_com_rest_v1_1_endpoint(endpoint.list(&ProductsParams::default()), "/products?");
}

#[rstest]
fn list_with_domains_filter(endpoint: ProductsRequestEndpoint) {
validate_wp_com_rest_v1_1_endpoint(
endpoint.list(&ProductsParams {
product_type: Some(ProductTypeFilter::Domains),
..Default::default()
}),
"/products?type=domains",
);
}

#[rstest]
fn list_with_jetpack_filter(endpoint: ProductsRequestEndpoint) {
validate_wp_com_rest_v1_1_endpoint(
endpoint.list(&ProductsParams {
product_type: Some(ProductTypeFilter::Jetpack),
..Default::default()
}),
"/products?type=jetpack",
);
}

#[rstest]
fn list_with_other_filter(endpoint: ProductsRequestEndpoint) {
validate_wp_com_rest_v1_1_endpoint(
endpoint.list(&ProductsParams {
product_type: Some(ProductTypeFilter::Other {
value: "theme".to_string(),
}),
..Default::default()
}),
"/products?type=theme",
);
}

#[rstest]
fn list_with_locale(endpoint: ProductsRequestEndpoint) {
validate_wp_com_rest_v1_1_endpoint(
endpoint.list(&ProductsParams {
locale: Some(WPComLanguage::Spanish),
..Default::default()
}),
"/products?locale=es",
);
}

#[rstest]
fn list_with_type_and_locale(endpoint: ProductsRequestEndpoint) {
validate_wp_com_rest_v1_1_endpoint(
endpoint.list(&ProductsParams {
product_type: Some(ProductTypeFilter::Domains),
locale: Some(WPComLanguage::Japanese),
}),
"/products?type=domains&locale=ja",
);
}

#[fixture]
fn endpoint(
fixture_wp_com_api_url_resolver: Arc<dyn ApiUrlResolver>,
) -> ProductsRequestEndpoint {
ProductsRequestEndpoint::new(fixture_wp_com_api_url_resolver)
}
}
29 changes: 29 additions & 0 deletions wp_api/src/wp_com/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ pub mod language;
pub mod me;
pub mod me_connections;
pub mod oauth2;
pub mod products;
pub mod publicize;
pub mod segments;
pub mod sites;
Expand Down Expand Up @@ -57,6 +58,34 @@ impl std::fmt::Display for WpComSiteId {
}
}

uniffi::custom_newtype!(CurrencyCode, String);
/// ISO 4217 currency code (e.g. `"USD"`, `"TRY"`, `"EUR"`).
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct CurrencyCode(pub String);

impl std::fmt::Display for CurrencyCode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}

/// Unit of a time span in the billing system.
///
/// Corresponds to the backend's `Time_Span_Unit` enum.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, uniffi::Enum)]
#[serde(rename_all = "snake_case")]
pub enum TimeSpanUnit {
Day,
Week,
Month,
Year,
Indefinite,
/// A unit not covered by the known variants.
#[serde(untagged)]
Other(String),
}

pub(crate) enum WpComNamespace {
Oauth2,
RestV1_1,
Expand Down
Loading