@@ -15,37 +15,139 @@ GNU General Public License for more details.
1515You should have received a copy of the GNU General Public License
1616along with this program. If not, see <https://www.gnu.org/licenses/>.
1717*/
18- use serde_json:: Value ;
18+ use crate :: graphql:: models:: { Member , Streak } ;
19+ use anyhow:: Context ;
1920
20- use super :: models:: Member ;
21+ pub async fn fetch_members ( ) -> Result < Vec < Member > , anyhow:: Error > {
22+ let request_url = std:: env:: var ( "ROOT_URL" ) . expect ( "ROOT_URL not found" ) ;
2123
22- const REQUEST_URL : & str = "https://root.shuttleapp.rs/" ;
23-
24- pub async fn fetch_members ( ) -> Result < Vec < String > , reqwest:: Error > {
2524 let client = reqwest:: Client :: new ( ) ;
2625 let query = r#"
27- query {
28- getMember {
29- name,
30- groupId,
26+ {
27+ members {
28+ memberId
29+ name
3130 discordId
31+ groupId
32+ streak {
33+ currentStreak
34+ maxStreak
35+ }
3236 }
3337 }"# ;
3438
3539 let response = client
36- . post ( REQUEST_URL )
40+ . post ( request_url )
3741 . json ( & serde_json:: json!( { "query" : query} ) )
3842 . send ( )
39- . await ?;
43+ . await
44+ . context ( "Failed to successfully post request" ) ?;
45+
46+ let response_json: serde_json:: Value = response
47+ . json ( )
48+ . await
49+ . context ( "Failed to serialize response" ) ?;
50+
51+ let members = response_json
52+ . get ( "data" )
53+ . and_then ( |data| data. get ( "members" ) )
54+ . and_then ( |members| members. as_array ( ) )
55+ . ok_or_else ( || anyhow:: anyhow!( "Malformed response: 'members' field missing or invalid" ) ) ?;
56+
57+ let members: Vec < Member > = serde_json:: from_value ( serde_json:: Value :: Array ( members. clone ( ) ) )
58+ . context ( "Failed to parse 'members' into Vec<Member>" ) ?;
59+
60+ Ok ( members)
61+ }
62+
63+ pub async fn increment_streak ( member : & mut Member ) -> anyhow:: Result < ( ) > {
64+ let request_url = std:: env:: var ( "ROOT_URL" ) . context ( "ROOT_URL was not found" ) ?;
65+
66+ let client = reqwest:: Client :: new ( ) ;
67+ let mutation = format ! (
68+ r#"
69+ mutation {{
70+ incrementStreak(input: {{ memberId: {} }}) {{
71+ currentStreak
72+ }}
73+ }}"# ,
74+ member. member_id
75+ ) ;
76+ let response = client
77+ . post ( request_url)
78+ . json ( & serde_json:: json!( { "query" : mutation} ) )
79+ . send ( )
80+ . await
81+ . context ( "Root Request failed" ) ?;
4082
41- let json: Value = response. json ( ) . await ?;
83+ // Handle the streak vector
84+ if member. streak . is_empty ( ) {
85+ // If the streak vector is empty, add a new Streak object with both values set to 1
86+ member. streak . push ( Streak {
87+ current_streak : 1 ,
88+ max_streak : 1 ,
89+ } ) ;
90+ } else {
91+ // Otherwise, increment the current_streak for each Streak and update max_streak if necessary
92+ for streak in & mut member. streak {
93+ streak. current_streak += 1 ;
94+ if streak. current_streak > streak. max_streak {
95+ streak. max_streak = streak. current_streak ;
96+ }
97+ }
98+ }
99+
100+ Ok ( ( ) )
101+ }
42102
43- let member_names: Vec < String > = json[ "data" ] [ "getMember" ]
44- . as_array ( )
45- . unwrap ( )
46- . iter ( )
47- . map ( Member )
48- . collect ( ) ;
103+ pub async fn reset_streak ( member : & mut Member ) -> anyhow:: Result < ( ) > {
104+ let request_url = std:: env:: var ( "ROOT_URL" ) . context ( "ROOT_URL was not found" ) ?;
49105
50- Ok ( member_names)
106+ let client = reqwest:: Client :: new ( ) ;
107+ let mutation = format ! (
108+ r#"
109+ mutation {{
110+ resetStreak(input: {{ memberId: {} }}) {{
111+ currentStreak
112+ maxStreak
113+ }}
114+ }}"# ,
115+ member. member_id
116+ ) ;
117+
118+ let response = client
119+ . post ( & request_url)
120+ . json ( & serde_json:: json!( { "query" : mutation } ) )
121+ . send ( )
122+ . await
123+ . context ( "Root Request failed" ) ?;
124+
125+ let response_json: serde_json:: Value = response
126+ . json ( )
127+ . await
128+ . context ( "Failed to parse response JSON" ) ?;
129+ if let Some ( data) = response_json
130+ . get ( "data" )
131+ . and_then ( |data| data. get ( "resetStreak" ) )
132+ {
133+ let current_streak = data. get ( "currentStreak" ) . and_then ( |v| v. as_i64 ( ) ) . unwrap ( ) ;
134+
135+ let max_streak = data. get ( "maxStreak" ) . and_then ( |v| v. as_i64 ( ) ) . unwrap ( ) ;
136+
137+ // Update the member's streak vector
138+ if member. streak . is_empty ( ) {
139+ // If the streak vector is empty, initialize it with the returned values
140+ member. streak . push ( Streak {
141+ current_streak : current_streak as i32 ,
142+ max_streak : max_streak as i32 ,
143+ } ) ;
144+ } else {
145+ // Otherwise, update the first streak entry
146+ for streak in & mut member. streak {
147+ streak. current_streak = current_streak as i32 ;
148+ streak. max_streak = max_streak as i32 ;
149+ }
150+ }
151+ }
152+ Ok ( ( ) )
51153}
0 commit comments