@@ -2,10 +2,105 @@ package com.example
22
33import io.github.jan.supabase.createSupabaseClient
44import io.github.jan.supabase.auth.Auth
5+ import io.github.jan.supabase.postgrest.Postgrest
6+ import io.github.jan.supabase.realtime.Realtime
7+ import kotlinx.coroutines.Dispatchers
8+ import kotlinx.coroutines.withContext
9+ import okhttp3.MediaType.Companion.toMediaTypeOrNull
10+ import okhttp3.OkHttpClient
11+ import okhttp3.Request
12+ import okhttp3.RequestBody.Companion.toRequestBody
13+ import org.json.JSONArray
14+ import org.json.JSONObject
15+ import java.util.concurrent.TimeUnit
16+
17+ val SUPABASE_URL = " https://yxjqseiegwjdfnccdchk.supabase.co"
18+ val SUPABASE_ANON_KEY = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl4anFzZWllZ3dqZGZuY2NkY2hrIiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODU5NDU2NTMsImV4cCI6MjEwMTUyMTY1M30.J4swglpV5qu3hRZFll3aqhG1Y2G9mUllvXMjKq6Ikmo"
519
620val supabase = createSupabaseClient(
7- supabaseUrl = " https://yxjqseiegwjdfnccdchk.supabase.co " ,
8- supabaseKey = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inl4anFzZWllZ3dqZGZuY2NkY2hrIiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODU5NDU2NTMsImV4cCI6MjEwMTUyMTY1M30.J4swglpV5qu3hRZFll3aqhG1Y2G9mUllvXMjKq6Ikmo "
21+ supabaseUrl = SUPABASE_URL ,
22+ supabaseKey = SUPABASE_ANON_KEY
923) {
1024 install(Auth )
25+ install(Postgrest )
26+ install(Realtime )
27+ }
28+
29+ object SupabaseApi {
30+ private val httpClient = OkHttpClient .Builder ()
31+ .connectTimeout(15 , TimeUnit .SECONDS )
32+ .readTimeout(15 , TimeUnit .SECONDS )
33+ .build()
34+
35+ /* *
36+ * Query real mandi live rates directly from Supabase DB table `mandi_live_rates`
37+ */
38+ suspend fun fetchMandiRates (state : String , commodity : String ): List <MandiRecord > = withContext(Dispatchers .IO ) {
39+ try {
40+ val url = " $SUPABASE_URL /rest/v1/mandi_live_rates?select=*&state=ilike.*${state.trim()} *&commodity=ilike.*${commodity.trim()} *&order=id.desc&limit=20"
41+ val request = Request .Builder ()
42+ .url(url)
43+ .addHeader(" apikey" , SUPABASE_ANON_KEY )
44+ .addHeader(" Authorization" , " Bearer $SUPABASE_ANON_KEY " )
45+ .addHeader(" Accept" , " application/json" )
46+ .get()
47+ .build()
48+
49+ val response = httpClient.newCall(request).execute()
50+ val body = response.body?.string() ? : " "
51+ if (! response.isSuccessful || body.isBlank()) return @withContext emptyList()
52+
53+ val jsonArray = JSONArray (body)
54+ val list = mutableListOf<MandiRecord >()
55+ for (i in 0 until jsonArray.length()) {
56+ val obj = jsonArray.getJSONObject(i)
57+ list.add(
58+ MandiRecord (
59+ state = obj.optString(" state" , state),
60+ district = obj.optString(" district" , " Central" ),
61+ market = obj.optString(" market" , " Main Market" ),
62+ commodity = obj.optString(" commodity" , commodity),
63+ variety = obj.optString(" variety" , " Standard" ),
64+ minPrice = obj.optDouble(" min_price" , 2000.0 ),
65+ maxPrice = obj.optDouble(" max_price" , 2600.0 ),
66+ modalPrice = obj.optDouble(" modal_price" , 2400.0 ),
67+ arrivalDate = obj.optString(" arrival_date" , " Today" )
68+ )
69+ )
70+ }
71+ list
72+ } catch (e: Exception ) {
73+ emptyList()
74+ }
75+ }
76+
77+ /* *
78+ * Sync user location / profile to Supabase `user_profiles` for nearby farmer discovery
79+ */
80+ suspend fun syncProfile (userEmail : String , name : String , state : String , district : String , crop : String , lat : Double , lng : Double ) = withContext(Dispatchers .IO ) {
81+ try {
82+ val jsonPayload = JSONObject ().apply {
83+ put(" email" , userEmail)
84+ put(" full_name" , name)
85+ put(" state" , state)
86+ put(" district" , district)
87+ put(" primary_crop" , crop)
88+ put(" latitude" , lat)
89+ put(" longitude" , lng)
90+ }.toString()
91+
92+ val url = " $SUPABASE_URL /rest/v1/user_profiles"
93+ val mediaType = " application/json" .toMediaTypeOrNull()
94+ val body = jsonPayload.toRequestBody(mediaType)
95+ val request = Request .Builder ()
96+ .url(url)
97+ .addHeader(" apikey" , SUPABASE_ANON_KEY )
98+ .addHeader(" Authorization" , " Bearer $SUPABASE_ANON_KEY " )
99+ .addHeader(" Prefer" , " resolution=merge-duplicates" )
100+ .post(body)
101+ .build()
102+
103+ httpClient.newCall(request).execute()
104+ } catch (_: Exception ) {}
105+ }
11106}
0 commit comments