From d812b1cc5f6bf2992c09abd564dea3c3e3368a5d Mon Sep 17 00:00:00 2001 From: fatemeh imanipour Date: Sat, 9 May 2026 16:17:00 +0330 Subject: [PATCH 1/3] Add interceptors dependency to all related modules --- accountant/accountant-app/pom.xml | 4 ++++ accountant/pom.xml | 5 +++++ auth-gateway/auth-gateway-app/pom.xml | 4 ++++ bc-gateway/bc-gateway-app/pom.xml | 8 ++++++++ device-management/device-management-app/pom.xml | 4 ++++ device-management/pom.xml | 5 +++++ docker-compose.yml | 4 ++-- matching-gateway/matching-gateway-app/pom.xml | 4 ++++ otp/otp-app/pom.xml | 4 ++++ profile/pom.xml | 5 +++++ profile/profile-app/pom.xml | 4 ++++ user-management/pom.xml | 5 +++++ 12 files changed, 54 insertions(+), 2 deletions(-) diff --git a/accountant/accountant-app/pom.xml b/accountant/accountant-app/pom.xml index 67649ff75..f56aee06a 100644 --- a/accountant/accountant-app/pom.xml +++ b/accountant/accountant-app/pom.xml @@ -51,6 +51,10 @@ co.nilin.opex.utility error-handler + + co.nilin.opex.utility + interceptors + org.springframework.cloud spring-cloud-starter-vault-config diff --git a/accountant/pom.xml b/accountant/pom.xml index 6eded39f6..edce57a88 100644 --- a/accountant/pom.xml +++ b/accountant/pom.xml @@ -82,6 +82,11 @@ error-handler ${error-hanlder.version} + + co.nilin.opex.utility + interceptors + ${interceptor.version} + org.springframework.cloud spring-cloud-dependencies diff --git a/auth-gateway/auth-gateway-app/pom.xml b/auth-gateway/auth-gateway-app/pom.xml index 0d31ffddd..0ff3a5ade 100644 --- a/auth-gateway/auth-gateway-app/pom.xml +++ b/auth-gateway/auth-gateway-app/pom.xml @@ -80,6 +80,10 @@ co.nilin.opex.utility error-handler + + co.nilin.opex.utility + interceptors + com.auth0 java-jwt diff --git a/bc-gateway/bc-gateway-app/pom.xml b/bc-gateway/bc-gateway-app/pom.xml index 2bdccb667..0046a178b 100644 --- a/bc-gateway/bc-gateway-app/pom.xml +++ b/bc-gateway/bc-gateway-app/pom.xml @@ -138,6 +138,14 @@ micrometer-registry-prometheus runtime + + co.nilin.opex.utility + interceptors + + + co.nilin.opex.utility + error-handler + diff --git a/device-management/device-management-app/pom.xml b/device-management/device-management-app/pom.xml index 82e41ff4e..ff9b70048 100644 --- a/device-management/device-management-app/pom.xml +++ b/device-management/device-management-app/pom.xml @@ -78,6 +78,10 @@ co.nilin.opex.utility error-handler + + co.nilin.opex.utility + interceptors + com.zaxxer HikariCP diff --git a/device-management/pom.xml b/device-management/pom.xml index d24596637..4800bfa7c 100644 --- a/device-management/pom.xml +++ b/device-management/pom.xml @@ -56,6 +56,11 @@ error-handler ${error-hanlder.version} + + co.nilin.opex.utility + interceptors + ${interceptor.version} + co.nilin.opex.device-management device-management-core diff --git a/docker-compose.yml b/docker-compose.yml index 63535e6e2..b9078536e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -546,8 +546,8 @@ services: - SMTP_USER=${SMTP_USER} - SMTP_PASS=${SMTP_PASS} - SMTP_FROM=${SMTP_FROM} - - SMTP_SOCKS_HOST=${SMTP_SOCKS_HOST} - - SMTP_SOCKS_PORT=${SMTP_SOCKS_PORT} + - SMTP_PROXY_HOST=${SMTP_PROXY_HOST} + - SMTP_PROXY_PORT=${SMTP_PROXY_PORT} - SMTP_PROXY_ENABLED=${SMTP_PROXY_ENABLED} - TOKEN_ISSUER_URL=${KC_ISSUER_URL} - OTP_CODE_RESPONSE_ENABLED=${OTP_CODE_RESPONSE_ENABLED} diff --git a/matching-gateway/matching-gateway-app/pom.xml b/matching-gateway/matching-gateway-app/pom.xml index 24e94ab58..86d029320 100644 --- a/matching-gateway/matching-gateway-app/pom.xml +++ b/matching-gateway/matching-gateway-app/pom.xml @@ -77,6 +77,10 @@ co.nilin.opex.utility error-handler + + co.nilin.opex.utility + interceptors + io.mockk mockk diff --git a/otp/otp-app/pom.xml b/otp/otp-app/pom.xml index 1d3d72124..49cb4f0c0 100644 --- a/otp/otp-app/pom.xml +++ b/otp/otp-app/pom.xml @@ -87,6 +87,10 @@ co.nilin.opex.utility error-handler + + co.nilin.opex.utility + interceptors + io.mockk mockk diff --git a/profile/pom.xml b/profile/pom.xml index 7ac615097..ffd3ab564 100644 --- a/profile/pom.xml +++ b/profile/pom.xml @@ -66,6 +66,11 @@ logging-handler ${logging-handler.version} + + co.nilin.opex.utility + error-handler + ${error-hanlder.version} + co.nilin.opex.utility interceptors diff --git a/profile/profile-app/pom.xml b/profile/profile-app/pom.xml index 685459a22..2b2412044 100644 --- a/profile/profile-app/pom.xml +++ b/profile/profile-app/pom.xml @@ -98,6 +98,10 @@ org.springframework.cloud spring-cloud-starter-vault-config + + co.nilin.opex.utility + error-handler + co.nilin.opex.utility interceptors diff --git a/user-management/pom.xml b/user-management/pom.xml index 0c0b0c5a4..fbb1146c0 100644 --- a/user-management/pom.xml +++ b/user-management/pom.xml @@ -49,6 +49,11 @@ error-handler ${error-hanlder.version} + + co.nilin.opex.utility + interceptors + ${interceptor.version} + co.nilin.opex.auth user-management-core From 0282fca0b9970f0a82777226450ee4b3008a8239 Mon Sep 17 00:00:00 2001 From: Amir Rajabi Date: Tue, 12 May 2026 16:20:22 +0330 Subject: [PATCH 2/3] Add new config services to api module --- .../api/core/inout/UpdateUserConfigRequest.kt | 12 ++ .../opex/api/core/inout/UserLevelConfig.kt | 16 +++ .../opex/api/core/inout/UserWebConfig.kt | 12 ++ .../co/nilin/opex/api/core/spi/ConfigProxy.kt | 13 +- .../ports/binance/config/SecurityConfig.kt | 2 + .../ports/opex/controller/ConfigController.kt | 53 ++++++++ .../api/ports/proxy/impl/ConfigProxyImpl.kt | 118 +++++++++++++++++- 7 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UpdateUserConfigRequest.kt create mode 100644 api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserLevelConfig.kt create mode 100644 api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserWebConfig.kt diff --git a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UpdateUserConfigRequest.kt b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UpdateUserConfigRequest.kt new file mode 100644 index 000000000..bfa631829 --- /dev/null +++ b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UpdateUserConfigRequest.kt @@ -0,0 +1,12 @@ +package co.nilin.opex.api.core.inout + +import co.nilin.opex.common.data.CalenderType +import co.nilin.opex.common.data.Theme +import co.nilin.opex.common.data.UserLanguage + +data class UpdateUserConfigRequest( + val theme: Theme?, + val language: UserLanguage?, + val calender: CalenderType?, + val favoritePairs: Set? +) \ No newline at end of file diff --git a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserLevelConfig.kt b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserLevelConfig.kt new file mode 100644 index 000000000..b6e05b8af --- /dev/null +++ b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserLevelConfig.kt @@ -0,0 +1,16 @@ +package co.nilin.opex.api.core.inout + +data class UserLevelConfig( + val userLevel: String, + val language: String, + val name: String, + val description: String? = null, + val permissions: Permissions +) + +data class Permissions( + val onChainDepositAllowed: Boolean? = false, + val offChainDepositAllowed: Boolean? = false, + val onChainWithdrawAllowed: Boolean? = false, + val offChainWithdrawAllowed: Boolean? = false +) \ No newline at end of file diff --git a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserWebConfig.kt b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserWebConfig.kt new file mode 100644 index 000000000..54d4f3e71 --- /dev/null +++ b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserWebConfig.kt @@ -0,0 +1,12 @@ +package co.nilin.opex.api.core.inout + +import co.nilin.opex.common.data.CalenderType +import co.nilin.opex.common.data.Theme +import co.nilin.opex.common.data.UserLanguage + +data class UserWebConfig( + var theme: Theme, + var language: UserLanguage, + var calender: CalenderType, + val favoritePairs: Set = hashSetOf() +) \ No newline at end of file diff --git a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/ConfigProxy.kt b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/ConfigProxy.kt index a5518654a..7246f9551 100644 --- a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/ConfigProxy.kt +++ b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/ConfigProxy.kt @@ -1,11 +1,20 @@ package co.nilin.opex.api.core.spi +import co.nilin.opex.api.core.inout.UpdateUserConfigRequest import co.nilin.opex.api.core.inout.UpdateWebConfigRequest +import co.nilin.opex.api.core.inout.UserLevelConfig +import co.nilin.opex.api.core.inout.UserWebConfig import co.nilin.opex.common.data.WebConfig interface ConfigProxy { - suspend fun getWebConfig(): WebConfig - suspend fun updateWebConfig(token: String, request: UpdateWebConfigRequest) : WebConfig + suspend fun updateWebConfig(token: String, request: UpdateWebConfigRequest): WebConfig + suspend fun getUserLevelConfig(): List + suspend fun updateUserLevelConfig(token: String, userLevelConfig: UserLevelConfig): UserLevelConfig + suspend fun deleteUserLevelConfig(token: String, userLevel: String, language: String) + suspend fun getUserConfig(token: String): UserWebConfig + suspend fun updateUserConfig(token: String, request: UpdateUserConfigRequest): UserWebConfig + suspend fun addUserFavoritePair(token: String, pairs: Set): UserWebConfig + suspend fun removeUserFavoritePair(token: String, pairs: Set): UserWebConfig } diff --git a/api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/api/ports/binance/config/SecurityConfig.kt b/api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/api/ports/binance/config/SecurityConfig.kt index 4e60277b4..f9bd55dc6 100644 --- a/api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/api/ports/binance/config/SecurityConfig.kt +++ b/api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/api/ports/binance/config/SecurityConfig.kt @@ -52,6 +52,8 @@ class SecurityConfig( .pathMatchers("/opex/v1/admin/transactions/**").hasAnyAuthority("ROLE_monitoring", "ROLE_admin") .pathMatchers("/opex/v1/storage/**").permitAll() .pathMatchers("/opex/v1/web/config/**").permitAll() + .pathMatchers("/opex/v1/user-level/config/**").permitAll() + .pathMatchers("/opex/v1/user/config/**").authenticated() .pathMatchers("/opex/v1/admin/**").hasAuthority("ROLE_admin") .pathMatchers("/opex/v1/deposit/**").hasAuthority("PERM_deposit:write") .pathMatchers(HttpMethod.POST, "/opex/v1/order").hasAuthority("PERM_order:write") diff --git a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ConfigController.kt b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ConfigController.kt index dd8576efd..b8e601270 100644 --- a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ConfigController.kt +++ b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ConfigController.kt @@ -1,6 +1,9 @@ package co.nilin.opex.api.ports.opex.controller +import co.nilin.opex.api.core.inout.UpdateUserConfigRequest import co.nilin.opex.api.core.inout.UpdateWebConfigRequest +import co.nilin.opex.api.core.inout.UserLevelConfig +import co.nilin.opex.api.core.inout.UserWebConfig import co.nilin.opex.api.core.spi.ConfigProxy import co.nilin.opex.api.ports.opex.util.jwtAuthentication import co.nilin.opex.api.ports.opex.util.tokenValue @@ -26,4 +29,54 @@ class ConfigController(private val configProxy: ConfigProxy) { return configProxy.updateWebConfig(securityContext.jwtAuthentication().tokenValue(), request) } + @GetMapping("/user-level/config") + suspend fun getUserLevelConfig(): List { + return configProxy.getUserLevelConfig() + } + + @PutMapping("/admin/user-level/config") + suspend fun updateUserLevelConfig( + @CurrentSecurityContext securityContext: SecurityContext, + @RequestBody userLevelConfig: UserLevelConfig + ): UserLevelConfig { + return configProxy.updateUserLevelConfig(securityContext.jwtAuthentication().tokenValue(), userLevelConfig) + } + + @DeleteMapping("/admin/user-level/config/{userLevel}/{language}") + suspend fun updateUserLevelConfig( + @CurrentSecurityContext securityContext: SecurityContext, + @PathVariable userLevel: String, + @PathVariable language: String + ) { + configProxy.deleteUserLevelConfig(securityContext.jwtAuthentication().tokenValue(), userLevel, language) + } + + @GetMapping("/user/config") + suspend fun getUserConfig(@CurrentSecurityContext securityContext: SecurityContext): UserWebConfig { + return configProxy.getUserConfig(securityContext.jwtAuthentication().tokenValue()) + } + + @PutMapping("/user/config") + suspend fun updateConfig( + @CurrentSecurityContext securityContext: SecurityContext, + @RequestBody request: UpdateUserConfigRequest + ): UserWebConfig { + return configProxy.updateUserConfig(securityContext.jwtAuthentication().tokenValue(), request) + } + + @PostMapping("/user/config/pair") + suspend fun addUserFavoritePair( + @CurrentSecurityContext securityContext: SecurityContext, + @RequestBody pairs: Set + ): UserWebConfig { + return configProxy.addUserFavoritePair(securityContext.jwtAuthentication().tokenValue(), pairs) + } + + @DeleteMapping("/user/config/pair") + suspend fun removeUserFavoritePair( + @CurrentSecurityContext securityContext: SecurityContext, + @RequestBody pairs: Set + ): UserWebConfig { + return configProxy.removeUserFavoritePair(securityContext.jwtAuthentication().tokenValue(), pairs) + } } \ No newline at end of file diff --git a/api/api-ports/api-proxy-rest/src/main/kotlin/co/nilin/opex/api/ports/proxy/impl/ConfigProxyImpl.kt b/api/api-ports/api-proxy-rest/src/main/kotlin/co/nilin/opex/api/ports/proxy/impl/ConfigProxyImpl.kt index 8f6d6d265..c6330cfa0 100644 --- a/api/api-ports/api-proxy-rest/src/main/kotlin/co/nilin/opex/api/ports/proxy/impl/ConfigProxyImpl.kt +++ b/api/api-ports/api-proxy-rest/src/main/kotlin/co/nilin/opex/api/ports/proxy/impl/ConfigProxyImpl.kt @@ -1,19 +1,25 @@ package co.nilin.opex.api.ports.proxy.impl +import co.nilin.opex.api.core.inout.UpdateUserConfigRequest import co.nilin.opex.api.core.inout.UpdateWebConfigRequest +import co.nilin.opex.api.core.inout.UserLevelConfig +import co.nilin.opex.api.core.inout.UserWebConfig import co.nilin.opex.api.core.spi.ConfigProxy import co.nilin.opex.common.OpexError +import co.nilin.opex.common.data.UserLanguage import co.nilin.opex.common.data.WebConfig +import co.nilin.opex.common.utils.LanguageUtils.getUserLanguage import co.nilin.opex.common.utils.LoggerDelegate import kotlinx.coroutines.reactive.awaitFirstOrElse +import kotlinx.coroutines.reactive.awaitSingle +import kotlinx.coroutines.reactor.awaitSingleOrNull import org.springframework.beans.factory.annotation.Qualifier import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpHeaders +import org.springframework.http.HttpMethod import org.springframework.http.MediaType import org.springframework.stereotype.Component -import org.springframework.web.reactive.function.client.WebClient -import org.springframework.web.reactive.function.client.body -import org.springframework.web.reactive.function.client.bodyToMono +import org.springframework.web.reactive.function.client.* import reactor.core.publisher.Mono @Component @@ -38,7 +44,7 @@ class ConfigProxyImpl(@Qualifier("generalWebClient") private val webClient: WebC token: String, request: UpdateWebConfigRequest ): WebConfig { - return webClient.put() + return webClient.post() .uri("$baseUrl/web/v1") .accept(MediaType.APPLICATION_JSON) .header(HttpHeaders.AUTHORIZATION, "Bearer $token") @@ -48,4 +54,108 @@ class ConfigProxyImpl(@Qualifier("generalWebClient") private val webClient: WebC .bodyToMono() .awaitFirstOrElse { throw OpexError.BadRequest.exception() } } + + override suspend fun getUserLevelConfig(): List { + val lang = UserLanguage.safeValueOf(getUserLanguage().awaitSingleOrNull()).toString() + return webClient.get() + .uri("$baseUrl/user-level/v1") { + it.queryParam("language", lang) + it.build() + } + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .onStatus({ t -> t.isError }, { it.createException() }) + .bodyToFlux() + .collectList() + .awaitSingle() + } + + override suspend fun updateUserLevelConfig( + token: String, + userLevelConfig: UserLevelConfig + ): UserLevelConfig { + return webClient.post() + .uri("$baseUrl/user-level/v1") + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer $token") + .body(Mono.just(userLevelConfig)) + .retrieve() + .onStatus({ t -> t.isError }, { it.createException() }) + .bodyToMono() + .awaitFirstOrElse { throw OpexError.BadRequest.exception() } + } + + override suspend fun deleteUserLevelConfig( + token: String, + userLevel: String, + language: String + ) { + webClient.delete() + .uri("$baseUrl/user-level/v1/${userLevel}/${language}") + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer $token") + .retrieve() + .onStatus({ it.isError }) { response -> + response.createException() + } + .awaitBodilessEntity() + } + + override suspend fun getUserConfig(token: String): UserWebConfig { + return webClient.get() + .uri("$baseUrl/user/v1") + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer $token") + .retrieve() + .onStatus({ t -> t.isError }, { it.createException() }) + .bodyToMono() + .awaitFirstOrElse { throw OpexError.BadRequest.exception("Failed to get user config") } + } + + override suspend fun updateUserConfig( + token: String, + request: UpdateUserConfigRequest + ): UserWebConfig { + return webClient.post() + .uri("$baseUrl/user/v1") + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer $token") + .body(Mono.just(request)) + .retrieve() + .onStatus({ t -> t.isError }, { it.createException() }) + .bodyToMono() + .awaitFirstOrElse { throw OpexError.BadRequest.exception() } + } + + override suspend fun addUserFavoritePair( + token: String, + pairs: Set + ): UserWebConfig { + return webClient.post() + .uri("$baseUrl/user/v1/pair") + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer $token") + .body(Mono.just(pairs)) + .retrieve() + .onStatus({ t -> t.isError }, { it.createException() }) + .bodyToMono() + .awaitFirstOrElse { throw OpexError.BadRequest.exception() } + } + + override suspend fun removeUserFavoritePair( + token: String, + pairs: Set + ): UserWebConfig { + return webClient.method(HttpMethod.DELETE) + .uri("$baseUrl/user/v1/pair") + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer $token") + .bodyValue(pairs) + .retrieve() + .onStatus({ it.isError }) { it.createException() } + .bodyToMono() + .awaitFirstOrElse { throw OpexError.BadRequest.exception() } + } } + From b95cf52d3c44e27318175cc796f6f2a1efb634c4 Mon Sep 17 00:00:00 2001 From: Amir Rajabi Date: Tue, 12 May 2026 17:16:58 +0330 Subject: [PATCH 3/3] Return Set for user favorite pairs --- .../api/core/inout/UpdateUserConfigRequest.kt | 3 +-- .../opex/api/core/inout/UserWebConfig.kt | 3 +-- .../co/nilin/opex/api/core/spi/ConfigProxy.kt | 5 +++-- .../ports/opex/controller/ConfigController.kt | 9 +++++++-- .../api/ports/proxy/impl/ConfigProxyImpl.kt | 19 +++++++++++++++---- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UpdateUserConfigRequest.kt b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UpdateUserConfigRequest.kt index bfa631829..a0f57f949 100644 --- a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UpdateUserConfigRequest.kt +++ b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UpdateUserConfigRequest.kt @@ -7,6 +7,5 @@ import co.nilin.opex.common.data.UserLanguage data class UpdateUserConfigRequest( val theme: Theme?, val language: UserLanguage?, - val calender: CalenderType?, - val favoritePairs: Set? + val calender: CalenderType? ) \ No newline at end of file diff --git a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserWebConfig.kt b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserWebConfig.kt index 54d4f3e71..08b920bbc 100644 --- a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserWebConfig.kt +++ b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/UserWebConfig.kt @@ -7,6 +7,5 @@ import co.nilin.opex.common.data.UserLanguage data class UserWebConfig( var theme: Theme, var language: UserLanguage, - var calender: CalenderType, - val favoritePairs: Set = hashSetOf() + var calender: CalenderType ) \ No newline at end of file diff --git a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/ConfigProxy.kt b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/ConfigProxy.kt index 7246f9551..af2969e65 100644 --- a/api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/ConfigProxy.kt +++ b/api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/ConfigProxy.kt @@ -14,7 +14,8 @@ interface ConfigProxy { suspend fun deleteUserLevelConfig(token: String, userLevel: String, language: String) suspend fun getUserConfig(token: String): UserWebConfig suspend fun updateUserConfig(token: String, request: UpdateUserConfigRequest): UserWebConfig - suspend fun addUserFavoritePair(token: String, pairs: Set): UserWebConfig - suspend fun removeUserFavoritePair(token: String, pairs: Set): UserWebConfig + suspend fun getUserFavoritePair(token: String): Set + suspend fun addUserFavoritePair(token: String, pairs: Set): Set + suspend fun removeUserFavoritePair(token: String, pairs: Set): Set } diff --git a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ConfigController.kt b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ConfigController.kt index b8e601270..1c32859a9 100644 --- a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ConfigController.kt +++ b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ConfigController.kt @@ -64,11 +64,16 @@ class ConfigController(private val configProxy: ConfigProxy) { return configProxy.updateUserConfig(securityContext.jwtAuthentication().tokenValue(), request) } + @GetMapping("/user/config/pair") + suspend fun getUserFavoritePair(@CurrentSecurityContext securityContext: SecurityContext): Set { + return configProxy.getUserFavoritePair(securityContext.jwtAuthentication().tokenValue()) + } + @PostMapping("/user/config/pair") suspend fun addUserFavoritePair( @CurrentSecurityContext securityContext: SecurityContext, @RequestBody pairs: Set - ): UserWebConfig { + ): Set { return configProxy.addUserFavoritePair(securityContext.jwtAuthentication().tokenValue(), pairs) } @@ -76,7 +81,7 @@ class ConfigController(private val configProxy: ConfigProxy) { suspend fun removeUserFavoritePair( @CurrentSecurityContext securityContext: SecurityContext, @RequestBody pairs: Set - ): UserWebConfig { + ): Set { return configProxy.removeUserFavoritePair(securityContext.jwtAuthentication().tokenValue(), pairs) } } \ No newline at end of file diff --git a/api/api-ports/api-proxy-rest/src/main/kotlin/co/nilin/opex/api/ports/proxy/impl/ConfigProxyImpl.kt b/api/api-ports/api-proxy-rest/src/main/kotlin/co/nilin/opex/api/ports/proxy/impl/ConfigProxyImpl.kt index c6330cfa0..a6a15f512 100644 --- a/api/api-ports/api-proxy-rest/src/main/kotlin/co/nilin/opex/api/ports/proxy/impl/ConfigProxyImpl.kt +++ b/api/api-ports/api-proxy-rest/src/main/kotlin/co/nilin/opex/api/ports/proxy/impl/ConfigProxyImpl.kt @@ -127,10 +127,21 @@ class ConfigProxyImpl(@Qualifier("generalWebClient") private val webClient: WebC .awaitFirstOrElse { throw OpexError.BadRequest.exception() } } + override suspend fun getUserFavoritePair(token: String): Set { + return webClient.get() + .uri("$baseUrl/user/v1/pair") + .accept(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer $token") + .retrieve() + .onStatus({ t -> t.isError }, { it.createException() }) + .bodyToMono>() + .awaitFirstOrElse { throw OpexError.BadRequest.exception("Failed to get user favorite pair") } + } + override suspend fun addUserFavoritePair( token: String, pairs: Set - ): UserWebConfig { + ): Set { return webClient.post() .uri("$baseUrl/user/v1/pair") .accept(MediaType.APPLICATION_JSON) @@ -138,14 +149,14 @@ class ConfigProxyImpl(@Qualifier("generalWebClient") private val webClient: WebC .body(Mono.just(pairs)) .retrieve() .onStatus({ t -> t.isError }, { it.createException() }) - .bodyToMono() + .bodyToMono>() .awaitFirstOrElse { throw OpexError.BadRequest.exception() } } override suspend fun removeUserFavoritePair( token: String, pairs: Set - ): UserWebConfig { + ): Set { return webClient.method(HttpMethod.DELETE) .uri("$baseUrl/user/v1/pair") .contentType(MediaType.APPLICATION_JSON) @@ -154,7 +165,7 @@ class ConfigProxyImpl(@Qualifier("generalWebClient") private val webClient: WebC .bodyValue(pairs) .retrieve() .onStatus({ it.isError }) { it.createException() } - .bodyToMono() + .bodyToMono>() .awaitFirstOrElse { throw OpexError.BadRequest.exception() } } }