Skip to content

Commit 949ec3a

Browse files
committed
refactor: move queries and mutations to methods on client
Following OOPS principles, it would be more convenient for the user and developer to use the GraphQL interface if both data and methods were encapsulated into the struct itself. Signed-off-by: Ivin Joel Abraham <[email protected]>
1 parent 8d55bdb commit 949ec3a

File tree

6 files changed

+233
-218
lines changed

6 files changed

+233
-218
lines changed

src/graphql/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,8 @@ impl GraphQLClient {
4040
pub fn root_url(&self) -> &str {
4141
&self.root_url
4242
}
43+
44+
pub fn http(&self) -> Client {
45+
self.http.clone()
46+
}
4347
}

src/graphql/mutations.rs

Lines changed: 106 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -8,136 +8,142 @@ use crate::graphql::models::Streak;
88
use super::models::Member;
99
use super::GraphQLClient;
1010

11-
#[instrument(level = "debug")]
12-
pub async fn increment_streak(member: &mut Member, client: GraphQLClient) -> anyhow::Result<()> {
13-
let mutation = format!(
14-
r#"
11+
impl GraphQLClient {
12+
#[instrument(level = "debug")]
13+
pub async fn increment_streak(&self, member: &mut Member) -> anyhow::Result<()> {
14+
let mutation = format!(
15+
r#"
1516
mutation {{
1617
incrementStreak(input: {{ memberId: {} }}) {{
1718
currentStreak
1819
maxStreak
1920
}}
2021
}}"#,
21-
member.member_id
22-
);
22+
member.member_id
23+
);
2324

24-
debug!("Sending mutation {}", mutation);
25-
let response = client
26-
.http
27-
.post(client.root_url())
28-
.json(&serde_json::json!({"query": mutation}))
29-
.send()
30-
.await
31-
.context("Failed to succesfully post query to Root")?;
25+
debug!("Sending mutation {}", mutation);
26+
let response = self
27+
.http()
28+
.post(self.root_url())
29+
.json(&serde_json::json!({"query": mutation}))
30+
.send()
31+
.await
32+
.context("Failed to succesfully post query to Root")?;
3233

33-
if !response.status().is_success() {
34-
return Err(anyhow!(
35-
"Server responded with an error: {:?}",
36-
response.status()
37-
));
38-
}
39-
let response_json: serde_json::Value = response
40-
.json()
41-
.await
42-
.context("Failed to parse response JSON")?;
43-
debug!("Response: {}", response_json);
34+
if !response.status().is_success() {
35+
return Err(anyhow!(
36+
"Server responded with an error: {:?}",
37+
response.status()
38+
));
39+
}
40+
let response_json: serde_json::Value = response
41+
.json()
42+
.await
43+
.context("Failed to parse response JSON")?;
44+
debug!("Response: {}", response_json);
4445

45-
if let Some(data) = response_json
46-
.get("data")
47-
.and_then(|data| data.get("incrementStreak"))
48-
{
49-
let current_streak =
50-
data.get("currentStreak")
46+
if let Some(data) = response_json
47+
.get("data")
48+
.and_then(|data| data.get("incrementStreak"))
49+
{
50+
let current_streak = data
51+
.get("currentStreak")
5152
.and_then(|v| v.as_i64())
52-
.ok_or_else(|| anyhow!("current_streak was parsed as None"))? as i32;
53-
let max_streak =
54-
data.get("maxStreak")
53+
.ok_or_else(|| anyhow!("current_streak was parsed as None"))?
54+
as i32;
55+
let max_streak = data
56+
.get("maxStreak")
5557
.and_then(|v| v.as_i64())
56-
.ok_or_else(|| anyhow!("max_streak was parsed as None"))? as i32;
58+
.ok_or_else(|| anyhow!("max_streak was parsed as None"))?
59+
as i32;
5760

58-
if member.streak.is_empty() {
59-
member.streak.push(Streak {
60-
current_streak,
61-
max_streak,
62-
});
63-
} else {
64-
for streak in &mut member.streak {
65-
streak.current_streak = current_streak;
66-
streak.max_streak = max_streak;
61+
if member.streak.is_empty() {
62+
member.streak.push(Streak {
63+
current_streak,
64+
max_streak,
65+
});
66+
} else {
67+
for streak in &mut member.streak {
68+
streak.current_streak = current_streak;
69+
streak.max_streak = max_streak;
70+
}
6771
}
72+
} else {
73+
return Err(anyhow!(
74+
"Failed to access data from response: {}",
75+
response_json
76+
));
6877
}
69-
} else {
70-
return Err(anyhow!(
71-
"Failed to access data from response: {}",
72-
response_json
73-
));
74-
}
7578

76-
Ok(())
77-
}
79+
Ok(())
80+
}
7881

79-
#[instrument(level = "debug")]
80-
pub async fn reset_streak(member: &mut Member, client: GraphQLClient) -> anyhow::Result<()> {
81-
let mutation = format!(
82-
r#"
82+
#[instrument(level = "debug")]
83+
pub async fn reset_streak(&self, member: &mut Member) -> anyhow::Result<()> {
84+
let mutation = format!(
85+
r#"
8386
mutation {{
8487
resetStreak(input: {{ memberId: {} }}) {{
8588
currentStreak
8689
maxStreak
8790
}}
8891
}}"#,
89-
member.member_id
90-
);
92+
member.member_id
93+
);
9194

92-
debug!("Sending mutation {}", mutation);
93-
let response = client
94-
.http
95-
.post(client.root_url())
96-
.json(&serde_json::json!({ "query": mutation }))
97-
.send()
98-
.await
99-
.context("Failed to succesfully post query to Root")?;
95+
debug!("Sending mutation {}", mutation);
96+
let response = self
97+
.http()
98+
.post(self.root_url())
99+
.json(&serde_json::json!({ "query": mutation }))
100+
.send()
101+
.await
102+
.context("Failed to succesfully post query to Root")?;
100103

101-
if !response.status().is_success() {
102-
return Err(anyhow!(
103-
"Server responded with an error: {:?}",
104-
response.status()
105-
));
106-
}
104+
if !response.status().is_success() {
105+
return Err(anyhow!(
106+
"Server responded with an error: {:?}",
107+
response.status()
108+
));
109+
}
107110

108-
let response_json: serde_json::Value = response
109-
.json()
110-
.await
111-
.context("Failed to parse response JSON")?;
112-
debug!("Response: {}", response_json);
111+
let response_json: serde_json::Value = response
112+
.json()
113+
.await
114+
.context("Failed to parse response JSON")?;
115+
debug!("Response: {}", response_json);
113116

114-
if let Some(data) = response_json
115-
.get("data")
116-
.and_then(|data| data.get("resetStreak"))
117-
{
118-
let current_streak =
119-
data.get("currentStreak")
117+
if let Some(data) = response_json
118+
.get("data")
119+
.and_then(|data| data.get("resetStreak"))
120+
{
121+
let current_streak = data
122+
.get("currentStreak")
120123
.and_then(|v| v.as_i64())
121-
.ok_or_else(|| anyhow!("current_streak was parsed as None"))? as i32;
122-
let max_streak =
123-
data.get("maxStreak")
124+
.ok_or_else(|| anyhow!("current_streak was parsed as None"))?
125+
as i32;
126+
let max_streak = data
127+
.get("maxStreak")
124128
.and_then(|v| v.as_i64())
125-
.ok_or_else(|| anyhow!("max_streak was parsed as None"))? as i32;
129+
.ok_or_else(|| anyhow!("max_streak was parsed as None"))?
130+
as i32;
126131

127-
if member.streak.is_empty() {
128-
member.streak.push(Streak {
129-
current_streak,
130-
max_streak,
131-
});
132-
} else {
133-
for streak in &mut member.streak {
134-
streak.current_streak = current_streak;
135-
streak.max_streak = max_streak;
132+
if member.streak.is_empty() {
133+
member.streak.push(Streak {
134+
current_streak,
135+
max_streak,
136+
});
137+
} else {
138+
for streak in &mut member.streak {
139+
streak.current_streak = current_streak;
140+
streak.max_streak = max_streak;
141+
}
136142
}
143+
} else {
144+
return Err(anyhow!("Failed to access data from {}", response_json));
137145
}
138-
} else {
139-
return Err(anyhow!("Failed to access data from {}", response_json));
140-
}
141146

142-
Ok(())
147+
Ok(())
148+
}
143149
}

0 commit comments

Comments
 (0)