Skip to content

Commit f54a4ef

Browse files
committed
forex country info
1 parent 08cdb08 commit f54a4ef

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

backend/src/main/kotlin/me/sujanpoudel/playdeals/domain/ForexRate.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,10 @@ data class ForexRate(
88
val rates: List<ConversionRate>
99
)
1010

11-
data class ConversionRate(val currency: String, val rate: Float)
11+
data class ConversionRate(
12+
val currency: String,
13+
val symbol: String,
14+
val name: String,
15+
val flag: String,
16+
val rate: Float
17+
)

backend/src/main/kotlin/me/sujanpoudel/playdeals/jobs/ForexFetcher.kt

+23-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import org.kodein.di.instance
1919
import java.time.Duration
2020
import java.time.OffsetDateTime
2121
import java.time.ZoneOffset
22+
import java.util.Currency
23+
import java.util.Locale
2224
import java.util.UUID
2325

2426
class ForexFetcher(
@@ -57,10 +59,23 @@ class ForexFetcher(
5759
val epochSeconds = response.getLong("timestamp")
5860
val usdRate = response.getJsonObject("rates").getNumber("USD").toFloat()
5961

62+
val currencyLocale = Locale.getAvailableLocales().associateBy {
63+
kotlin.runCatching { Currency.getInstance(it) }.getOrNull() ?: Locale.getDefault()
64+
}
65+
6066
return ForexRate(
6167
timestamp = OffsetDateTime.ofInstant(java.time.Instant.ofEpochSecond(epochSeconds), ZoneOffset.UTC),
6268
rates = response.getJsonObject("rates").map {
63-
ConversionRate(it.key, (it.value as Number).toFloat() / usdRate)
69+
val currency = kotlin.runCatching { Currency.getInstance(it.key) }.getOrNull()
70+
val locale = currencyLocale.getOrDefault(currency, Locale.US)
71+
72+
ConversionRate(
73+
currency = it.key,
74+
symbol = currency?.getSymbol(locale) ?: "$",
75+
name = currency?.displayName ?: it.key,
76+
flag = locale.flagEmoji,
77+
rate = (it.value as Number).toFloat() / usdRate
78+
)
6479
}
6580
)
6681
}
@@ -89,3 +104,10 @@ suspend fun KeyValuesRepository.getForexRate(): ForexRate? = get(KEY_FOREX_RATE)
89104
}
90105

91106
suspend fun KeyValuesRepository.saveForexRate(forexRate: ForexRate) = set(KEY_FOREX_RATE, Json.encode(forexRate))
107+
108+
private val Locale.flagEmoji: String
109+
get() {
110+
val firstLetter = Character.codePointAt(country, 0) - 0x41 + 0x1F1E6
111+
val secondLetter = Character.codePointAt(country, 1) - 0x41 + 0x1F1E6
112+
return String(Character.toChars(firstLetter)) + String(Character.toChars(secondLetter))
113+
}

backend/src/test/kotlin/me/sujanpoudel/playdeals/api/forex/GetForexApiTest.kt

+26-2
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,38 @@ import me.sujanpoudel.playdeals.IntegrationTest
88
import me.sujanpoudel.playdeals.domain.ConversionRate
99
import me.sujanpoudel.playdeals.domain.ForexRate
1010
import me.sujanpoudel.playdeals.get
11+
import me.sujanpoudel.playdeals.jobs.getForexRate
1112
import me.sujanpoudel.playdeals.jobs.saveForexRate
1213
import me.sujanpoudel.playdeals.repositories.KeyValuesRepository
1314
import org.junit.jupiter.api.Test
1415
import java.time.OffsetDateTime
16+
import java.time.ZoneOffset
1517

1618
class GetForexApiTest(vertx: Vertx) : IntegrationTest(vertx) {
19+
20+
@Test
21+
fun `Key value repo should properly store the forex rate`() = runTest {
22+
val repository = di.get<KeyValuesRepository>()
23+
24+
val forexRate = ForexRate(
25+
timestamp = OffsetDateTime.now().withOffsetSameInstant(ZoneOffset.UTC),
26+
rates = listOf(ConversionRate("USD", "$", "US Dollar", "🇺🇸", 1.1f))
27+
)
28+
repository.saveForexRate(forexRate)
29+
30+
val savedForexRate = repository.getForexRate()
31+
32+
savedForexRate shouldBe forexRate
33+
}
34+
1735
@Test
1836
fun `should return forex if there is data`() = runTest {
1937
val repository = di.get<KeyValuesRepository>()
2038

21-
val forexRate = ForexRate(OffsetDateTime.now(), listOf(ConversionRate("USD", 1.1f)))
39+
val forexRate = ForexRate(
40+
timestamp = OffsetDateTime.now().withOffsetSameInstant(ZoneOffset.UTC),
41+
rates = listOf(ConversionRate("USD", "$", "US Dollar", "🇺🇸", 1.1f))
42+
)
2243

2344
repository.saveForexRate(forexRate)
2445

@@ -28,11 +49,14 @@ class GetForexApiTest(vertx: Vertx) : IntegrationTest(vertx) {
2849
.bodyAsJsonObject()
2950

3051
response.getJsonObject("data").also { data ->
31-
OffsetDateTime.parse(data.getString("timestamp")).toEpochSecond() shouldBe forexRate.timestamp.toEpochSecond()
52+
OffsetDateTime.parse(data.getString("timestamp")) shouldBe forexRate.timestamp
3253
data.getJsonArray("rates").also { rates ->
3354
rates.size() shouldBe 1
3455
(rates.first() as JsonObject).also { rate ->
3556
rate.getString("currency") shouldBe "USD"
57+
rate.getString("symbol") shouldBe "$"
58+
rate.getString("name") shouldBe "US Dollar"
59+
rate.getString("flag") shouldBe "🇺🇸"
3660
rate.getFloat("rate") shouldBe 1.1f
3761
}
3862
}

0 commit comments

Comments
 (0)