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?, +)