@@ -142,38 +142,42 @@ object MandiApiService {
142142
143143 // PATH 1: Try backend Redis cache (ultra-fast)
144144 try {
145- val stateEnc = URLEncoder .encode(state.trim(), " UTF-8" )
146- val commEnc = URLEncoder .encode(commodity.trim(), " UTF-8" )
147- val url = " $BACKEND_URL ?state=$stateEnc &commodity=$commEnc "
148- val request = Request .Builder ().url(url).build()
149-
150- val responseBody = client.newCall(request).execute().use { response ->
151- if (response.isSuccessful) response.body?.string() else null
152- }
153-
154- if (! responseBody.isNullOrBlank()) {
155- val root = json.parseToJsonElement(responseBody).jsonObject
156- val recordsArray = root[" records" ]?.jsonArray
157- if (recordsArray != null ) {
158- val records = recordsArray.mapNotNull { el ->
159- runCatching {
160- val obj = el.jsonObject
161- MandiRecord (
162- state = obj[" state" ]?.jsonPrimitive?.content ? : " " ,
163- district = obj[" district" ]?.jsonPrimitive?.content ? : " " ,
164- market = obj[" market" ]?.jsonPrimitive?.content ? : " " ,
165- commodity = obj[" commodity" ]?.jsonPrimitive?.content ? : " " ,
166- variety = obj[" variety" ]?.jsonPrimitive?.content ? : " " ,
167- minPrice = obj[" minPrice" ]?.jsonPrimitive?.doubleOrNull ? : 0.0 ,
168- maxPrice = obj[" maxPrice" ]?.jsonPrimitive?.doubleOrNull ? : 0.0 ,
169- modalPrice = obj[" modalPrice" ]?.jsonPrimitive?.doubleOrNull ? : 0.0 ,
170- arrivalDate = obj[" arrivalDate" ]?.jsonPrimitive?.content ? : " "
171- )
172- }.getOrNull()
145+ val backendResult = kotlinx.coroutines.withTimeoutOrNull(1000L ) {
146+ val stateEnc = URLEncoder .encode(state.trim(), " UTF-8" )
147+ val commEnc = URLEncoder .encode(commodity.trim(), " UTF-8" )
148+ val url = " $BACKEND_URL ?state=$stateEnc &commodity=$commEnc "
149+ val request = Request .Builder ().url(url).build()
150+
151+ val responseBody = client.newCall(request).execute().use { response ->
152+ if (response.isSuccessful) response.body?.string() else null
153+ }
154+
155+ if (! responseBody.isNullOrBlank()) {
156+ val root = json.parseToJsonElement(responseBody).jsonObject
157+ val recordsArray = root[" records" ]?.jsonArray
158+ if (recordsArray != null ) {
159+ val records = recordsArray.mapNotNull { el ->
160+ runCatching {
161+ val obj = el.jsonObject
162+ MandiRecord (
163+ state = obj[" state" ]?.jsonPrimitive?.content ? : " " ,
164+ district = obj[" district" ]?.jsonPrimitive?.content ? : " " ,
165+ market = obj[" market" ]?.jsonPrimitive?.content ? : " " ,
166+ commodity = obj[" commodity" ]?.jsonPrimitive?.content ? : " " ,
167+ variety = obj[" variety" ]?.jsonPrimitive?.content ? : " " ,
168+ minPrice = obj[" minPrice" ]?.jsonPrimitive?.doubleOrNull ? : 0.0 ,
169+ maxPrice = obj[" maxPrice" ]?.jsonPrimitive?.doubleOrNull ? : 0.0 ,
170+ modalPrice = obj[" modalPrice" ]?.jsonPrimitive?.doubleOrNull ? : 0.0 ,
171+ arrivalDate = obj[" arrivalDate" ]?.jsonPrimitive?.content ? : " "
172+ )
173+ }.getOrNull()
174+ }
175+ if (records.isNotEmpty()) return @withTimeoutOrNull Result .success(records)
173176 }
174- if (records.isNotEmpty()) return @withContext Result .success(records)
175177 }
178+ null
176179 }
180+ if (backendResult != null ) return @withContext backendResult
177181 } catch (_: Exception ) {
178182 // Backend not reachable (physical device without local server) — fall through to gov API
179183 }
0 commit comments