-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
9050c51
commit 220b898
Showing
11 changed files
with
176 additions
and
0 deletions.
There are no files selected for viewing
12 changes: 12 additions & 0 deletions
12
...mmonMain/kotlin/org/hyperskill/app/challenges/data/repository/ChallengesRepositoryImpl.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package org.hyperskill.app.challenges.data.repository | ||
|
||
import org.hyperskill.app.challenges.data.source.ChallengesRemoteDataSource | ||
import org.hyperskill.app.challenges.domain.model.Challenge | ||
import org.hyperskill.app.challenges.domain.repository.ChallengesRepository | ||
|
||
internal class ChallengesRepositoryImpl( | ||
private val challengesRemoteDataSource: ChallengesRemoteDataSource | ||
) : ChallengesRepository { | ||
override suspend fun getChallenges(): Result<List<Challenge>> = | ||
challengesRemoteDataSource.getChallenges() | ||
} |
7 changes: 7 additions & 0 deletions
7
...commonMain/kotlin/org/hyperskill/app/challenges/data/source/ChallengesRemoteDataSource.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package org.hyperskill.app.challenges.data.source | ||
|
||
import org.hyperskill.app.challenges.domain.model.Challenge | ||
|
||
interface ChallengesRemoteDataSource { | ||
suspend fun getChallenges(): Result<List<Challenge>> | ||
} |
33 changes: 33 additions & 0 deletions
33
shared/src/commonMain/kotlin/org/hyperskill/app/challenges/domain/model/Challenge.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package org.hyperskill.app.challenges.domain.model | ||
|
||
import kotlinx.datetime.LocalDate | ||
import kotlinx.serialization.SerialName | ||
import kotlinx.serialization.Serializable | ||
|
||
@Serializable | ||
data class Challenge( | ||
@SerialName("id") | ||
val id: Long, | ||
@SerialName("title") | ||
val title: String, | ||
@SerialName("description") | ||
val description: String, | ||
@SerialName("target_type") | ||
internal val targetTypeValue: Int, | ||
@SerialName("starting_date") | ||
val startingDate: LocalDate, | ||
@SerialName("interval_duration_days") | ||
val intervalDurationDays: Int, | ||
@SerialName("intervals_count") | ||
val intervalsCount: Int, | ||
@SerialName("status") | ||
internal val statusValue: String, | ||
@SerialName("reward_link") | ||
val rewardLink: String?, | ||
@SerialName("progress") | ||
val progress: List<Boolean>, | ||
@SerialName("finish_date") | ||
val finishDate: LocalDate, | ||
@SerialName("current_interval") | ||
val currentInterval: Int? | ||
) |
7 changes: 7 additions & 0 deletions
7
...commonMain/kotlin/org/hyperskill/app/challenges/domain/repository/ChallengesRepository.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package org.hyperskill.app.challenges.domain.repository | ||
|
||
import org.hyperskill.app.challenges.domain.model.Challenge | ||
|
||
interface ChallengesRepository { | ||
suspend fun getChallenges(): Result<List<Challenge>> | ||
} |
7 changes: 7 additions & 0 deletions
7
.../src/commonMain/kotlin/org/hyperskill/app/challenges/injection/ChallengesDataComponent.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package org.hyperskill.app.challenges.injection | ||
|
||
import org.hyperskill.app.challenges.domain.repository.ChallengesRepository | ||
|
||
interface ChallengesDataComponent { | ||
val challengesRepository: ChallengesRepository | ||
} |
15 changes: 15 additions & 0 deletions
15
.../commonMain/kotlin/org/hyperskill/app/challenges/injection/ChallengesDataComponentImpl.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package org.hyperskill.app.challenges.injection | ||
|
||
import org.hyperskill.app.challenges.data.repository.ChallengesRepositoryImpl | ||
import org.hyperskill.app.challenges.data.source.ChallengesRemoteDataSource | ||
import org.hyperskill.app.challenges.domain.repository.ChallengesRepository | ||
import org.hyperskill.app.challenges.remote.ChallengesRemoteDataSourceImpl | ||
import org.hyperskill.app.core.injection.AppGraph | ||
|
||
internal class ChallengesDataComponentImpl(appGraph: AppGraph) : ChallengesDataComponent { | ||
private val challengesRemoteDataSource: ChallengesRemoteDataSource = | ||
ChallengesRemoteDataSourceImpl(appGraph.networkComponent.authorizedHttpClient) | ||
|
||
override val challengesRepository: ChallengesRepository | ||
get() = ChallengesRepositoryImpl(challengesRemoteDataSource) | ||
} |
20 changes: 20 additions & 0 deletions
20
.../commonMain/kotlin/org/hyperskill/app/challenges/remote/ChallengesRemoteDataSourceImpl.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package org.hyperskill.app.challenges.remote | ||
|
||
import io.ktor.client.HttpClient | ||
import io.ktor.client.call.body | ||
import io.ktor.client.request.get | ||
import org.hyperskill.app.challenges.data.source.ChallengesRemoteDataSource | ||
import org.hyperskill.app.challenges.domain.model.Challenge | ||
import org.hyperskill.app.challenges.remote.model.ChallengesResponse | ||
|
||
internal class ChallengesRemoteDataSourceImpl( | ||
private val httpClient: HttpClient | ||
) : ChallengesRemoteDataSource { | ||
override suspend fun getChallenges(): Result<List<Challenge>> = | ||
kotlin.runCatching { | ||
httpClient | ||
.get("/api/challenges") | ||
.body<ChallengesResponse>() | ||
.challenges | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
...ed/src/commonMain/kotlin/org/hyperskill/app/challenges/remote/model/ChallengesResponse.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package org.hyperskill.app.challenges.remote.model | ||
|
||
import kotlinx.serialization.SerialName | ||
import kotlinx.serialization.Serializable | ||
import org.hyperskill.app.challenges.domain.model.Challenge | ||
import org.hyperskill.app.core.remote.Meta | ||
import org.hyperskill.app.core.remote.MetaResponse | ||
|
||
@Serializable | ||
class ChallengesResponse( | ||
@SerialName("meta") | ||
override val meta: Meta, | ||
|
||
@SerialName("challenges") | ||
val challenges: List<Challenge> | ||
) : MetaResponse |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
52 changes: 52 additions & 0 deletions
52
shared/src/commonTest/kotlin/org/hyperskill/challenges/ChallengeDeserializationTest.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
package org.hyperskill.challenges | ||
|
||
import kotlin.test.Test | ||
import kotlin.test.assertEquals | ||
import kotlinx.datetime.LocalDate | ||
import org.hyperskill.app.challenges.domain.model.Challenge | ||
import org.hyperskill.app.network.injection.NetworkModule | ||
|
||
class ChallengeDeserializationTest { | ||
companion object { | ||
private val TEST_JSON_STRING = """ | ||
{ | ||
"id": 6, | ||
"title": "QA ☾⋆", | ||
"description": "The Challenge! Ho-ho-ho!🎅\r\nHurry up and get yor prise!", | ||
"target_type": 14, | ||
"starting_date": "2023-11-02", | ||
"interval_duration_days": 1, | ||
"intervals_count": 1, | ||
"status": "not completed", | ||
"reward_link": null, | ||
"progress": | ||
[ | ||
false | ||
], | ||
"finish_date": "2023-11-03", | ||
"current_interval": null | ||
} | ||
""".trimIndent() | ||
} | ||
|
||
@Test | ||
fun `Test Challenge deserialization`() { | ||
val json = NetworkModule.provideJson() | ||
val expected = Challenge( | ||
id = 6, | ||
title = "QA ☾⋆", | ||
description = "The Challenge! Ho-ho-ho!🎅\r\nHurry up and get yor prise!", | ||
targetTypeValue = 14, | ||
startingDate = LocalDate.parse("2023-11-02"), | ||
intervalDurationDays = 1, | ||
intervalsCount = 1, | ||
statusValue = "not completed", | ||
rewardLink = null, | ||
progress = listOf(false), | ||
finishDate = LocalDate.parse("2023-11-03"), | ||
currentInterval = null | ||
) | ||
val decodedObject = json.decodeFromString(Challenge.serializer(), TEST_JSON_STRING) | ||
assertEquals(expected, decodedObject) | ||
} | ||
} |