@@ -20,6 +20,8 @@ use tracing::debug;
2020
2121use crate :: graphql:: models:: { Member , Streak } ;
2222
23+ use super :: models:: StreakWithMemberId ;
24+
2325pub 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