mangadex_api/v5/settings/
post.rs1use std::collections::HashMap;
37
38use derive_builder::Builder;
39use mangadex_api_types::MangaDexDateTime;
42use serde::Serialize;
43
44use crate::HttpClientRef;
45
46#[cfg_attr(
52 feature = "deserializable-endpoint",
53 derive(serde::Deserialize, getset::Getters, getset::Setters)
54)]
55#[derive(Debug, Serialize, Clone, Builder)]
56#[serde(rename_all = "camelCase")]
57#[builder(
58 setter(into, strip_option),
59 build_fn(error = "mangadex_api_types::error::BuilderError")
60)]
61#[cfg_attr(feature = "non_exhaustive", non_exhaustive)]
62pub struct CreateOrUpdateUserSettings {
63 #[doc(hidden)]
65 #[serde(skip)]
66 #[builder(pattern = "immutable")]
67 #[allow(unused)]
68 #[cfg_attr(feature = "deserializable-endpoint", getset(set = "pub", get = "pub"))]
69 pub http_client: HttpClientRef,
70
71 #[builder(default)]
73 pub settings: HashMap<String, String>,
74 #[builder(default)]
75 pub updated_at: MangaDexDateTime,
76}
77
78endpoint! {
79 POST "/settings",
80 #[body auth] CreateOrUpdateUserSettings,
81 #[flatten_result] mangadex_api_schema::v5::UserSettingsResponse,
82 CreateOrUpdateUserSettingsBuilder
83}
84
85#[cfg(test)]
86mod tests {
87 use serde_json::json;
88 use url::Url;
89 use uuid::Uuid;
90 use wiremock::matchers::{header, method, path};
91 use wiremock::{Mock, MockServer, ResponseTemplate};
92
93 use crate::{HttpClient, MangaDexClient};
94 use mangadex_api_types::error::Error;
95
96 #[tokio::test]
97 async fn create_or_update_user_settings_requires_auth() -> anyhow::Result<()> {
98 let mock_server = MockServer::start().await;
99 let http_client: HttpClient = HttpClient::builder()
100 .base_url(Url::parse(&mock_server.uri())?)
101 .build()?;
102 let mangadex_client = MangaDexClient::new_with_http_client(http_client);
103
104 let error_id = Uuid::new_v4();
105 let response_body = json!({
106 "result": "error",
107 "errors": [{
108 "id": error_id.to_string(),
109 "status": 403,
110 "title": "Forbidden",
111 "detail": "You must be logged in to continue."
112 }]
113 });
114
115 Mock::given(method("POST"))
116 .and(path("/settings"))
117 .and(header("Content-Type", "application/json"))
118 .respond_with(ResponseTemplate::new(403).set_body_json(response_body))
119 .expect(0)
120 .mount(&mock_server)
121 .await;
122
123 let res = mangadex_client
124 .settings()
125 .post()
126 .send()
127 .await
128 .expect_err("expected error");
129
130 match res {
131 Error::MissingTokens => {}
132 _ => panic!("unexpected error: {:#?}", res),
133 }
134
135 Ok(())
136 }
137}