From 99fe3a0243b59cb30e2ffb049296235a8eeca737 Mon Sep 17 00:00:00 2001 From: Odweta Date: Sun, 22 Dec 2024 13:10:48 +0100 Subject: [PATCH] network request factory working --- .../src/main/java/com/odweta/solon/Global.kt | 1 - .../src/main/java/com/odweta/solon/Launch.kt | 14 +- .../src/main/java/com/odweta/solon/Network.kt | 227 +++++++----------- .../src/main/java/com/odweta/solon/Parsing.kt | 24 ++ 4 files changed, 124 insertions(+), 142 deletions(-) diff --git a/mobile/app/src/main/java/com/odweta/solon/Global.kt b/mobile/app/src/main/java/com/odweta/solon/Global.kt index fd2e873..61a494b 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Global.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Global.kt @@ -202,7 +202,6 @@ class Global { var timetable: List = listOf() var lectureNotes: HashMap = hashMapOf() var subjectNameMap: HashMap = hashMapOf() - var client: OkHttpClient = OkHttpClient() var username: String = "" var password: String = "" diff --git a/mobile/app/src/main/java/com/odweta/solon/Launch.kt b/mobile/app/src/main/java/com/odweta/solon/Launch.kt index 321ffaf..c1c9eb4 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Launch.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Launch.kt @@ -28,9 +28,9 @@ fun remoteLoad(ctx: Context) { if (!global.isAPISetUp) { CoroutineScope(Dispatchers.IO) .launch { - Network.setupAPI() - global.timetableJSON = Network.getTimeTable() - global.marksJSON = Network.getMarks() + setupAPI() + global.timetableJSON = networkRequestFactory.perform(NetworkRequestType.Timetable) + global.marksJSON = networkRequestFactory.perform(NetworkRequestType.Marks) launchContinue( ctx, @@ -42,8 +42,8 @@ fun remoteLoad(ctx: Context) { CoroutineScope(Dispatchers.IO).launch { launchContinue( ctx, - Network.getTimeTable(), - Network.getMarks() + networkRequestFactory.perform(NetworkRequestType.Timetable), + networkRequestFactory.perform(NetworkRequestType.Marks) ) } } @@ -51,8 +51,8 @@ fun remoteLoad(ctx: Context) { fun localLoad(ctx: Context) { global.userData = JSONObject(Util.fileToString(global.filePaths.userData)) - global.studentId = Network.getStudentId() - global.studentClass = Network.getStudentClass() + global.studentId = Parsing.getStudentId() + global.studentClass = Parsing.getStudentClass() global.apiEndPoints.marks = "${global.apiEndPoints.apiBase}/v1/students/${global.studentId}/marks/list" val localTimetable = JSONObject(Util.fileToString(global.filePaths.timetable)) val localMarks = JSONObject(Util.fileToString(global.filePaths.marks)) diff --git a/mobile/app/src/main/java/com/odweta/solon/Network.kt b/mobile/app/src/main/java/com/odweta/solon/Network.kt index b03e503..5472c91 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Network.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Network.kt @@ -1,147 +1,106 @@ package com.odweta.solon +import android.util.Log import okhttp3.FormBody +import okhttp3.Headers +import okhttp3.Headers.Companion.headersOf +import okhttp3.OkHttpClient import okhttp3.Request -import org.json.JSONException +import okhttp3.Response import org.json.JSONObject -import java.io.IOException -class Network { - companion object { - fun getToken(): String { - val request = Request.Builder() - .url(global.apiEndPoints.token) - .header("Content-Type", "application/x-www-form-urlencoded") - .post( - FormBody.Builder() - .add("grant_type", "password") - .add("username", global.username) - .add("password", global.password) - .add("client_id", "test_client") - .add("scope", "openid offline_access profile sol_api") - .build() +fun setupAPI() { + global.token = "NETWORK_UNREACHABLE" + val token = networkRequestFactory.perform(NetworkRequestType.Token).getString("token") + if (""""error": """ !in token) { + global.token = token + } + if (global.token == "NETWORK_UNREACHABLE" || """"error": """ in global.token) { + global.userData = JSONObject() + global.studentId = "" + return + } + global.userData = networkRequestFactory.perform(NetworkRequestType.UserData) + Util.saveStringToFile(global.filePaths.userData, global.userData.toString()) + global.studentClass = Parsing.getStudentClass() + global.studentId = Parsing.getStudentId() + + global.apiEndPoints.marks = "${global.apiEndPoints.apiBase}/v1/students/${global.studentId}/marks/list" + + global.isAPISetUp = true +} + +enum class NetworkRequestType { + Token, + Timetable, + Marks, + UserData +} + +interface NetworkRequestInterface { + fun perform(type: NetworkRequestType): JSONObject +} + +object NetworkRequestFactory: NetworkRequestInterface { + private val client: OkHttpClient = OkHttpClient() + private val responseError = JSONObject(mapOf("error" to "error")) + + override fun perform(type: NetworkRequestType): JSONObject { + when (type) { + NetworkRequestType.Token -> { + val response = post(global.apiEndPoints.token, headersOf(), FormBody.Builder() + .add("grant_type", "password") + .add("username", global.username) + .add("password", global.password) + .add("client_id", "test_client") + .add("scope", "openid offline_access profile sol_api") + .build() ) - .build() - return try { - val resp = global.client.newCall(request).execute() - val respString = resp.body?.string().toString() - if (JSONObject(respString).has("access_token")) { - JSONObject(respString).getString("access_token") + return if (response.code == 200) { + JSONObject(mapOf("token" to JSONObject(response.body?.string().toString()).getString("access_token"))) } else { - """"error": "network"""" + responseError } - //val respJson = respString?.let { JSONObject(it) } - //respJson.toString() - } catch (e: JSONException) { - """{"error": "json"}""" - } catch (e: Exception) { - //e.printStackTrace() - """{"error": "network"}""" - } - } - - fun setupAPI() { - global.token = "NETWORK_UNREACHABLE" - val token = getToken() - if (""""error": """ !in token) { - global.token = token - } - if (global.token == "NETWORK_UNREACHABLE" || """"error": """ in global.token) { - global.userData = JSONObject() - global.studentId = "" - return - } - global.userData = getUserData() - Util.saveStringToFile(global.filePaths.userData, global.userData.toString()) - global.studentClass = getStudentClass() - global.studentId = getStudentId() - - global.apiEndPoints.marks = "${global.apiEndPoints.apiBase}/v1/students/${global.studentId}/marks/list" - - global.isAPISetUp = true - } - - fun getStudentClass(): String { // TODO: move to Parsing - return if (!Parsing.userIsParent()) { - JSONObject( - Util.fileToString(global.filePaths.userData) - ).getJSONObject("class").getString("name") - } else { - // if the user is a parent, the class will be of their first child - JSONObject( - Util.fileToString(global.filePaths.userData) - ).getJSONArray("children").getJSONObject(0).getString("className") - } - } - - fun getStudentId(): String { // TODO: move to Parsing - return if (!Parsing.userIsParent()) { - global.userData.getString("personID") - } else { - global.userData.getJSONArray("children") - .getJSONObject(0) - .getString("id") - } - } - - fun getUserData(): JSONObject { - val request = Request.Builder() - .url(global.apiEndPoints.userData) - .header("Content-Type", "application/x-www-form-urlencoded") - .header("Authorization", "Bearer ${global.token}") // using Bearer auth token - .get() - .build() - - return try { - val resp = global.client.newCall(request).execute() - val respString = resp.body?.string().toString() - JSONObject(respString) - } catch (e: JSONException) { - JSONObject("""{"error": "json"}""") - } catch (e: IOException) { - JSONObject("""{"error": "network"}""") - } - } - - fun getTimeTable(): JSONObject { - val userIsParent = Parsing.userIsParent() - val url = if (!userIsParent) global.apiEndPoints.timetable - else "${global.apiEndPoints.timetable}?studentId=${global.studentId}" - - val request = Request.Builder() - .url(url) - .header("Content-Type", "application/x-www-form-urlencoded") - .header("Authorization", "Bearer ${global.token}") - .get() - .build() - - return try { - val resp = global.client.newCall(request).execute() - JSONObject(resp.body?.string().toString()) - } catch (e: JSONException) { - JSONObject("""{"error": "json"}""") - } catch (e: IOException) { - JSONObject("""{"error": "network"}""") - } - } - - fun getMarks(): JSONObject { - val request = Request.Builder() - .url(global.apiEndPoints.marks) - .header("Content-Type", "application/x-www-form-urlencoded") - .header("Authorization", "Bearer ${global.token}") - .get() - .build() - - return try { - val resp = global.client.newCall(request).execute() - JSONObject(resp.body?.string().toString()) - } catch (e: JSONException) { - JSONObject("""{"error": "json"}""") - } catch (e: IOException) { - JSONObject("""{"error": "network"}""") } + NetworkRequestType.Timetable -> return getAPI(global.apiEndPoints.timetable) + NetworkRequestType.Marks -> return getAPI(global.apiEndPoints.marks) + NetworkRequestType.UserData -> return getAPI(global.apiEndPoints.userData) } } -} \ No newline at end of file + + private fun get(url: String, headers: Headers): Response { + val request = Request.Builder() + .url(url) + .headers(headers) + .get() + .build() + + return client.newCall(request).execute() + } + + private fun post(url: String, headers: Headers, body: FormBody): Response { + val request = Request.Builder() + .url(url) + .headers(headers) + .post(body) + .build() + + return client.newCall(request).execute() + } + + private fun getAPI(url: String): JSONObject { + Log.d("debug TOKEN", global.token) + val response = get(url, headersOf( + "Content-Type", "application/x-www-form-urlencoded", + "Authorization", "Bearer ${global.token}" + )) + return if (response.code == 200) { + JSONObject(response.body?.string().toString()) + } else { + responseError + } + } +} + +val networkRequestFactory = NetworkRequestFactory \ No newline at end of file diff --git a/mobile/app/src/main/java/com/odweta/solon/Parsing.kt b/mobile/app/src/main/java/com/odweta/solon/Parsing.kt index b1c6f7d..3afd3dc 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Parsing.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Parsing.kt @@ -385,5 +385,29 @@ class Parsing { return marks } + + fun getStudentClass(): String { + return if (!userIsParent()) { + global.userData + .getJSONObject("class") + .getString("name") + } else { + // if the user is a parent, the class will be of their first child + global.userData + .getJSONArray("children") + .getJSONObject(0) + .getString("className") + } + } + + fun getStudentId(): String { + return if (!userIsParent()) { + global.userData.getString("personID") + } else { + global.userData.getJSONArray("children") + .getJSONObject(0) + .getString("id") + } + } } } \ No newline at end of file