diff --git a/native/swift/Sources/wordpress-api/Exports.swift b/native/swift/Sources/wordpress-api/Exports.swift index a52d7ee32..a311a7bb4 100644 --- a/native/swift/Sources/wordpress-api/Exports.swift +++ b/native/swift/Sources/wordpress-api/Exports.swift @@ -20,7 +20,7 @@ public typealias UserUpdateParams = WordPressAPIInternal.UserUpdateParams public typealias UserCreateParams = WordPressAPIInternal.UserCreateParams public typealias UserDeleteParams = WordPressAPIInternal.UserDeleteParams public typealias UserDeleteResponse = WordPressAPIInternal.UserDeleteResponse -public typealias UsersRequestBuilder = WordPressAPIInternal.UsersRequestBuilder +public typealias UsersRequestExecutor = WordPressAPIInternal.UsersRequestExecutor // MARK: - Plugins diff --git a/native/swift/Sources/wordpress-api/WordPressAPI.swift b/native/swift/Sources/wordpress-api/WordPressAPI.swift index bf8d2b8d6..2765e7bad 100644 --- a/native/swift/Sources/wordpress-api/WordPressAPI.swift +++ b/native/swift/Sources/wordpress-api/WordPressAPI.swift @@ -39,7 +39,7 @@ public struct WordPressAPI { ) } - public var users: UsersRequestBuilder { + public var users: UsersRequestExecutor { self.requestBuilder.users() } diff --git a/wp_api/src/lib.rs b/wp_api/src/lib.rs index adbb1a324..2700051ea 100644 --- a/wp_api/src/lib.rs +++ b/wp_api/src/lib.rs @@ -5,11 +5,11 @@ use request::{ application_passwords_endpoint::{ ApplicationPasswordsRequestBuilder2, ApplicationPasswordsRequestExecutor, }, + users_endpoint::{UsersRequestBuilder2, UsersRequestExecutor}, ApiBaseUrl, }, plugins_request_builder::PluginsRequestBuilder, - users_request_builder::UsersRequestBuilder, - RequestExecutor, UsersRequestBuilder2, WpNetworkResponse, + RequestExecutor, WpNetworkResponse, }; use std::sync::Arc; @@ -70,7 +70,7 @@ impl WpApiRequestBuilder { #[derive(Debug, uniffi::Object)] pub struct WpRequestBuilder { application_passwords: Arc, - users: Arc, + users: Arc, plugins: Arc, } @@ -101,7 +101,11 @@ impl WpRequestBuilder { request_executor.clone(), ) .into(), - users: UsersRequestBuilder::new(api_base_url.clone(), request_builder.clone()).into(), + users: UsersRequestExecutor::new( + UsersRequestBuilder2::new(api_base_url.clone(), request_builder.clone()), + request_executor.clone(), + ) + .into(), plugins: PluginsRequestBuilder::new(api_base_url.clone(), request_builder.clone()) .into(), }) @@ -111,7 +115,7 @@ impl WpRequestBuilder { self.application_passwords.clone() } - pub fn users(&self) -> Arc { + pub fn users(&self) -> Arc { self.users.clone() } diff --git a/wp_api/src/request.rs b/wp_api/src/request.rs index a5f8844b0..03002249e 100644 --- a/wp_api/src/request.rs +++ b/wp_api/src/request.rs @@ -8,11 +8,8 @@ use crate::{api_error::RequestExecutionError, WpApiError, WpAuthentication}; use self::endpoint::WpEndpointUrl; -pub use endpoint::users_endpoint::generated::UsersRequestBuilder2; - pub mod endpoint; pub mod plugins_request_builder; -pub mod users_request_builder; const CONTENT_TYPE_JSON: &str = "application/json"; const LINK_HEADER_KEY: &str = "Link"; diff --git a/wp_api/src/request/endpoint/users_endpoint.rs b/wp_api/src/request/endpoint/users_endpoint.rs index c4c4f6193..61ae58975 100644 --- a/wp_api/src/request/endpoint/users_endpoint.rs +++ b/wp_api/src/request/endpoint/users_endpoint.rs @@ -1,155 +1,53 @@ -use std::sync::Arc; - -use crate::{SparseUserField, UserDeleteParams, UserId, UserListParams, WpContext}; - -use super::{ApiBaseUrl, ApiEndpointUrl, UrlExtension}; - -// Temporary mod to showcase `wp_derive_request_builder` -// The generated code can be inspected by running: -// ``` -// cargo expand request::endpoint::users_endpoint::generated -p wp_api -// ``` -pub mod generated { - use super::*; - - #[derive(wp_derive_request_builder::WpDerivedRequest)] - #[SparseField(SparseUserField)] - enum UsersRequest { - #[contextual_get(url = "/users", params = &UserListParams, output = Vec)] - List, - #[post(url = "/users", params = &crate::UserCreateParams, output = crate::UserWithEditContext)] - Create, - #[delete(url = "/users/", params = &UserDeleteParams, output = crate::UserDeleteResponse)] - Delete, - #[delete(url = "/users/me", params = &UserDeleteParams, output = crate::UserDeleteResponse)] - DeleteMe, - #[contextual_get(url = "/users/", output = crate::SparseUser)] - Retrieve, - #[contextual_get(url = "/users/me", output = crate::SparseUser)] - RetrieveMe, - #[post(url = "/users/", params = &crate::UserUpdateParams, output = crate::UserWithEditContext)] - Update, - #[post(url = "/users/me", params = &crate::UserUpdateParams, output = crate::UserWithEditContext)] - UpdateMe, - } -} - -#[derive(Debug)] -pub(crate) struct UsersEndpoint { - api_base_url: Arc, -} - -impl UsersEndpoint { - pub fn new(api_base_url: Arc) -> Self { - Self { api_base_url } - } - - pub fn create(&self) -> ApiEndpointUrl { - self.api_base_url.by_appending("users").into() - } - - pub fn delete(&self, user_id: UserId, params: &UserDeleteParams) -> ApiEndpointUrl { - let mut url = self - .api_base_url - .by_extending(["users", &user_id.to_string()]); - url.query_pairs_mut().extend_pairs(params.query_pairs()); - url.into() - } - - pub fn delete_me(&self, params: &UserDeleteParams) -> ApiEndpointUrl { - let mut url = self.api_base_url.by_extending(["users", "me"]); - url.query_pairs_mut().extend_pairs(params.query_pairs()); - url.into() - } - - pub fn list(&self, context: WpContext, params: &UserListParams) -> ApiEndpointUrl { - let mut url = self.api_base_url.by_appending("users"); - url.query_pairs_mut() - .append_pair("context", context.as_str()); - url.query_pairs_mut().extend_pairs(params.query_pairs()); - url.into() - } - - pub fn filter_list( - &self, - context: WpContext, - params: &UserListParams, - fields: &[SparseUserField], - ) -> ApiEndpointUrl { - self.list(context, params) - .url - .append_filter_fields(fields) - .into() - } - - pub fn retrieve(&self, user_id: UserId, context: WpContext) -> ApiEndpointUrl { - let mut url = self - .api_base_url - .by_extending(["users", &user_id.to_string()]); - url.query_pairs_mut() - .append_pair("context", context.as_str()); - url.into() - } - - pub fn filter_retrieve( - &self, - user_id: UserId, - context: WpContext, - fields: &[SparseUserField], - ) -> ApiEndpointUrl { - self.retrieve(user_id, context) - .url - .append_filter_fields(fields) - .into() - } - - pub fn retrieve_me(&self, context: WpContext) -> ApiEndpointUrl { - let mut url = self.api_base_url.by_extending(["users", "me"]); - url.query_pairs_mut() - .append_pair("context", context.as_str()); - url.into() - } - - pub fn filter_retrieve_me( - &self, - context: WpContext, - fields: &[SparseUserField], - ) -> ApiEndpointUrl { - self.retrieve_me(context) - .url - .append_filter_fields(fields) - .into() - } - - pub fn update(&self, user_id: UserId) -> ApiEndpointUrl { - self.api_base_url - .by_extending(["users", &user_id.to_string()]) - .into() - } - - pub fn update_me(&self) -> ApiEndpointUrl { - self.api_base_url.by_extending(["users", "me"]).into() - } +use crate::{ + SparseUser, SparseUserField, UserCreateParams, UserDeleteParams, UserDeleteResponse, UserId, + UserListParams, UserUpdateParams, UserWithEditContext, UserWithEmbedContext, + UserWithViewContext, +}; +use wp_derive_request_builder::WpDerivedRequest; + +#[derive(WpDerivedRequest)] +#[SparseField(SparseUserField)] +enum UsersRequest { + #[contextual_get(url = "/users", params = &UserListParams, output = Vec)] + List, + #[post(url = "/users", params = &UserCreateParams, output = UserWithEditContext)] + Create, + #[delete(url = "/users/", params = &UserDeleteParams, output = UserDeleteResponse)] + Delete, + #[delete(url = "/users/me", params = &UserDeleteParams, output = UserDeleteResponse)] + DeleteMe, + #[contextual_get(url = "/users/", output = SparseUser)] + Retrieve, + #[contextual_get(url = "/users/me", output = SparseUser)] + RetrieveMe, + #[post(url = "/users/", params = &UserUpdateParams, output = UserWithEditContext)] + Update, + #[post(url = "/users/me", params = &UserUpdateParams, output = UserWithEditContext)] + UpdateMe, } #[cfg(test)] mod tests { use super::*; use crate::{ - request::endpoint::tests::{fixture_api_base_url, validate_endpoint}, - WpApiParamUsersHasPublishedPosts, + request::endpoint::{ + tests::{fixture_api_base_url, validate_endpoint}, + ApiBaseUrl, + }, + WpApiParamUsersHasPublishedPosts, WpContext, }; use rstest::*; + use std::sync::Arc; #[rstest] - fn create_user(users_endpoint: UsersEndpoint) { - validate_endpoint(users_endpoint.create(), "/users"); + fn create_user(endpoint: UsersRequestEndpoint) { + validate_endpoint(endpoint.create(), "/users"); } #[rstest] - fn delete_user(users_endpoint: UsersEndpoint) { + fn delete_user(endpoint: UsersRequestEndpoint) { validate_endpoint( - users_endpoint.delete( + endpoint.delete( UserId(54), &UserDeleteParams { reassign: UserId(98), @@ -160,9 +58,9 @@ mod tests { } #[rstest] - fn delete_current_user(users_endpoint: UsersEndpoint) { + fn delete_current_user(endpoint: UsersRequestEndpoint) { validate_endpoint( - users_endpoint.delete_me(&UserDeleteParams { + endpoint.delete_me(&UserDeleteParams { reassign: UserId(98), }), "/users/me?reassign=98&force=true", @@ -170,23 +68,23 @@ mod tests { } #[rstest] - fn list_users(users_endpoint: UsersEndpoint) { + fn list_users(endpoint: UsersRequestEndpoint) { validate_endpoint( - users_endpoint.list(WpContext::Edit, &UserListParams::default()), + endpoint.list_with_edit_context(&UserListParams::default()), "/users?context=edit", ); } #[rstest] - fn list_users_default_params_empty_fields(users_endpoint: UsersEndpoint) { + fn list_users_default_params_empty_fields(endpoint: UsersRequestEndpoint) { validate_endpoint( - users_endpoint.list(WpContext::Edit, &UserListParams::default()), + endpoint.list_with_edit_context(&UserListParams::default()), "/users?context=edit", ); } #[rstest] - fn list_users_with_params(users_endpoint: UsersEndpoint) { + fn list_users_with_params(endpoint: UsersRequestEndpoint) { let params = UserListParams { page: Some(2), per_page: Some(60), @@ -203,21 +101,21 @@ mod tests { has_published_posts: Some(WpApiParamUsersHasPublishedPosts::True), }; validate_endpoint( - users_endpoint.list(WpContext::Edit, ¶ms), + endpoint.list_with_edit_context(¶ms), "/users?context=edit&page=2&per_page=60&search=foo&slug=bar%2Cbaz&has_published_posts=true", ); } #[rstest] - fn filter_list_users_default_params_empty_fields(users_endpoint: UsersEndpoint) { + fn filter_list_users_default_params_empty_fields(endpoint: UsersRequestEndpoint) { validate_endpoint( - users_endpoint.filter_list(WpContext::Edit, &UserListParams::default(), &[]), + endpoint.filter_list(WpContext::Edit, &UserListParams::default(), &[]), "/users?context=edit&_fields=", ); } #[rstest] - fn filter_list_users_with_params(users_endpoint: UsersEndpoint) { + fn filter_list_users_with_params(endpoint: UsersRequestEndpoint) { let params = UserListParams { page: Some(2), per_page: Some(60), @@ -237,23 +135,23 @@ mod tests { ])), }; validate_endpoint( - users_endpoint.filter_list(WpContext::Edit, ¶ms, &[SparseUserField::Name, SparseUserField::Email]), + endpoint.filter_list(WpContext::Edit, ¶ms, &[SparseUserField::Name, SparseUserField::Email]), "/users?context=edit&page=2&per_page=60&search=foo&slug=bar%2Cbaz&has_published_posts=post%2Cpage&_fields=name%2Cemail", ); } #[rstest] - fn retrieve_user(users_endpoint: UsersEndpoint) { + fn retrieve_user(endpoint: UsersRequestEndpoint) { validate_endpoint( - users_endpoint.retrieve(UserId(98), WpContext::View), + endpoint.retrieve_with_view_context(UserId(98)), "/users/98?context=view", ); } #[rstest] - fn filter_retrieve_user(users_endpoint: UsersEndpoint) { + fn filter_retrieve_user(endpoint: UsersRequestEndpoint) { validate_endpoint( - users_endpoint.filter_retrieve( + endpoint.filter_retrieve( UserId(98), WpContext::View, &[SparseUserField::Nickname, SparseUserField::Url], @@ -263,17 +161,17 @@ mod tests { } #[rstest] - fn retrieve_current_user(users_endpoint: UsersEndpoint) { + fn retrieve_current_user(endpoint: UsersRequestEndpoint) { validate_endpoint( - users_endpoint.retrieve_me(WpContext::Embed), + endpoint.retrieve_me_with_embed_context(), "/users/me?context=embed", ); } #[rstest] - fn filter_retrieve_current_user(users_endpoint: UsersEndpoint) { + fn filter_retrieve_current_user(endpoint: UsersRequestEndpoint) { validate_endpoint( - users_endpoint.filter_retrieve_me( + endpoint.filter_retrieve_me( WpContext::Embed, &[SparseUserField::Roles, SparseUserField::Capabilities], ), @@ -282,17 +180,17 @@ mod tests { } #[rstest] - fn update_user(users_endpoint: UsersEndpoint) { - validate_endpoint(users_endpoint.update(UserId(98)), "/users/98"); + fn update_user(endpoint: UsersRequestEndpoint) { + validate_endpoint(endpoint.update(UserId(98)), "/users/98"); } #[rstest] - fn update_current_user(users_endpoint: UsersEndpoint) { - validate_endpoint(users_endpoint.update_me(), "/users/me"); + fn update_current_user(endpoint: UsersRequestEndpoint) { + validate_endpoint(endpoint.update_me(), "/users/me"); } #[fixture] - fn users_endpoint(fixture_api_base_url: Arc) -> UsersEndpoint { - UsersEndpoint::new(fixture_api_base_url) + fn endpoint(fixture_api_base_url: Arc) -> UsersRequestEndpoint { + UsersRequestEndpoint::new(fixture_api_base_url) } } diff --git a/wp_api/src/request/users_request_builder.rs b/wp_api/src/request/users_request_builder.rs deleted file mode 100644 index 1483bd007..000000000 --- a/wp_api/src/request/users_request_builder.rs +++ /dev/null @@ -1,181 +0,0 @@ -use std::sync::Arc; - -use crate::{ - SparseUser, SparseUserField, UserCreateParams, UserDeleteParams, UserDeleteResponse, UserId, - UserListParams, UserUpdateParams, UserWithEditContext, UserWithEmbedContext, - UserWithViewContext, WpApiError, WpContext, -}; - -use super::{ - endpoint::{users_endpoint::UsersEndpoint, ApiBaseUrl}, - RequestBuilder, -}; - -#[derive(Debug, uniffi::Object)] -pub struct UsersRequestBuilder { - endpoint: UsersEndpoint, - request_builder: Arc, -} - -impl UsersRequestBuilder { - pub(crate) fn new(api_base_url: Arc, request_builder: Arc) -> Self { - Self { - endpoint: UsersEndpoint::new(api_base_url), - request_builder, - } - } -} - -#[uniffi::export] -impl UsersRequestBuilder { - pub async fn list_with_edit_context( - &self, - params: &UserListParams, - ) -> Result, WpApiError> { - self.request_builder - .get(self.endpoint.list(WpContext::Edit, params)) - .await - } - - pub async fn list_with_embed_context( - &self, - params: &UserListParams, - ) -> Result, WpApiError> { - self.request_builder - .get(self.endpoint.list(WpContext::Embed, params)) - .await - } - - pub async fn list_with_view_context( - &self, - params: &UserListParams, - ) -> Result, WpApiError> { - self.request_builder - .get(self.endpoint.list(WpContext::View, params)) - .await - } - - pub async fn filter_list( - &self, - context: WpContext, - params: &UserListParams, - fields: &[SparseUserField], - ) -> Result, WpApiError> { - self.request_builder - .get(self.endpoint.filter_list(context, params, fields)) - .await - } - - pub async fn retrieve_with_edit_context( - &self, - user_id: UserId, - ) -> Result { - self.request_builder - .get(self.endpoint.retrieve(user_id, WpContext::Edit)) - .await - } - - pub async fn retrieve_with_embed_context( - &self, - user_id: UserId, - ) -> Result { - self.request_builder - .get(self.endpoint.retrieve(user_id, WpContext::Embed)) - .await - } - - pub async fn retrieve_with_view_context( - &self, - user_id: UserId, - ) -> Result { - self.request_builder - .get(self.endpoint.retrieve(user_id, WpContext::View)) - .await - } - - pub async fn filter_retrieve( - &self, - user_id: UserId, - context: WpContext, - fields: &[SparseUserField], - ) -> Result { - self.request_builder - .get(self.endpoint.filter_retrieve(user_id, context, fields)) - .await - } - - pub async fn retrieve_me_with_edit_context(&self) -> Result { - self.request_builder - .get(self.endpoint.retrieve_me(WpContext::Edit)) - .await - } - - pub async fn retrieve_me_with_embed_context(&self) -> Result { - self.request_builder - .get(self.endpoint.retrieve_me(WpContext::Embed)) - .await - } - - pub async fn retrieve_me_with_view_context(&self) -> Result { - self.request_builder - .get(self.endpoint.retrieve_me(WpContext::View)) - .await - } - - pub async fn filter_retrieve_me( - &self, - context: WpContext, - fields: &[SparseUserField], - ) -> Result { - self.request_builder - .get(self.endpoint.filter_retrieve_me(context, fields)) - .await - } - - pub async fn create( - &self, - params: &UserCreateParams, - ) -> Result { - self.request_builder - .post(self.endpoint.create(), params) - .await - } - - pub async fn update( - &self, - user_id: UserId, - params: &UserUpdateParams, - ) -> Result { - self.request_builder - .post(self.endpoint.update(user_id), params) - .await - } - - pub async fn update_me( - &self, - params: &UserUpdateParams, - ) -> Result { - self.request_builder - .post(self.endpoint.update_me(), params) - .await - } - - pub async fn delete( - &self, - user_id: UserId, - params: &UserDeleteParams, - ) -> Result { - self.request_builder - .delete(self.endpoint.delete(user_id, params)) - .await - } - - pub async fn delete_me( - &self, - params: &UserDeleteParams, - ) -> Result { - self.request_builder - .delete(self.endpoint.delete_me(params)) - .await - } -}