From 600f12259d587c3f0b23f273f8b12808a5f90375 Mon Sep 17 00:00:00 2001 From: Adrian Kuta Date: Wed, 10 Jun 2026 12:31:59 +0200 Subject: [PATCH] feat(characters:domain): models + CharacterRepository interface (REDI-85) - Character, CharacterStatus, CharactersPage(characters, nextPage), CharacterDetails. - CharacterRepository interface returning Result and Result. Pure Kotlin, no serialization annotations, no Android. --- .../characters/domain/CharacterRepository.kt | 17 +++++++++++++++++ .../characters/domain/model/Character.kt | 10 ++++++++++ .../characters/domain/model/CharacterDetails.kt | 15 +++++++++++++++ .../characters/domain/model/CharacterStatus.kt | 8 ++++++++ .../characters/domain/model/CharactersPage.kt | 7 +++++++ 5 files changed, 57 insertions(+) create mode 100644 feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/CharacterRepository.kt create mode 100644 feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/Character.kt create mode 100644 feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharacterDetails.kt create mode 100644 feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharacterStatus.kt create mode 100644 feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharactersPage.kt diff --git a/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/CharacterRepository.kt b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/CharacterRepository.kt new file mode 100644 index 0000000..7cf27d1 --- /dev/null +++ b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/CharacterRepository.kt @@ -0,0 +1,17 @@ +package com.example.architecture.feature.characters.domain + +import com.example.architecture.core.domain.DataError +import com.example.architecture.core.domain.Result +import com.example.architecture.feature.characters.domain.model.CharacterDetails +import com.example.architecture.feature.characters.domain.model.CharactersPage + +/** + * Contract for the characters data layer. Lives in domain so presentation never depends on data. + * Returns the [DataError] supertype because an implementation may merge sources (e.g. an + * offline-first repository combining network + local). + */ +interface CharacterRepository { + suspend fun getCharacters(page: Int): Result + + suspend fun getCharacterDetails(id: Int): Result +} diff --git a/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/Character.kt b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/Character.kt new file mode 100644 index 0000000..1791113 --- /dev/null +++ b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/Character.kt @@ -0,0 +1,10 @@ +package com.example.architecture.feature.characters.domain.model + +/** A character as shown in the list. */ +data class Character( + val id: Int, + val name: String, + val status: CharacterStatus, + val species: String, + val imageUrl: String, +) diff --git a/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharacterDetails.kt b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharacterDetails.kt new file mode 100644 index 0000000..208323a --- /dev/null +++ b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharacterDetails.kt @@ -0,0 +1,15 @@ +package com.example.architecture.feature.characters.domain.model + +/** Full character profile shown on the detail screen. */ +data class CharacterDetails( + val id: Int, + val name: String, + val status: CharacterStatus, + val species: String, + val type: String, + val gender: String, + val origin: String, + val location: String, + val imageUrl: String, + val episodeCount: Int, +) diff --git a/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharacterStatus.kt b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharacterStatus.kt new file mode 100644 index 0000000..639844f --- /dev/null +++ b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharacterStatus.kt @@ -0,0 +1,8 @@ +package com.example.architecture.feature.characters.domain.model + +/** Life status of a character. Mapped from the API's string in the data layer. */ +enum class CharacterStatus { + ALIVE, + DEAD, + UNKNOWN, +} diff --git a/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharactersPage.kt b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharactersPage.kt new file mode 100644 index 0000000..f5f8546 --- /dev/null +++ b/feature/characters/domain/src/main/kotlin/com/example/architecture/feature/characters/domain/model/CharactersPage.kt @@ -0,0 +1,7 @@ +package com.example.architecture.feature.characters.domain.model + +/** One page of characters plus the next page index ([nextPage] is null when there are no more). */ +data class CharactersPage( + val characters: List, + val nextPage: Int?, +)