Skip to content
Merged
213 changes: 70 additions & 143 deletions wp_api/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
#![allow(dead_code, unused_variables)]

use request::{
endpoint::{ApiEndpoint, ApiEndpointUrl},
endpoint::{ApiBaseUrl, ApiEndpointUrl},
plugins_request_builder::PluginsRequestBuilder,
users_request_builder::UsersRequestBuilder,
RequestMethod, WPNetworkRequest, WPNetworkResponse,
};
use std::collections::HashMap;
use serde::Serialize;
use std::{collections::HashMap, sync::Arc};
use url::Url;

pub use api_error::{WPApiError, WPRestError, WPRestErrorCode, WPRestErrorWrapper};
Expand All @@ -25,8 +28,9 @@ const CONTENT_TYPE_JSON: &str = "application/json";

#[derive(Debug, uniffi::Object)]
pub struct WPApiHelper {
api_endpoint: ApiEndpoint,
authentication: WPAuthentication,
request_builder: Arc<RequestBuilder>,
users_request: UsersRequestBuilder,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

users_request is a bit of an awkward name, but I'm assume it's to make things nice for a caller like:

helper.users_request.create()

If not, we might want to consider just calling it users_request_builder, as lengthy as that is? WDYT?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forgot to add the _builder suffix after fe13c62. I'll do that in the next iteration of WPApiHelper.

plugins_request: PluginsRequestBuilder,
}

#[uniffi::export]
Expand All @@ -43,39 +47,33 @@ impl WPApiHelper {
pub fn new(site_url: String, authentication: WPAuthentication) -> Self {
let url = Url::parse(site_url.as_str()).unwrap();
// TODO: Handle the url parse error
let api_endpoint = ApiEndpoint::new_from_str(site_url.as_str()).unwrap();
let api_base_url = Arc::new(ApiBaseUrl::new(site_url.as_str()).unwrap());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure about using Arc<T> for all of these vs just using .clone() (which is IMHO simpler because we pay all the costs upfront), but given the fact that all our FFI already uses Arc<T>, we can defer this and adjust if needed – callers shouldn't be affected.

let request_builder = Arc::new(RequestBuilder {
authentication: authentication.clone(),
});

Self {
api_endpoint,
authentication,
request_builder: request_builder.clone(),
users_request: UsersRequestBuilder::new(api_base_url.clone(), request_builder.clone()),
plugins_request: PluginsRequestBuilder::new(
api_base_url.clone(),
request_builder.clone(),
),
}
}

// TODO: Remove this because we want to build all requests within the crate
pub fn raw_request(&self, url: String) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: ApiEndpointUrl::new(Url::parse(url.as_str()).unwrap()).into(),
header_map: self.header_map(),
body: None,
}
self.request_builder
.get(ApiEndpointUrl::new(Url::parse(url.as_str()).unwrap()))
}

pub fn list_users_request(
&self,
context: WPContext,
params: &Option<UserListParams>, // UniFFI doesn't support Option<&T>
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self
.api_endpoint
.users
.list(context, params.as_ref())
.into(),
header_map: self.header_map(),
body: None,
}
self.users_request.list(context, params)
}

pub fn filter_list_users_request(
Expand All @@ -84,25 +82,11 @@ impl WPApiHelper {
params: &Option<UserListParams>, // UniFFI doesn't support Option<&T>
fields: &[SparseUserField],
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self
.api_endpoint
.users
.filter_list(context, params.as_ref(), fields)
.into(),
header_map: self.header_map(),
body: None,
}
self.users_request.filter_list(context, params, fields)
}

pub fn retrieve_user_request(&self, user_id: UserId, context: WPContext) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self.api_endpoint.users.retrieve(user_id, context).into(),
header_map: self.header_map(),
body: None,
}
self.users_request.retrieve(user_id, context)
}

pub fn filter_retrieve_user_request(
Expand All @@ -111,112 +95,55 @@ impl WPApiHelper {
context: WPContext,
fields: &[SparseUserField],
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self
.api_endpoint
.users
.filter_retrieve(user_id, context, fields)
.into(),
header_map: self.header_map(),
body: None,
}
self.users_request.filter_retrieve(user_id, context, fields)
}

pub fn retrieve_current_user_request(&self, context: WPContext) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self.api_endpoint.users.retrieve_me(context).into(),
header_map: self.header_map(),
body: None,
}
self.users_request.retrieve_me(context)
}

pub fn filter_retrieve_current_user_request(
&self,
context: WPContext,
fields: &[SparseUserField],
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self
.api_endpoint
.users
.filter_retrieve_me(context, fields)
.into(),
header_map: self.header_map(),
body: None,
}
self.users_request.filter_retrieve_me(context, fields)
}

pub fn create_user_request(&self, params: &UserCreateParams) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::POST,
url: self.api_endpoint.users.create().into(),
header_map: self.header_map_for_post_request(),
body: serde_json::to_vec(&params).ok(),
}
self.users_request.create(params)
}

