feat(characters:domain): models + CharacterRepository interface (REDI-85)

- Character, CharacterStatus, CharactersPage(characters, nextPage), CharacterDetails.
- CharacterRepository interface returning Result<CharactersPage, DataError> and
  Result<CharacterDetails, DataError>. Pure Kotlin, no serialization annotations, no Android.
This commit is contained in:
2026-06-10 12:31:59 +02:00
parent 7af99f91f3
commit 600f12259d
5 changed files with 57 additions and 0 deletions

View File

@@ -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<CharactersPage, DataError>
suspend fun getCharacterDetails(id: Int): Result<CharacterDetails, DataError>
}

View File

@@ -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,
)

View File

@@ -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,
)

View File

@@ -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,
}

View File

@@ -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<Character>,
val nextPage: Int?,
)