From 04a25178323402c08b0090a858249bda28286195 Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Fri, 28 Mar 2025 12:32:42 +0800 Subject: [PATCH] update api caller service --- .../fpsms/api/service/ApiCallerService.kt | 68 +++++++++++++++---- .../{TokenRequest.kt => M18TokenRequest.kt} | 2 +- .../{TokenResponse.kt => M18TokenResponse.kt} | 2 +- .../ffii/fpsms/m18/service/M18TokenService.kt | 34 +++++++--- 4 files changed, 81 insertions(+), 25 deletions(-) rename src/main/java/com/ffii/fpsms/m18/modals/{TokenRequest.kt => M18TokenRequest.kt} (86%) rename src/main/java/com/ffii/fpsms/m18/modals/{TokenResponse.kt => M18TokenResponse.kt} (83%) diff --git a/src/main/java/com/ffii/fpsms/api/service/ApiCallerService.kt b/src/main/java/com/ffii/fpsms/api/service/ApiCallerService.kt index 0e051fa..a8d742d 100644 --- a/src/main/java/com/ffii/fpsms/api/service/ApiCallerService.kt +++ b/src/main/java/com/ffii/fpsms/api/service/ApiCallerService.kt @@ -6,9 +6,11 @@ import org.springframework.http.HttpHeaders import org.springframework.http.MediaType import org.springframework.stereotype.Service import org.springframework.util.LinkedMultiValueMap +import org.springframework.util.MultiValueMap import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.bodyToMono import reactor.core.publisher.Mono +import kotlin.reflect.full.memberProperties @Service open class ApiCallerService( @@ -16,15 +18,20 @@ open class ApiCallerService( private val m18Config: M18Config ) { - private val webClient: WebClient = WebClient.builder() + val webClient: WebClient = WebClient.builder() .baseUrl(baseUrl) .defaultHeaders { headers -> headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) headers.set(HttpHeaders.AUTHORIZATION, "Bearer ${m18Config.ACCESS_TOKEN}") + headers.set("client_id", m18Config.CLIENT_ID) } .build() - fun get(urlPath: String, params: Map?, customHeaders: Map?): Mono { + inline fun get( + urlPath: String, + params: MultiValueMap, + customHeaders: Map? + ): Mono { return webClient.get() .uri { uriBuilder -> @@ -33,15 +40,7 @@ open class ApiCallerService( path(urlPath) // convert to multiValueMap - params?.let { params -> - queryParams( - LinkedMultiValueMap().apply { - params.forEach { (key, values) -> - add(key, values) - } - } - ) - } + queryParams(params) } .build() } @@ -49,6 +48,51 @@ open class ApiCallerService( customHeaders?.forEach { (k, v) -> headers.set(k, v) } } .retrieve() - .bodyToMono(String::class.java) + .bodyToMono(T::class.java) + } + + inline fun get( + urlPath: String, + params: Map?, + customHeaders: Map? + ): Mono { + + // convert to multiValueMap + val queryParams = params?.let { paramMap -> + LinkedMultiValueMap().apply { + paramMap.forEach { (key, value) -> + when (value) { + is Collection<*> -> addAll(key, value.map { it.toString() }) + else -> add(key, value.toString()) + } + } + } + } ?: LinkedMultiValueMap() + + return get(urlPath, queryParams, customHeaders) + } + + // T: Response, U: Request + inline fun get( + urlPath: String, + params: U?, + customHeaders: Map? + ): Mono { + + // convert to multiValueMap + val queryParams = params?.let { + LinkedMultiValueMap().apply { + U::class.memberProperties.forEach { property -> + val key = property.name + val value = property.get(params) + when (value) { + is Collection<*> -> value.forEach { item -> add(key, item.toString()) } + else -> add(key, value.toString()) + } + } + } + } ?: LinkedMultiValueMap() + + return get(urlPath, queryParams, customHeaders) } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/m18/modals/TokenRequest.kt b/src/main/java/com/ffii/fpsms/m18/modals/M18TokenRequest.kt similarity index 86% rename from src/main/java/com/ffii/fpsms/m18/modals/TokenRequest.kt rename to src/main/java/com/ffii/fpsms/m18/modals/M18TokenRequest.kt index eb0062f..a7d92ba 100644 --- a/src/main/java/com/ffii/fpsms/m18/modals/TokenRequest.kt +++ b/src/main/java/com/ffii/fpsms/m18/modals/M18TokenRequest.kt @@ -1,6 +1,6 @@ package com.ffii.fpsms.m18.modals -data class TokenRequest( +data class M18TokenRequest( val grant_type: String, val client_id: String, val client_secret: String, diff --git a/src/main/java/com/ffii/fpsms/m18/modals/TokenResponse.kt b/src/main/java/com/ffii/fpsms/m18/modals/M18TokenResponse.kt similarity index 83% rename from src/main/java/com/ffii/fpsms/m18/modals/TokenResponse.kt rename to src/main/java/com/ffii/fpsms/m18/modals/M18TokenResponse.kt index 5ab7b0a..d075db7 100644 --- a/src/main/java/com/ffii/fpsms/m18/modals/TokenResponse.kt +++ b/src/main/java/com/ffii/fpsms/m18/modals/M18TokenResponse.kt @@ -1,6 +1,6 @@ package com.ffii.fpsms.m18.modals -data class TokenResponse( +data class M18TokenResponse( val access_token: String, val refresh_token: String, val uid: Long, diff --git a/src/main/java/com/ffii/fpsms/m18/service/M18TokenService.kt b/src/main/java/com/ffii/fpsms/m18/service/M18TokenService.kt index 238c861..951d8ef 100644 --- a/src/main/java/com/ffii/fpsms/m18/service/M18TokenService.kt +++ b/src/main/java/com/ffii/fpsms/m18/service/M18TokenService.kt @@ -2,33 +2,45 @@ package com.ffii.fpsms.m18.service import com.ffii.fpsms.api.service.ApiCallerService import com.ffii.fpsms.m18.M18Config +import com.ffii.fpsms.m18.modals.M18TokenRequest +import com.ffii.fpsms.m18.modals.M18TokenResponse +import jakarta.annotation.PostConstruct import org.springframework.context.annotation.Bean import org.springframework.stereotype.Component import org.springframework.stereotype.Service @Service -@Component open class M18TokenService( private val apiCallerService: ApiCallerService, private val m18Config: M18Config ) { - @Bean + @PostConstruct fun run() { - println("abcdasds") - val params: MutableMap = mutableMapOf( - "grant_type" to m18Config.GRANT_TYPE, - "client_id" to m18Config.CLIENT_ID, - "client_secret" to m18Config.CLIENT_SECRET, - "username" to m18Config.USERNAME, - "password" to m18Config.PASSWORD +// val params: MutableMap = mutableMapOf( +// "grant_type" to m18Config.GRANT_TYPE, +// "client_id" to m18Config.CLIENT_ID, +// "client_secret" to m18Config.CLIENT_SECRET, +// "username" to m18Config.USERNAME, +// "password" to m18Config.PASSWORD +// ) +// + val params = M18TokenRequest( + grant_type = m18Config.GRANT_TYPE, + client_id = m18Config.CLIENT_ID, + client_secret = m18Config.CLIENT_SECRET, + username = m18Config.USERNAME, + password = m18Config.PASSWORD ) apiCallerService - .get("/oauth/token", params, null) + .get("/oauth/token", params, null) .subscribe( - { response -> println("WebClient Response stored: $response") }, + { response -> + m18Config.ACCESS_TOKEN = response.access_token + println("WebClient Response stored: $response") + }, { error -> println("WebClient Error: ${error.message}") } ) }