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)