@@ -16,10 +16,10 @@ You should have received a copy of the GNU General Public License
1616along with this program. If not, see <https://www.gnu.org/licenses/>.
1717*/
1818use crate :: graphql:: models:: { Member , Streak } ;
19- use anyhow:: Context ;
19+ use anyhow:: { anyhow , Context } ;
2020
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" ) ;
21+ pub async fn fetch_members ( ) -> anyhow :: Result < Vec < Member > > {
22+ let request_url = std:: env:: var ( "ROOT_URL" ) . context ( "ROOT_URL not found in ENV" ) ? ;
2323
2424 let client = reqwest:: Client :: new ( ) ;
2525 let query = r#"
@@ -28,7 +28,6 @@ pub async fn fetch_members() -> Result<Vec<Member>, anyhow::Error> {
2828 memberId
2929 name
3030 discordId
31- groupId
3231 streak {
3332 currentStreak
3433 maxStreak
@@ -43,6 +42,13 @@ pub async fn fetch_members() -> Result<Vec<Member>, anyhow::Error> {
4342 . await
4443 . context ( "Failed to successfully post request" ) ?;
4544
45+ if !response. status ( ) . is_success ( ) {
46+ return Err ( anyhow ! (
47+ "Server responded with an error: {:?}" ,
48+ response. status( )
49+ ) ) ;
50+ }
51+
4652 let response_json: serde_json:: Value = response
4753 . json ( )
4854 . await
@@ -52,7 +58,12 @@ pub async fn fetch_members() -> Result<Vec<Member>, anyhow::Error> {
5258 . get ( "data" )
5359 . and_then ( |data| data. get ( "members" ) )
5460 . and_then ( |members| members. as_array ( ) )
55- . ok_or_else ( || anyhow:: anyhow!( "Malformed response: 'members' field missing or invalid" ) ) ?;
61+ . ok_or_else ( || {
62+ anyhow:: anyhow!(
63+ "Malformed response: Could not access Members from {}" ,
64+ response_json
65+ )
66+ } ) ?;
5667
5768 let members: Vec < Member > = serde_json:: from_value ( serde_json:: Value :: Array ( members. clone ( ) ) )
5869 . context ( "Failed to parse 'members' into Vec<Member>" ) ?;
@@ -61,7 +72,7 @@ pub async fn fetch_members() -> Result<Vec<Member>, anyhow::Error> {
6172}
6273
6374pub async fn increment_streak ( member : & mut Member ) -> anyhow:: Result < ( ) > {
64- let request_url = std:: env:: var ( "ROOT_URL" ) . context ( "ROOT_URL was not found" ) ?;
75+ let request_url = std:: env:: var ( "ROOT_URL" ) . context ( "ROOT_URL was not found in ENV " ) ?;
6576
6677 let client = reqwest:: Client :: new ( ) ;
6778 let mutation = format ! (
@@ -73,12 +84,20 @@ pub async fn increment_streak(member: &mut Member) -> anyhow::Result<()> {
7384 }}"# ,
7485 member. member_id
7586 ) ;
87+
7688 let response = client
7789 . post ( request_url)
7890 . json ( & serde_json:: json!( { "query" : mutation} ) )
7991 . send ( )
8092 . await
81- . context ( "Root Request failed" ) ?;
93+ . context ( "Failed to succesfully post query to Root" ) ?;
94+
95+ if !response. status ( ) . is_success ( ) {
96+ return Err ( anyhow ! (
97+ "Server responded with an error: {:?}" ,
98+ response. status( )
99+ ) ) ;
100+ }
82101
83102 // Handle the streak vector
84103 if member. streak . is_empty ( ) {
@@ -101,7 +120,7 @@ pub async fn increment_streak(member: &mut Member) -> anyhow::Result<()> {
101120}
102121
103122pub async fn reset_streak ( member : & mut Member ) -> anyhow:: Result < ( ) > {
104- let request_url = std:: env:: var ( "ROOT_URL" ) . context ( "ROOT_URL was not found" ) ?;
123+ let request_url = std:: env:: var ( "ROOT_URL" ) . context ( "ROOT_URL was not found in the ENV " ) ?;
105124
106125 let client = reqwest:: Client :: new ( ) ;
107126 let mutation = format ! (
@@ -120,34 +139,50 @@ pub async fn reset_streak(member: &mut Member) -> anyhow::Result<()> {
120139 . json ( & serde_json:: json!( { "query" : mutation } ) )
121140 . send ( )
122141 . await
123- . context ( "Root Request failed" ) ?;
142+ . context ( "Failed to succesfully post query to Root" ) ?;
143+
144+ if !response. status ( ) . is_success ( ) {
145+ return Err ( anyhow ! (
146+ "Server responded with an error: {:?}" ,
147+ response. status( )
148+ ) ) ;
149+ }
124150
125151 let response_json: serde_json:: Value = response
126152 . json ( )
127153 . await
128154 . context ( "Failed to parse response JSON" ) ?;
155+
129156 if let Some ( data) = response_json
130157 . get ( "data" )
131158 . and_then ( |data| data. get ( "resetStreak" ) )
132159 {
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 ( ) ;
160+ let current_streak =
161+ data. get ( "currentStreak" )
162+ . and_then ( |v| v. as_i64 ( ) )
163+ . ok_or_else ( || anyhow ! ( "current_streak was parsed as None" ) ) ? as i32 ;
164+ let max_streak =
165+ data. get ( "maxStreak" )
166+ . and_then ( |v| v. as_i64 ( ) )
167+ . ok_or_else ( || anyhow ! ( "max_streak was parsed as None" ) ) ? as i32 ;
136168
137169 // Update the member's streak vector
138170 if member. streak . is_empty ( ) {
139171 // If the streak vector is empty, initialize it with the returned values
140172 member. streak . push ( Streak {
141- current_streak : current_streak as i32 ,
142- max_streak : max_streak as i32 ,
173+ current_streak,
174+ max_streak,
143175 } ) ;
144176 } else {
145177 // Otherwise, update the first streak entry
146178 for streak in & mut member. streak {
147- streak. current_streak = current_streak as i32 ;
148- streak. max_streak = max_streak as i32 ;
179+ streak. current_streak = current_streak;
180+ streak. max_streak = max_streak;
149181 }
150182 }
183+ } else {
184+ return Err ( anyhow ! ( "Failed to access data from {}" , response_json) ) ;
151185 }
186+
152187 Ok ( ( ) )
153188}
0 commit comments