pub fn update_user_request(
&self,
user_id: UserId,
params: &UserUpdateParams,
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::POST,
url: self.api_endpoint.users.update(user_id).into(),
header_map: self.header_map_for_post_request(),
body: serde_json::to_vec(&params).ok(),
}
self.users_request.update(user_id, params)
}

pub fn update_current_user_request(&self, params: &UserUpdateParams) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::POST,
url: self.api_endpoint.users.update_me().into(),
header_map: self.header_map_for_post_request(),
body: serde_json::to_vec(&params).ok(),
}
self.users_request.update_me(params)
}

pub fn delete_user_request(
&self,
user_id: UserId,
params: &UserDeleteParams,
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::DELETE,
url: self.api_endpoint.users.delete(user_id, params).into(),
header_map: self.header_map(),
body: None,
}
self.users_request.delete(user_id, params)
}

pub fn delete_current_user_request(&self, params: &UserDeleteParams) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::DELETE,
url: self.api_endpoint.users.delete_me(params).into(),
header_map: self.header_map(),
body: None,
}
self.users_request.delete_me(params)
}

pub fn list_plugins_request(
&self,
context: WPContext,
params: &Option<PluginListParams>, // UniFFI doesn't support Option<&T>
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self
.api_endpoint
.plugins
.list(context, params.as_ref())
.into(),
header_map: self.header_map(),
body: None,
}
self.plugins_request.list(context, params)
}

pub fn filter_list_plugins_request(
Expand All @@ -225,38 +152,19 @@ impl WPApiHelper {
params: &Option<PluginListParams>, // UniFFI doesn't support Option<&T>
fields: &[SparsePluginField],
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self
.api_endpoint
.plugins
.filter_list(context, params.as_ref(), fields)
.into(),
header_map: self.header_map(),
body: None,
}
self.plugins_request.filter_list(context, params, fields)
}

pub fn create_plugin_request(&self, params: &PluginCreateParams) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::POST,
url: self.api_endpoint.plugins.create().into(),
header_map: self.header_map_for_post_request(),
body: serde_json::to_vec(&params).ok(),
}
self.plugins_request.create(params)
}

pub fn retrieve_plugin_request(
&self,
context: WPContext,
plugin: &PluginSlug,
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self.api_endpoint.plugins.retrieve(context, plugin).into(),
header_map: self.header_map(),
body: None,
}
self.plugins_request.retrieve(context, plugin)
}

pub fn filter_retrieve_plugin_request(
Expand All @@ -265,35 +173,54 @@ impl WPApiHelper {
plugin: &PluginSlug,
fields: &[SparsePluginField],
) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: self
.api_endpoint
.plugins
.filter_retrieve(context, plugin, fields)
.into(),
header_map: self.header_map(),
body: None,
}
self.plugins_request
.filter_retrieve(context, plugin, fields)
}

pub fn update_plugin_request(
&self,
plugin: &PluginSlug,
params: &PluginUpdateParams,
) -> WPNetworkRequest {
self.plugins_request.update(plugin, params)
}

pub fn delete_plugin_request(&self, plugin: &PluginSlug) -> WPNetworkRequest {
self.plugins_request.delete(plugin)
}
}

#[derive(Debug)]
struct RequestBuilder {
authentication: WPAuthentication,
}

impl RequestBuilder {
fn get(&self, url: ApiEndpointUrl) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::GET,
url: url.into(),
header_map: self.header_map(),
body: None,
}
}

fn post<T>(&self, url: ApiEndpointUrl, json_body: &T) -> WPNetworkRequest
where
T: ?Sized + Serialize,
{
WPNetworkRequest {
method: RequestMethod::POST,
url: self.api_endpoint.plugins.update(plugin).into(),
url: url.into(),
header_map: self.header_map_for_post_request(),
body: serde_json::to_vec(&params).ok(),
body: serde_json::to_vec(json_body).ok(),
}
}

pub fn delete_plugin_request(&self, plugin: &PluginSlug) -> WPNetworkRequest {
fn delete(&self, url: ApiEndpointUrl) -> WPNetworkRequest {
WPNetworkRequest {
method: RequestMethod::DELETE,
url: self.api_endpoint.plugins.delete(plugin).into(),
url: url.into(),
header_map: self.header_map(),
body: None,
}
Expand All @@ -305,9 +232,9 @@ impl WPApiHelper {
http::header::ACCEPT.to_string(),
CONTENT_TYPE_JSON.to_string(),
);
match &self.authentication {
match self.authentication {
WPAuthentication::None => None,
WPAuthentication::AuthorizationHeader { token } => {
WPAuthentication::AuthorizationHeader { ref token } => {
header_map.insert("Authorization".to_string(), format!("Basic {}", token))
}
};
Expand Down
2 changes: 2 additions & 0 deletions wp_api/src/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ use crate::WPApiError;
use self::endpoint::WpEndpointUrl;

pub mod endpoint;
pub mod plugins_request_builder;
pub mod users_request_builder;

// Has custom `Debug` trait implementation
#[derive(uniffi::Record)]
Expand Down
Loading