Skip to content

Commit 4542166

Browse files
committed
Adds navigation revision & autosave specific types & endpoints
1 parent 881137e commit 4542166

12 files changed

+371
-299
lines changed

wp_api/src/api_client.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ use crate::{
1919
},
2020
nav_menu_items_endpoint::{NavMenuItemsRequestBuilder, NavMenuItemsRequestExecutor},
2121
nav_menus_endpoint::{NavMenusRequestBuilder, NavMenusRequestExecutor},
22+
navigation_autosaves_endpoint::{
23+
NavigationAutosavesRequestBuilder, NavigationAutosavesRequestExecutor,
24+
},
25+
navigation_revisions_endpoint::{
26+
NavigationRevisionsRequestBuilder, NavigationRevisionsRequestExecutor,
27+
},
2228
navigations_endpoint::{NavigationsRequestBuilder, NavigationsRequestExecutor},
2329
plugins_endpoint::{PluginsRequestBuilder, PluginsRequestExecutor},
2430
post_autosaves_endpoint::{AutosavesRequestBuilder, AutosavesRequestExecutor},
@@ -59,6 +65,8 @@ pub struct WpApiRequestBuilder {
5965
nav_menu_item_autosaves: Arc<NavMenuItemAutosavesRequestBuilder>,
6066
nav_menu_items: Arc<NavMenuItemsRequestBuilder>,
6167
nav_menus: Arc<NavMenusRequestBuilder>,
68+
navigation_autosaves: Arc<NavigationAutosavesRequestBuilder>,
69+
navigation_revisions: Arc<NavigationRevisionsRequestBuilder>,
6270
navigations: Arc<NavigationsRequestBuilder>,
6371
plugins: Arc<PluginsRequestBuilder>,
6472
post_revisions: Arc<PostRevisionsRequestBuilder>,
@@ -95,6 +103,8 @@ impl WpApiRequestBuilder {
95103
nav_menu_item_autosaves,
96104
nav_menu_items,
97105
nav_menus,
106+
navigation_autosaves,
107+
navigation_revisions,
98108
navigations,
99109
plugins,
100110
post_revisions,
@@ -141,6 +151,8 @@ pub struct WpApiClient {
141151
nav_menu_item_autosaves: Arc<NavMenuItemAutosavesRequestExecutor>,
142152
nav_menu_items: Arc<NavMenuItemsRequestExecutor>,
143153
nav_menus: Arc<NavMenusRequestExecutor>,
154+
navigation_autosaves: Arc<NavigationAutosavesRequestExecutor>,
155+
navigation_revisions: Arc<NavigationRevisionsRequestExecutor>,
144156
navigations: Arc<NavigationsRequestExecutor>,
145157
plugins: Arc<PluginsRequestExecutor>,
146158
post_revisions: Arc<PostRevisionsRequestExecutor>,
@@ -174,6 +186,8 @@ impl WpApiClient {
174186
nav_menu_item_autosaves,
175187
nav_menu_items,
176188
nav_menus,
189+
navigation_autosaves,
190+
navigation_revisions,
177191
navigations,
178192
plugins,
179193
post_revisions,
@@ -217,6 +231,8 @@ api_client_generate_endpoint_impl!(WpApi, menu_locations);
217231
api_client_generate_endpoint_impl!(WpApi, nav_menu_item_autosaves);
218232
api_client_generate_endpoint_impl!(WpApi, nav_menu_items);
219233
api_client_generate_endpoint_impl!(WpApi, nav_menus);
234+
api_client_generate_endpoint_impl!(WpApi, navigation_autosaves);
235+
api_client_generate_endpoint_impl!(WpApi, navigation_revisions);
220236
api_client_generate_endpoint_impl!(WpApi, navigations);
221237
api_client_generate_endpoint_impl!(WpApi, plugins);
222238
api_client_generate_endpoint_impl!(WpApi, post_revisions);

wp_api/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub mod middleware;
2222
pub mod nav_menu_item_revisions;
2323
pub mod nav_menu_items;
2424
pub mod nav_menus;
25+
pub mod navigation_revisions;
2526
pub mod navigations;
2627
pub mod parsed_url;
2728
pub mod plugins;

wp_api/src/navigation_revisions.rs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
use crate::{
2+
UserId, WpApiParamOrder,
3+
date::WpGmtDateTime,
4+
impl_as_query_value_from_to_string,
5+
navigations::NavigationId,
6+
url_query::{
7+
AppendUrlQueryPairs, FromUrlQueryPairs, QueryPairs, QueryPairsExtension, UrlQueryPairsMap,
8+
},
9+
wp_content_i64_id,
10+
};
11+
use serde::{Deserialize, Serialize};
12+
use wp_contextual::WpContextual;
13+
use wp_derive::WpDeriveParamsField;
14+
15+
wp_content_i64_id!(NavigationRevisionId);
16+
17+
#[derive(
18+
Debug,
19+
Default,
20+
Clone,
21+
Copy,
22+
PartialEq,
23+
Eq,
24+
uniffi::Enum,
25+
strum_macros::EnumString,
26+
strum_macros::Display,
27+
)]
28+
#[strum(serialize_all = "snake_case")]
29+
pub enum WpApiParamNavigationRevisionsOrderBy {
30+
#[default]
31+
Date,
32+
Id,
33+
Include,
34+
IncludeSlugs,
35+
Relevance,
36+
Slug,
37+
Title,
38+
}
39+
40+
impl_as_query_value_from_to_string!(WpApiParamNavigationRevisionsOrderBy);
41+
42+
#[derive(Debug, Default, PartialEq, Eq, uniffi::Record, WpDeriveParamsField)]
43+
#[supports_pagination(true)]
44+
pub struct NavigationRevisionListParams {
45+
/// Current page of the collection.
46+
/// Default: `1`
47+
#[uniffi(default = None)]
48+
pub page: Option<u32>,
49+
/// Maximum number of items to be returned in result set.
50+
#[uniffi(default = None)]
51+
pub per_page: Option<u32>,
52+
/// Limit results to those matching a string.
53+
#[uniffi(default = None)]
54+
pub search: Option<String>,
55+
/// Ensure result set excludes specific IDs.
56+
#[uniffi(default = [])]
57+
pub exclude: Vec<NavigationRevisionId>,
58+
/// Limit result set to specific IDs.
59+
#[uniffi(default = [])]
60+
pub include: Vec<NavigationRevisionId>,
61+
/// Offset the result set by a specific number of items.
62+
#[uniffi(default = None)]
63+
pub offset: Option<u32>,
64+
/// Order sort attribute ascending or descending.
65+
/// Default: desc
66+
/// One of: asc, desc
67+
#[uniffi(default = None)]
68+
pub order: Option<WpApiParamOrder>,
69+
/// Sort collection by object attribute.
70+
/// Default: date
71+
/// One of: date, id, include, relevance, slug, include_slugs, title
72+
#[uniffi(default = None)]
73+
#[field_name("orderby")]
74+
pub orderby: Option<WpApiParamNavigationRevisionsOrderBy>,
75+
}
76+
77+
#[derive(Debug, Serialize, Deserialize, uniffi::Record, WpContextual)]
78+
pub struct SparseNavigationRevision {
79+
#[WpContext(edit, embed, view)]
80+
pub id: Option<NavigationRevisionId>,
81+
#[WpContext(edit, embed, view)]
82+
pub author: Option<UserId>,
83+
#[WpContext(edit, embed, view)]
84+
pub date: Option<String>,
85+
#[WpContext(edit, view)]
86+
pub date_gmt: Option<WpGmtDateTime>,
87+
#[WpContext(edit, view)]
88+
pub modified: Option<String>,
89+
#[WpContext(edit, view)]
90+
pub modified_gmt: Option<WpGmtDateTime>,
91+
#[WpContext(edit, embed, view)]
92+
pub parent: Option<NavigationId>,
93+
#[WpContext(edit, embed, view)]
94+
pub slug: Option<String>,
95+
#[WpContext(edit, view)]
96+
#[WpContextualField]
97+
pub guid: Option<crate::navigations::SparseNavigationGuid>,
98+
#[WpContext(edit, embed, view)]
99+
#[WpContextualField]
100+
pub title: Option<crate::navigations::SparseNavigationTitle>,
101+
#[WpContext(edit, view)]
102+
#[WpContextualField]
103+
pub content: Option<crate::navigations::SparseNavigationContent>,
104+
// meta field omitted for now
105+
}
106+
107+
#[derive(Debug, Serialize, Deserialize, uniffi::Record)]
108+
pub struct NavigationRevisionDeleteResponse {
109+
pub deleted: bool,
110+
pub previous: NavigationRevisionWithEditContext,
111+
}

wp_api/src/request/endpoint.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ pub mod menu_locations_endpoint;
1111
pub mod nav_menu_item_autosaves_endpoint;
1212
pub mod nav_menu_items_endpoint;
1313
pub mod nav_menus_endpoint;
14+
pub mod navigation_autosaves_endpoint;
15+
pub mod navigation_revisions_endpoint;
1416
pub mod navigations_endpoint;
1517
pub mod plugins_endpoint;
1618
pub mod post_autosaves_endpoint;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use super::{AsNamespace, DerivedRequest, WpNamespace};
2+
use crate::{navigation_revisions::NavigationRevisionId, navigations::NavigationId};
3+
use wp_derive_request_builder::WpDerivedRequest;
4+
5+
#[derive(WpDerivedRequest)]
6+
enum NavigationAutosavesRequest {
7+
#[contextual_get(url = "/navigation/<navigation_id>/autosaves", output = Vec<crate::navigation_revisions::SparseNavigationRevision>, filter_by = crate::navigation_revisions::SparseNavigationRevisionField)]
8+
List,
9+
#[contextual_get(url = "/navigation/<navigation_id>/autosaves/<navigation_revision_id>", output = crate::navigation_revisions::SparseNavigationRevision, filter_by = crate::navigation_revisions::SparseNavigationRevisionField)]
10+
Retrieve,
11+
#[post(url = "/navigation/<navigation_id>/autosaves", params = &crate::navigations::NavigationCreateParams, output = crate::navigation_revisions::NavigationRevisionWithEditContext)]
12+
Create,
13+
}
14+
15+
impl DerivedRequest for NavigationAutosavesRequest {
16+
fn namespace() -> impl AsNamespace {
17+
WpNamespace::WpV2
18+
}
19+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
use super::{AsNamespace, DerivedRequest, WpNamespace};
2+
use crate::{
3+
navigation_revisions::{NavigationRevisionId, NavigationRevisionListParams},
4+
navigations::NavigationId,
5+
};
6+
use wp_derive_request_builder::WpDerivedRequest;
7+
8+
#[derive(WpDerivedRequest)]
9+
enum NavigationRevisionsRequest {
10+
#[contextual_paged(url = "/navigation/<navigation_id>/revisions", params = &NavigationRevisionListParams, output = Vec<crate::navigation_revisions::SparseNavigationRevision>, filter_by = crate::navigation_revisions::SparseNavigationRevisionField)]
11+
List,
12+
#[contextual_get(url = "/navigation/<navigation_id>/revisions/<navigation_revision_id>", output = crate::navigation_revisions::SparseNavigationRevision, filter_by = crate::navigation_revisions::SparseNavigationRevisionField)]
13+
Retrieve,
14+
#[delete(url = "/navigation/<navigation_id>/revisions/<navigation_revision_id>", output = crate::navigation_revisions::NavigationRevisionDeleteResponse)]
15+
Delete,
16+
}
17+
18+
impl DerivedRequest for NavigationRevisionsRequest {
19+
fn namespace() -> impl AsNamespace {
20+
WpNamespace::WpV2
21+
}
22+
23+
fn additional_query_pairs(&self) -> Vec<(&str, String)> {
24+
match self {
25+
NavigationRevisionsRequest::Delete => vec![("force", "true".to_string())],
26+
_ => vec![],
27+
}
28+
}
29+
}
Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
use wp_api::{
2-
post_revisions::PostRevisionId,
3-
posts::{PostCreateParams, PostId},
4-
request::endpoint::posts_endpoint::PostEndpointType,
2+
navigation_revisions::NavigationRevisionId,
3+
navigations::{NavigationCreateParams, NavigationId},
54
};
65
use wp_api_integration_tests::prelude::*;
76

87
#[tokio::test]
98
#[parallel]
109
async fn list_err_post_invalid_parent() {
1110
api_client()
12-
.autosaves()
13-
.list_with_edit_context(&PostEndpointType::Navigation, &PostId(99999999))
11+
.navigation_autosaves()
12+
.list_with_edit_context(&NavigationId(99999999))
1413
.await
1514
.assert_wp_error(WpErrorCode::PostInvalidParent)
1615
}
@@ -19,8 +18,8 @@ async fn list_err_post_invalid_parent() {
1918
#[parallel]
2019
async fn list_err_cannot_read_as_subscriber() {
2120
api_client_as_subscriber()
22-
.autosaves()
23-
.list_with_edit_context(&PostEndpointType::Navigation, &autosaved_navigation_id())
21+
.navigation_autosaves()
22+
.list_with_edit_context(&autosaved_navigation_id())
2423
.await
2524
.assert_wp_error(WpErrorCode::CannotRead)
2625
}
@@ -29,12 +28,8 @@ async fn list_err_cannot_read_as_subscriber() {
2928
#[parallel]
3029
async fn retrieve_err_post_invalid_parent() {
3130
api_client()
32-
.autosaves()
33-
.retrieve_with_edit_context(
34-
&PostEndpointType::Navigation,
35-
&PostId(99999999),
36-
&PostRevisionId(1),
37-
)
31+
.navigation_autosaves()
32+
.retrieve_with_edit_context(&NavigationId(99999999), &NavigationRevisionId(1))
3833
.await
3934
.assert_wp_error(WpErrorCode::PostInvalidParent)
4035
}
@@ -43,11 +38,10 @@ async fn retrieve_err_post_invalid_parent() {
4338
#[parallel]
4439
async fn retrieve_err_post_no_autosave() {
4540
api_client()
46-
.autosaves()
41+
.navigation_autosaves()
4742
.retrieve_with_edit_context(
48-
&PostEndpointType::Navigation,
49-
&PostId(TestCredentials::instance().navigation_id),
50-
&PostRevisionId(1),
43+
&NavigationId(TestCredentials::instance().navigation_id),
44+
&NavigationRevisionId(1),
5145
)
5246
.await
5347
.assert_wp_error(WpErrorCode::PostNoAutosave)
@@ -57,9 +51,8 @@ async fn retrieve_err_post_no_autosave() {
5751
#[parallel]
5852
async fn retrieve_err_cannot_read_as_subscriber() {
5953
api_client_as_subscriber()
60-
.autosaves()
54+
.navigation_autosaves()
6155
.retrieve_with_edit_context(
62-
&PostEndpointType::Navigation,
6356
&autosaved_navigation_id(),
6457
&autosave_id_for_autosaved_navigation_id(),
6558
)
@@ -71,12 +64,8 @@ async fn retrieve_err_cannot_read_as_subscriber() {
7164
#[parallel]
7265
async fn create_err_post_invalid_id() {
7366
api_client()
74-
.autosaves()
75-
.create(
76-
&PostEndpointType::Navigation,
77-
&PostId(99999999),
78-
&PostCreateParams::default(),
79-
)
67+
.navigation_autosaves()
68+
.create(&NavigationId(99999999), &NavigationCreateParams::default())
8069
.await
8170
.assert_wp_error(WpErrorCode::PostInvalidId)
8271
}
@@ -85,20 +74,16 @@ async fn create_err_post_invalid_id() {
8574
#[parallel]
8675
async fn create_err_cannot_edit_as_subscriber() {
8776
api_client_as_subscriber()
88-
.autosaves()
89-
.create(
90-
&PostEndpointType::Navigation,
91-
&autosaved_navigation_id(),
92-
&PostCreateParams::default(),
93-
)
77+
.navigation_autosaves()
78+
.create(&autosaved_navigation_id(), &NavigationCreateParams::default())
9479
.await
9580
.assert_wp_error(WpErrorCode::CannotEdit)
9681
}
9782

98-
fn autosaved_navigation_id() -> PostId {
99-
PostId(TestCredentials::instance().autosaved_navigation_id)
83+
fn autosaved_navigation_id() -> NavigationId {
84+
NavigationId(TestCredentials::instance().autosaved_navigation_id)
10085
}
10186

102-
fn autosave_id_for_autosaved_navigation_id() -> PostRevisionId {
103-
PostRevisionId(TestCredentials::instance().autosave_id_for_autosaved_navigation_id)
87+
fn autosave_id_for_autosaved_navigation_id() -> NavigationRevisionId {
88+
NavigationRevisionId(TestCredentials::instance().autosave_id_for_autosaved_navigation_id)
10489
}

0 commit comments

Comments
 (0)