Skip to content

Commit

Permalink
Create ApiWrapperClient to keep code reusable
Browse files Browse the repository at this point in the history
  • Loading branch information
NovaFox161 committed May 18, 2024
1 parent 81d1d72 commit 3a75420
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 80 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.dreamexposure.discal.core.business.api

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import okhttp3.executeAsync
import org.dreamexposure.discal.core.logger.LOGGER
import org.dreamexposure.discal.core.`object`.new.model.ResponseModel
import org.dreamexposure.discal.core.`object`.rest.ErrorResponse
import org.springframework.stereotype.Component

@Component
class ApiWrapperClient(
private val httpClient: OkHttpClient,
private val objectMapper: ObjectMapper,
) {
internal suspend fun <T> makeRequest(request: Request, valueType: Class<T>): ResponseModel<T> {
var response: Response? = null

try {
response = httpClient.newCall(request).executeAsync()

when (response.code) {
200 -> {
val data = objectMapper.readValue(response.body!!.string(), valueType)
response.body?.close()
response.close()

return ResponseModel(data)
}
else -> {
val error = objectMapper.readValue<ErrorResponse>(response.body!!.string())
response.body?.close()
response.close()

return ResponseModel(error, response.code)
}
}

} catch (ex: Exception) {
LOGGER.error("Error making request host:${request.url.host} | uri:${request.url.encodedPath} | code:${response?.code}", ex)
throw ex // Rethrow and let implementation decide proper handling for exception
} finally {
response?.body?.close()
response?.close()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,23 @@
package org.dreamexposure.discal.core.business.api

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import discord4j.common.util.Snowflake
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import okhttp3.executeAsync
import org.dreamexposure.discal.core.config.Config
import org.dreamexposure.discal.core.enums.calendar.CalendarHost
import org.dreamexposure.discal.core.logger.LOGGER
import org.dreamexposure.discal.core.`object`.new.model.ResponseModel
import org.dreamexposure.discal.core.`object`.new.model.discal.cam.SecurityValidateV1Request
import org.dreamexposure.discal.core.`object`.new.model.discal.cam.SecurityValidateV1Response
import org.dreamexposure.discal.core.`object`.new.model.discal.cam.TokenV1Model
import org.dreamexposure.discal.core.`object`.rest.ErrorResponse
import org.dreamexposure.discal.core.utils.GlobalVal.JSON
import org.springframework.stereotype.Component

@Component
class CamApiWrapper(
private val httpClient: OkHttpClient,
private val apiWrapperClient: ApiWrapperClient,
private val objectMapper: ObjectMapper,
) {
private final val CAM_URL = Config.URL_CAM.getString()
Expand All @@ -36,7 +31,7 @@ class CamApiWrapper(
.header("Content-Type", "application/json")
.build()

return makeRequest(request, SecurityValidateV1Response::class.java)
return apiWrapperClient.makeRequest(request, SecurityValidateV1Response::class.java)
}

suspend fun getCalendarToken(credentialId: Int): ResponseModel<TokenV1Model> {
Expand All @@ -52,7 +47,7 @@ class CamApiWrapper(
.url(url)
.build()

return makeRequest(request, TokenV1Model::class.java)
return apiWrapperClient.makeRequest(request, TokenV1Model::class.java)
}

suspend fun getCalendarToken(guildId: Snowflake, calNumber: Int, host: CalendarHost): ResponseModel<TokenV1Model> {
Expand All @@ -69,38 +64,6 @@ class CamApiWrapper(
.url(url)
.build()

return makeRequest(request, TokenV1Model::class.java)
}

private suspend fun <T> makeRequest(request: Request, valueType: Class<T>): ResponseModel<T> {
var response: Response? = null

try {
response = httpClient.newCall(request).executeAsync()

when (response.code) {
200 -> {
val data = objectMapper.readValue(response.body!!.string(), valueType)
response.body?.close()
response.close()

return ResponseModel(data)
}
else -> {
val error = objectMapper.readValue<ErrorResponse>(response.body!!.string())
response.body?.close()
response.close()

return ResponseModel(error, response.code)
}
}

} catch (ex: Exception) {
LOGGER.error("Error making request host:${request.url.host} | uri:${request.url.encodedPath} | code:${response?.code}", ex)
throw ex // Rethrow and let implementation decide proper handling for exception
} finally {
response?.body?.close()
response?.close()
}
return apiWrapperClient.makeRequest(request, TokenV1Model::class.java)
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
package org.dreamexposure.discal.core.business.api

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import okhttp3.*
import okhttp3.FormBody
import okhttp3.Request
import org.dreamexposure.discal.core.config.Config
import org.dreamexposure.discal.core.exceptions.AccessRevokedException
import org.dreamexposure.discal.core.logger.LOGGER
import org.dreamexposure.discal.core.`object`.new.model.ResponseModel
import org.dreamexposure.discal.core.`object`.new.model.google.OauthV4RefreshTokenResponse
import org.dreamexposure.discal.core.`object`.rest.ErrorResponse
import org.dreamexposure.discal.core.utils.GlobalVal.DEFAULT
import org.springframework.stereotype.Component

@Component
class GoogleCalendarApiWrapper(
private val httpClient: OkHttpClient,
private val objectMapper: ObjectMapper,
private val apiWrapperClient: ApiWrapperClient,
) {
suspend fun refreshAccessToken(refreshToken: String): ResponseModel<OauthV4RefreshTokenResponse> {
val requestFormBody = FormBody.Builder()
Expand All @@ -30,7 +27,7 @@ class GoogleCalendarApiWrapper(
.header("Content-Type", "application/x-www-form-urlencoded")
.build()

val response = makeRequest(request, OauthV4RefreshTokenResponse::class.java)
val response = apiWrapperClient.makeRequest(request, OauthV4RefreshTokenResponse::class.java)


// TODO: Handling of this should be moved up higher in the impl?
Expand All @@ -43,36 +40,4 @@ class GoogleCalendarApiWrapper(

return response
}

private suspend fun <T> makeRequest(request: Request, valueType: Class<T>): ResponseModel<T> {
var response: Response? = null

try {
response = httpClient.newCall(request).executeAsync()

when (response.code) {
200 -> {
val data = objectMapper.readValue(response.body!!.string(), valueType)
response.body?.close()
response.close()

return ResponseModel(data)
}
else -> {
val error = objectMapper.readValue<ErrorResponse>(response.body!!.string())
response.body?.close()
response.close()

return ResponseModel(error, response.code)
}
}

} catch (ex: Exception) {
LOGGER.error("Error making request host:${request.url.host} | uri:${request.url.encodedPath} | code:${response?.code}", ex)
throw ex // Rethrow and let implementation decide proper handling for exception
} finally {
response?.body?.close()
response?.close()
}
}
}

0 comments on commit 3a75420

Please sign in to comment.