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,
diff --git a/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt b/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt
index 6215a5a..486cd5c 100644
--- a/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt
+++ b/src/test/kotlin/dev/vality/rateboss/dao/ExRateDaoImplTest.kt
@@ -1,6 +1,9 @@
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
@@ -13,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() {
@@ -129,8 +133,16 @@ 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
+ .toLocalDate()
+ .atStartOfDay()
+ .format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))
+ )
+ val result = exRateDao.getRecentBySymbolicCodes(request)
assertEquals(recentExRate.rationalP, result?.rationalP)
assertEquals(recentExRate.rationalQ, result?.rationalQ)