From e190879e0b1581a94c000118bf8b26c62d133ef3 Mon Sep 17 00:00:00 2001 From: Anatoly Karlov Date: Fri, 23 Jan 2026 11:23:30 +0700 Subject: [PATCH 1/4] add timestamp for rate request --- pom.xml | 2 +- .../dev/vality/rateboss/dao/ExRateDao.kt | 6 +-- .../dev/vality/rateboss/dao/ExRateDaoImpl.kt | 37 ++++++++++++++----- .../rateboss/service/ExRateServiceHandler.kt | 5 +-- .../rateboss/service/ExchangeDaoService.kt | 8 ++-- 5 files changed, 35 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index 6be3b37..d134209 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ dev.vality exrates-proto - 1.8-9794d14 + 1.9-5d53aec dev.vality diff --git a/src/main/kotlin/dev/vality/rateboss/dao/ExRateDao.kt b/src/main/kotlin/dev/vality/rateboss/dao/ExRateDao.kt index 583ba5d..dc5b579 100644 --- a/src/main/kotlin/dev/vality/rateboss/dao/ExRateDao.kt +++ b/src/main/kotlin/dev/vality/rateboss/dao/ExRateDao.kt @@ -1,15 +1,13 @@ package dev.vality.rateboss.dao +import dev.vality.exrates.service.GetCurrencyExchangeRateRequest import dev.vality.rateboss.dao.domain.tables.pojos.ExRate import dev.vality.rateboss.service.model.TimestampExchangeRateRequest interface ExRateDao { fun saveBatch(entities: List) - fun getRecentBySymbolicCodes( - sourceCode: String, - destinationCode: String, - ): ExRate? + fun getRecentBySymbolicCodes(request: GetCurrencyExchangeRateRequest): ExRate? fun getByCodesAndTimestamp(request: TimestampExchangeRateRequest): ExRate? } diff --git a/src/main/kotlin/dev/vality/rateboss/dao/ExRateDaoImpl.kt b/src/main/kotlin/dev/vality/rateboss/dao/ExRateDaoImpl.kt index 7fe90eb..eb930d5 100644 --- a/src/main/kotlin/dev/vality/rateboss/dao/ExRateDaoImpl.kt +++ b/src/main/kotlin/dev/vality/rateboss/dao/ExRateDaoImpl.kt @@ -1,5 +1,7 @@ package dev.vality.rateboss.dao +import dev.vality.exrates.service.GetCurrencyExchangeRateRequest +import dev.vality.rateboss.converter.Constants.Companion.DATE_TIME_FORMAT import dev.vality.rateboss.dao.domain.tables.ExRate.EX_RATE import dev.vality.rateboss.dao.domain.tables.pojos.ExRate import dev.vality.rateboss.service.model.TimestampExchangeRateRequest @@ -7,6 +9,8 @@ import org.jooq.DSLContext import org.jooq.impl.DSL import org.jooq.impl.SQLDataType import org.springframework.stereotype.Repository +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter @Repository class ExRateDaoImpl( @@ -44,18 +48,33 @@ class ExRateDaoImpl( ).execute() } - override fun getRecentBySymbolicCodes( - sourceCode: String, - destinationCode: String, - ): ExRate? { + override fun getRecentBySymbolicCodes(request: GetCurrencyExchangeRateRequest): ExRate? { val t = EX_RATE + + val targetRateDate = + request.datetime + ?.let { + LocalDateTime + .parse(it, DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)) + .toLocalDate() + } + + var condition = + t.DESTINATION_CURRENCY_SYMBOLIC_CODE + .eq(request.currency_data.destination_currency) + .and(t.SOURCE_CURRENCY_SYMBOLIC_CODE.eq(request.currency_data.source_currency)) + + if (targetRateDate != null) { + condition = + condition.and( + DSL.cast(t.RATE_TIMESTAMP, SQLDataType.LOCALDATE).eq(targetRateDate) + ) + } + return dsl .selectFrom(t) - .where( - t.DESTINATION_CURRENCY_SYMBOLIC_CODE - .eq(destinationCode) - .and(t.SOURCE_CURRENCY_SYMBOLIC_CODE.eq(sourceCode)), - ).orderBy(t.RATE_TIMESTAMP.desc()) + .where(condition) + .orderBy(t.RATE_TIMESTAMP.desc()) .limit(1) .fetchOneInto(ExRate::class.java) } diff --git a/src/main/kotlin/dev/vality/rateboss/service/ExRateServiceHandler.kt b/src/main/kotlin/dev/vality/rateboss/service/ExRateServiceHandler.kt index c26f304..2d79643 100644 --- a/src/main/kotlin/dev/vality/rateboss/service/ExRateServiceHandler.kt +++ b/src/main/kotlin/dev/vality/rateboss/service/ExRateServiceHandler.kt @@ -19,10 +19,7 @@ class ExRateServiceHandler( override fun getExchangeRateData(request: GetCurrencyExchangeRateRequest): GetCurrencyExchangeRateResult { log.info("Get getExchangeRateData request with body: {} ", request) val exchangeRateData = - exRateDaoService.getRecentExchangeRateBySymbolicCodes( - request.currencyData.sourceCurrency, - request.currencyData.destinationCurrency, - ) + exRateDaoService.getRecentExchangeRateBySymbolicCodes(request) val result = exchangeRateData?.let { getCurrencyExchangeRateResultConverter.convert(exchangeRateData) diff --git a/src/main/kotlin/dev/vality/rateboss/service/ExchangeDaoService.kt b/src/main/kotlin/dev/vality/rateboss/service/ExchangeDaoService.kt index 452bbce..5bfbe93 100644 --- a/src/main/kotlin/dev/vality/rateboss/service/ExchangeDaoService.kt +++ b/src/main/kotlin/dev/vality/rateboss/service/ExchangeDaoService.kt @@ -1,5 +1,6 @@ package dev.vality.rateboss.service +import dev.vality.exrates.service.GetCurrencyExchangeRateRequest import dev.vality.rateboss.converter.ExRateConverter import dev.vality.rateboss.dao.ExRateDao import dev.vality.rateboss.service.model.ExchangeRateData @@ -34,11 +35,8 @@ class ExchangeDaoService( log.info("Successfully save exRate batch with size: {}", exRates.size) } - fun getRecentExchangeRateBySymbolicCodes( - sourceCode: String, - destinationCode: String, - ): ExchangeRateData? { - val exRate = exRateDao.getRecentBySymbolicCodes(sourceCode, destinationCode) + fun getRecentExchangeRateBySymbolicCodes(request: GetCurrencyExchangeRateRequest): ExchangeRateData? { + val exRate = exRateDao.getRecentBySymbolicCodes(request) return exRate?.let { ExchangeRateData( sourceCurrencySymbolicCode = it.sourceCurrencySymbolicCode, From 31e821f298104c14539b070316e879824e1d0c4b Mon Sep 17 00:00:00 2001 From: Anatoly Karlov Date: Fri, 23 Jan 2026 11:31:02 +0700 Subject: [PATCH 2/4] add timestamp for rate request --- .../kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt b/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt index 6215a5a..afc82e4 100644 --- a/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt +++ b/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt @@ -1,5 +1,7 @@ package dev.vality.rateboss.dao +import dev.vality.exrates.service.CurrencyData +import dev.vality.exrates.service.GetCurrencyExchangeRateRequest import dev.vality.rateboss.ContainerConfiguration import dev.vality.rateboss.dao.domain.Tables.EX_RATE import dev.vality.rateboss.dao.domain.tables.pojos.ExRate @@ -129,8 +131,11 @@ class ExRateDaoImplTest : ContainerConfiguration() { .set(dslContext.newRecord(EX_RATE, recentExRate)) .execute() - val result = - exRateDao.getRecentBySymbolicCodes(sourceCurrency, destinationCurrency) + val request = + GetCurrencyExchangeRateRequest( + CurrencyData(sourceCurrency, destinationCurrency) + ).setDatetime(recentExRate.rateTimestamp.minusDays(1).toString()) + val result = exRateDao.getRecentBySymbolicCodes(request) assertEquals(recentExRate.rationalP, result?.rationalP) assertEquals(recentExRate.rationalQ, result?.rationalQ) From a861f9b288427d5aaa2e7cddd04c7a0fe5bdd867 Mon Sep 17 00:00:00 2001 From: Anatoly Karlov Date: Fri, 23 Jan 2026 11:36:36 +0700 Subject: [PATCH 3/4] add timestamp for rate request --- .../kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt b/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt index afc82e4..e546518 100644 --- a/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt +++ b/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt @@ -3,6 +3,7 @@ package dev.vality.rateboss.dao import dev.vality.exrates.service.CurrencyData import dev.vality.exrates.service.GetCurrencyExchangeRateRequest import dev.vality.rateboss.ContainerConfiguration +import dev.vality.rateboss.converter.Constants.Companion.DATE_TIME_FORMAT import dev.vality.rateboss.dao.domain.Tables.EX_RATE import dev.vality.rateboss.dao.domain.tables.pojos.ExRate import dev.vality.rateboss.service.model.TimestampExchangeRateRequest @@ -15,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.test.context.bean.override.mockito.MockitoBean import org.testcontainers.junit.jupiter.Testcontainers import java.time.LocalDateTime +import java.time.format.DateTimeFormatter @Testcontainers class ExRateDaoImplTest : ContainerConfiguration() { @@ -134,7 +136,9 @@ class ExRateDaoImplTest : ContainerConfiguration() { val request = GetCurrencyExchangeRateRequest( CurrencyData(sourceCurrency, destinationCurrency) - ).setDatetime(recentExRate.rateTimestamp.minusDays(1).toString()) + ).setDatetime( + recentExRate.rateTimestamp.minusDays(1).format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)) + ) val result = exRateDao.getRecentBySymbolicCodes(request) assertEquals(recentExRate.rationalP, result?.rationalP) From c933c617ec244203b49f3869ef0e8bde60b42e2c Mon Sep 17 00:00:00 2001 From: Anatoly Karlov Date: Fri, 23 Jan 2026 11:43:14 +0700 Subject: [PATCH 4/4] add timestamp for rate request --- src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt b/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt index e546518..486cd5c 100644 --- a/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt +++ b/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt @@ -137,7 +137,10 @@ class ExRateDaoImplTest : ContainerConfiguration() { GetCurrencyExchangeRateRequest( CurrencyData(sourceCurrency, destinationCurrency) ).setDatetime( - recentExRate.rateTimestamp.minusDays(1).format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)) + recentExRate.rateTimestamp + .toLocalDate() + .atStartOfDay() + .format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)) ) val result = exRateDao.getRecentBySymbolicCodes(request)