mangadex_api/v5/user/id/
get.rs

1//! Builder for the user view endpoint.
2//!
3//! <https://api.mangadex.org/docs/swagger.html#/User/get-user-id>
4//!
5//! # Examples
6//!
7//! ```rust
8//! use uuid::Uuid;
9//!
10//! use mangadex_api::MangaDexClient;
11//! use mangadex_api_types::{Password, Username};
12//!
13//! # async fn run() -> anyhow::Result<()> {
14//! let client = MangaDexClient::default();
15//!
16//! let user_id = Uuid::new_v4();
17//!
18//! let user_res = client
19//!     .user()
20//!     .id(user_id)
21//!     .get()
22//!     .send()
23//!     .await?;
24//!
25//! println!("user view: {:?}", user_res);
26//! # Ok(())
27//! # }
28//! ```
29
30use derive_builder::Builder;
31use serde::Serialize;
32use uuid::Uuid;
33
34use crate::HttpClientRef;
35use mangadex_api_schema::v5::UserResponse;
36
37#[cfg_attr(
38    feature = "deserializable-endpoint",
39    derive(serde::Deserialize, getset::Getters, getset::Setters)
40)]
41#[derive(Debug, Serialize, Clone, Builder)]
42#[serde(rename_all = "camelCase")]
43#[builder(
44    setter(into, strip_option),
45    build_fn(error = "mangadex_api_types::error::BuilderError")
46)]
47pub struct GetUser {
48    /// This should never be set manually as this is only for internal use.
49    #[doc(hidden)]
50    #[serde(skip)]
51    #[builder(pattern = "immutable")]
52    #[cfg_attr(feature = "deserializable-endpoint", getset(set = "pub", get = "pub"))]
53    pub http_client: HttpClientRef,
54
55    #[serde(skip_serializing)]
56    pub user_id: Uuid,
57}
58
59endpoint! {
60    GET ("/user/{}", user_id),
61    #[query] GetUser,
62    #[flatten_result] UserResponse,
63    GetUserBuilder
64}
65
66#[cfg(test)]
67mod tests {
68    use serde_json::json;
69    use url::Url;
70    use uuid::Uuid;
71    use wiremock::matchers::{method, path_regex};
72    use wiremock::{Mock, MockServer, ResponseTemplate};
73
74    use crate::{HttpClient, MangaDexClient};
75
76    #[tokio::test]
77    async fn get_user_fires_a_request_to_base_url() -> anyhow::Result<()> {
78        let mock_server = MockServer::start().await;
79        let http_client = HttpClient::builder()
80            .base_url(Url::parse(&mock_server.uri())?)
81            .build()?;
82        let mangadex_client = MangaDexClient::new_with_http_client(http_client);
83
84        let user_id = Uuid::new_v4();
85        let response_body = json!({
86            "result": "ok",
87            "response": "entity",
88            "data": {
89                "id": user_id,
90                "type": "user",
91                "attributes": {
92                    "username": "myusername",
93                    "roles": [
94                        "ROLE_MEMBER",
95                        "ROLE_GROUP_MEMBER",
96                        "ROLE_GROUP_LEADER"
97                    ],
98                    "version": 1,
99                },
100                "relationships": [
101                    {
102                        "id": "a3219a4f-73c0-4213-8730-05985130539a",
103                        "type": "scanlation_group"
104                    }
105                ]
106            }
107        });
108
109        Mock::given(method("GET"))
110            .and(path_regex(r"/user/[0-9a-fA-F-]+"))
111            .respond_with(ResponseTemplate::new(200).set_body_json(response_body))
112            .expect(1)
113            .mount(&mock_server)
114            .await;
115
116        let _ = mangadex_client.user().id(user_id).get().send().await?;
117
118        Ok(())
119    }
120}