@@ -20,6 +20,8 @@ use tracing::debug;
20
20
21
21
use crate :: graphql:: models:: { Member , Streak } ;
22
22
23
+ use super :: models:: StreakWithMemberId ;
24
+
23
25
pub async fn fetch_members ( ) -> anyhow:: Result < Vec < Member > > {
24
26
let request_url = std:: env:: var ( "ROOT_URL" ) . context ( "ROOT_URL not found in ENV" ) ?;
25
27
@@ -30,6 +32,7 @@ pub async fn fetch_members() -> anyhow::Result<Vec<Member>> {
30
32
memberId
31
33
name
32
34
discordId
35
+ groupId
33
36
streak {
34
37
currentStreak
35
38
maxStreak
@@ -114,22 +117,33 @@ pub async fn increment_streak(member: &mut Member) -> anyhow::Result<()> {
114
117
. get ( "data" )
115
118
. and_then ( |data| data. get ( "incrementStreak" ) )
116
119
{
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 ;
119
128
120
129
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
+ } ) ;
122
134
} else {
123
135
for streak in & mut member. streak {
124
136
streak. current_streak = current_streak;
125
137
streak. max_streak = max_streak;
126
138
}
127
139
}
128
140
} 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
+ ) ) ;
130
145
}
131
146
132
-
133
147
Ok ( ( ) )
134
148
}
135
149
@@ -199,3 +213,47 @@ pub async fn reset_streak(member: &mut Member) -> anyhow::Result<()> {
199
213
200
214
Ok ( ( ) )
201
215
}
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