Skip to content

Commit d877698

Browse files
committed
refactor status update task
Signed-off-by: Ivin Joel Abraham <ivinjabraham@gmail.com>
1 parent 29a1767 commit d877698

File tree

3 files changed

+283
-292
lines changed

3 files changed

+283
-292
lines changed

src/graphql/models.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
1717
*/
1818
use serde::Deserialize;
1919

20+
#[derive(Clone, Debug, Deserialize)]
21+
pub struct StreakWithMemberId {
22+
#[serde(rename = "memberId")]
23+
pub member_id: i32,
24+
#[serde(rename = "currentStreak")]
25+
pub current_streak: i32,
26+
#[serde(rename = "maxStreak")]
27+
pub max_streak: i32,
28+
}
29+
2030
#[derive(Clone, Debug, Deserialize)]
2131
pub struct Streak {
2232
#[serde(rename = "currentStreak")]
@@ -32,6 +42,8 @@ pub struct Member {
3242
pub name: String,
3343
#[serde(rename = "discordId")]
3444
pub discord_id: String,
45+
#[serde(rename = "groupId")]
46+
pub group_id: i32,
3547
#[serde(default)]
3648
pub streak: Vec<Streak>, // Note that Root will NOT have multiple Streak elements but it may be an empty list which is why we use a vector here
3749
}

src/graphql/queries.rs

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ use tracing::debug;
2020

2121
use crate::graphql::models::{Member, Streak};
2222

23+
use super::models::StreakWithMemberId;
24+
2325
pub async fn fetch_members() -> anyhow::Result<Vec<Member>> {
2426
let request_url = std::env::var("ROOT_URL").context("ROOT_URL not found in ENV")?;
2527

@@ -30,6 +32,7 @@ pub async fn fetch_members() -> anyhow::Result<Vec<Member>> {
3032
memberId
3133
name
3234
discordId
35+
groupId
3336
streak {
3437
currentStreak
3538
maxStreak
@@ -114,22 +117,33 @@ pub async fn increment_streak(member: &mut Member) -> anyhow::Result<()> {
114117
.get("data")
115118
.and_then(|data| data.get("incrementStreak"))
116119
{
117-
let current_streak = data.get("currentStreak").and_then(|v| v.as_i64()).ok_or_else(|| anyhow!("current_streak was parsed as None"))? as i32;
118-
let max_streak = data.get("maxStreak").and_then(|v| v.as_i64()).ok_or_else(|| anyhow!("max_streak was parsed as None"))? as i32;
120+
let current_streak =
121+
data.get("currentStreak")
122+
.and_then(|v| v.as_i64())
123+
.ok_or_else(|| anyhow!("current_streak was parsed as None"))? as i32;
124+
let max_streak =
125+
data.get("maxStreak")
126+
.and_then(|v| v.as_i64())
127+
.ok_or_else(|| anyhow!("max_streak was parsed as None"))? as i32;
119128

120129
if member.streak.is_empty() {
121-
member.streak.push(Streak { current_streak, max_streak });
130+
member.streak.push(Streak {
131+
current_streak,
132+
max_streak,
133+
});
122134
} else {
123135
for streak in &mut member.streak {
124136
streak.current_streak = current_streak;
125137
streak.max_streak = max_streak;
126138
}
127139
}
128140
} else {
129-
return Err(anyhow!("Failed to access data from response: {}", response_json));
141+
return Err(anyhow!(
142+
"Failed to access data from response: {}",
143+
response_json
144+
));
130145
}
131146

132-
133147
Ok(())
134148
}
135149

@@ -199,3 +213,47 @@ pub async fn reset_streak(member: &mut Member) -> anyhow::Result<()> {
199213

200214
Ok(())
201215
}
216+
217+
pub async fn fetch_streaks() -> anyhow::Result<Vec<StreakWithMemberId>> {
218+
let request_url = std::env::var("ROOT_URL").context("ROOT_URL not found in ENV")?;
219+
220+
let client = reqwest::Client::new();
221+
let query = r#"
222+
{
223+
streaks {
224+
memberId
225+
currentStreak
226+
maxStreak
227+
}
228+
}
229+
"#;
230+
231+
debug!("Sending query {}", query);
232+
let response = client
233+
.post(request_url)
234+
.json(&serde_json::json!({"query": query}))
235+
.send()
236+
.await
237+
.context("Failed to successfully post request")?;
238+
239+
if !response.status().is_success() {
240+
return Err(anyhow!(
241+
"Server responded with an error: {:?}",
242+
response.status()
243+
));
244+
}
245+
246+
let response_json: serde_json::Value = response
247+
.json()
248+
.await
249+
.context("Failed to serialize response")?;
250+
251+
debug!("Response: {}", response_json);
252+
let streaks = response_json
253+
.get("data")
254+
.and_then(|data| data.get("streaks"))
255+
.and_then(|streaks| serde_json::from_value::<Vec<StreakWithMemberId>>(streaks.clone()).ok())
256+
.context("Failed to parse streaks data")?;
257+
258+
Ok(streaks)
259+
}

0 commit comments

Comments
 (0)