@@ -7,7 +7,7 @@ use serde_json::Value;
77use sqlx:: PgPool ;
88use utoipa:: ToSchema ;
99
10- use anyhow:: { bail , Context , Result } ;
10+ use anyhow:: { anyhow , Context , Result } ;
1111
1212use crate :: { database, Language } ;
1313
@@ -50,7 +50,7 @@ fn load_cached(language: &Language, uid: i32) -> Result<Option<Mihomo>> {
5050 }
5151}
5252
53- async fn fetch_json ( url : & str , uid : i32 , language : Language , label : & str ) -> Result < Value > {
53+ async fn fetch_json ( url : & str , uid : i32 , language : Language , label : & str ) -> Result < Option < Value > > {
5454 let response = reqwest:: get ( url)
5555 . await
5656 . with_context ( || format ! ( "{label} request failed for uid {uid} language {language}" ) ) ?;
@@ -67,18 +67,16 @@ async fn fetch_json(url: &str, uid: i32, language: Language, label: &str) -> Res
6767 label,
6868 "response was not successful"
6969 ) ;
70- bail ! (
71- "{label} request returned non-success status {status} for uid {uid} language {language}"
72- ) ;
70+ return Ok ( None ) ;
7371 }
7472
7573 let text = response
7674 . text ( )
7775 . await
78- . with_context ( || format ! ( "mihomo {label} body read failed for uid {uid} language {language}" ) ) ?;
76+ . with_context ( || format ! ( "{label} response text retrieval failed for uid {uid} language {language}" ) ) ?;
7977
8078 match serde_json:: from_str ( & text) {
81- Ok ( json) => Ok ( json) ,
79+ Ok ( json) => Ok ( Some ( json) ) ,
8280 Err ( err) => {
8381 warn ! (
8482 uid,
@@ -90,16 +88,14 @@ async fn fetch_json(url: &str, uid: i32, language: Language, label: &str) -> Res
9088 error = %err,
9189 "response decode failed"
9290 ) ;
93- Err ( err) . with_context ( || {
94- format ! (
95- "{label} json decode failed for uid {uid} language {language} status {status}"
96- )
91+ Err ( anyhow ! ( "mihomo response body parsing failed" ) ) . with_context ( || {
92+ format ! ( "{label} json decode failed for uid {uid} language {language}" )
9793 } )
9894 }
9995 }
10096}
10197
102- pub async fn get ( uid : i32 , language : Language , pool : & PgPool ) -> Result < Value > {
98+ pub async fn get ( uid : i32 , language : Language , pool : & PgPool ) -> Result < Option < Value > > {
10399 let path = cache_path ( & language, uid) ;
104100
105101 if PathBuf :: from ( & path) . exists ( ) {
@@ -119,30 +115,27 @@ pub async fn get(uid: i32, language: Language, pool: &PgPool) -> Result<Value> {
119115 if should_update {
120116 update_and_get ( uid, language, pool) . await
121117 } else {
122- Ok ( cached_json)
118+ Ok ( Some ( cached_json) )
123119 }
124120 } else {
125121 update_and_get ( uid, language, pool) . await
126122 }
127123}
128124
129- pub async fn update_and_get ( uid : i32 , language : Language , pool : & PgPool ) -> Result < Value > {
125+ pub async fn update_and_get ( uid : i32 , language : Language , pool : & PgPool ) -> Result < Option < Value > > {
130126 let now = Utc :: now ( ) ;
131127 debug ! ( uid, language = %language, "mihomo update_and_get start" ) ;
132128
133129 let url = format ! (
134130 "https://api.mihomo.me/sr_info_parsed/{uid}?lang={}&version=v2" ,
135131 language. mihomo( )
136132 ) ;
137- debug ! ( uid, language = %language, url = %url, "fetching mihomo payload" ) ;
138133
139- let mut json: Value = match fetch_json ( & url, uid, language, "localized" ) . await {
140- Ok ( json) => json,
141- Err ( err) => {
142- warn ! ( uid, language = %language, url = %url, error = %err, "mihomo localized fetch failed" ) ;
143- return Err ( err) ;
144- }
134+ let mut json = match fetch_json ( & url, uid, language, "localized" ) . await ? {
135+ Some ( json) => json,
136+ None => return Ok ( None ) ,
145137 } ;
138+
146139 debug ! ( uid, language = %language, "fetched mihomo payload" ) ;
147140 if let Some ( o) = json. as_object_mut ( ) {
148141 o. insert ( "updated_at" . to_string ( ) , serde_json:: to_value ( now) ?) ;
@@ -155,13 +148,11 @@ pub async fn update_and_get(uid: i32, language: Language, pool: &PgPool) -> Resu
155148 let en_url = format ! ( "https://api.mihomo.me/sr_info_parsed/{uid}?lang=en&version=v2" , ) ;
156149 debug ! ( uid, language = %language, url = %en_url, "fetching english mihomo payload" ) ;
157150
158- let mut en_json: Value = match fetch_json ( & en_url, uid, language, "english" ) . await {
159- Ok ( json) => json,
160- Err ( err) => {
161- warn ! ( uid, language = %language, url = %en_url, error = %err, "mihomo english fetch failed" ) ;
162- return Err ( err) ;
163- }
151+ let mut en_json = match fetch_json ( & en_url, uid, language, "english" ) . await ? {
152+ Some ( json) => json,
153+ None => return Ok ( None ) ,
164154 } ;
155+
165156 debug ! ( uid, language = %language, "fetched english mihomo payload" ) ;
166157 if let Some ( o) = en_json. as_object_mut ( ) {
167158 o. insert ( "updated_at" . to_string ( ) , serde_json:: to_value ( now) ?) ;
@@ -252,5 +243,5 @@ pub async fn update_and_get(uid: i32, language: Language, pool: &PgPool) -> Resu
252243 database:: achievement_scores:: set ( & db_score_achievement, pool) . await ?;
253244 debug ! ( uid, language = %language, timestamp = %timestamp, "mihomo update_and_get complete" ) ;
254245
255- Ok ( json)
246+ Ok ( Some ( json) )
256247}
0 commit comments