diff --git a/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/data/mapper/ICharacterMapper.kt b/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/data/mapper/ICharacterMapper.kt deleted file mode 100644 index b7580a14..00000000 --- a/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/data/mapper/ICharacterMapper.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.stepango.blockme.feature.characters.core.api.data.mapper - -import com.stepango.blockme.core.network.library.response.BaseResponse -import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse -import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter - -interface ICharacterMapper { - - @Throws(NoSuchElementException::class) - suspend fun map(from: BaseResponse): List -} \ No newline at end of file diff --git a/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/di/CharactersCoreFeature.kt b/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/di/CharactersCoreFeature.kt index 90bbdd32..eb823aef 100644 --- a/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/di/CharactersCoreFeature.kt +++ b/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/di/CharactersCoreFeature.kt @@ -1,11 +1,8 @@ package com.stepango.blockme.feature.characters.core.api.di -import com.stepango.blockme.feature.characters.core.api.data.mapper.ICharacterMapper import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository interface CharactersCoreFeature { fun getMarvelRepository(): MarvelRepository - - fun getCharacterMapper(): ICharacterMapper } \ No newline at end of file diff --git a/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/repository/MarvelRepository.kt b/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/repository/MarvelRepository.kt index fe9e6a99..cfbd6565 100644 --- a/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/repository/MarvelRepository.kt +++ b/application/feature/characters/core/api/src/main/java/com/stepango/blockme/feature/characters/core/api/domain/repository/MarvelRepository.kt @@ -1,11 +1,10 @@ package com.stepango.blockme.feature.characters.core.api.domain.repository -import com.stepango.blockme.core.network.library.response.BaseResponse -import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter interface MarvelRepository { - suspend fun getCharacter(id: Long): BaseResponse + suspend fun getCharacter(id: Long): ICharacter - suspend fun getCharacters(offset: Int, limit: Int): BaseResponse + suspend fun getCharacters(offset: Int, limit: Int): List } \ No newline at end of file diff --git a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/data/mapper/CharacterMapper.kt b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/data/mapper/CharacterMapper.kt index b00703bc..885da742 100644 --- a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/data/mapper/CharacterMapper.kt +++ b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/data/mapper/CharacterMapper.kt @@ -18,15 +18,13 @@ package com.stepango.blockme.feature.characters.core.impl.data.mapper import com.stepango.blockme.common.util.mapper.Mapper import com.stepango.blockme.core.network.library.response.BaseResponse -import com.stepango.blockme.feature.characters.core.api.data.mapper.ICharacterMapper import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.core.impl.domain.model.Character private const val IMAGE_URL_FORMAT = "%s.%s" -class CharacterMapper : - Mapper, List>, ICharacterMapper { +class CharacterMapper : Mapper, List> { @Throws(NoSuchElementException::class) override suspend fun map(from: BaseResponse): List = diff --git a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/di/CharactersCoreModule.kt b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/di/CharactersCoreModule.kt index 185366a4..554fc0c2 100644 --- a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/di/CharactersCoreModule.kt +++ b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/di/CharactersCoreModule.kt @@ -1,9 +1,12 @@ package com.stepango.blockme.feature.characters.core.impl.di import com.stepango.blockme.common.util.clock.Clock +import com.stepango.blockme.common.util.mapper.Mapper import com.stepango.blockme.core.network.library.Config -import com.stepango.blockme.feature.characters.core.api.data.mapper.ICharacterMapper +import com.stepango.blockme.core.network.library.response.BaseResponse +import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse import com.stepango.blockme.feature.characters.core.api.data.service.MarvelService +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository import com.stepango.blockme.feature.characters.core.impl.data.mapper.CharacterMapper import com.stepango.blockme.feature.characters.core.impl.domain.repository.ServiceMarvelRepository @@ -19,11 +22,16 @@ internal class CharactersCoreModule { @Provides fun provideMarvelService(retrofit: Retrofit): MarvelService = retrofit.create(MarvelService::class.java) - @Singleton - @Provides - fun provideMarvelRepository(service: MarvelService, config: Config, clock: Clock): MarvelRepository = - ServiceMarvelRepository(service, config, clock) + @Singleton + @Provides + fun provideMarvelRepository( + service: MarvelService, + config: Config, + clock: Clock, + characterMapper: Mapper, List>, + ): MarvelRepository = + ServiceMarvelRepository(service, config, clock, characterMapper) @Provides - fun provideCharacterMapper(): ICharacterMapper = CharacterMapper() + fun provideCharacterMapper(): Mapper, List> = CharacterMapper() } \ No newline at end of file diff --git a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepository.kt b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepository.kt index a0f966c9..8a26a55d 100644 --- a/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepository.kt +++ b/application/feature/characters/core/impl/src/main/java/com/stepango/blockme/feature/characters/core/impl/domain/repository/ServiceMarvelRepository.kt @@ -18,10 +18,12 @@ package com.stepango.blockme.feature.characters.core.impl.domain.repository import com.stepango.blockme.common.extensions.util.toMD5 import com.stepango.blockme.common.util.clock.Clock +import com.stepango.blockme.common.util.mapper.Mapper import com.stepango.blockme.core.network.library.Config import com.stepango.blockme.core.network.library.response.BaseResponse import com.stepango.blockme.feature.characters.core.api.data.response.CharacterResponse import com.stepango.blockme.feature.characters.core.api.data.service.MarvelService +import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository import javax.inject.Inject @@ -34,6 +36,7 @@ internal class ServiceMarvelRepository @Inject constructor( private val service: MarvelService, private val config: Config, private val clock: Clock, + private val characterMapper: Mapper, List> ) : MarvelRepository { /** @@ -42,15 +45,17 @@ internal class ServiceMarvelRepository @Inject constructor( * @param id A single character id. * @return Response for single character resource. */ - override suspend fun getCharacter(id: Long): BaseResponse { + override suspend fun getCharacter(id: Long): ICharacter { val timestamp = clock.currentTimeMillis().toString() - return service.getCharacter( + val result = service.getCharacter( id = id, apiKey = config.publicApiKey, hash = generateApiHash(timestamp), timestamp = timestamp ) + + return characterMapper.map(result).first() } /** @@ -60,15 +65,17 @@ internal class ServiceMarvelRepository @Inject constructor( * @param limit Limit the result set to the specified number of resources. * @return Response for comic characters resource. */ - override suspend fun getCharacters(offset: Int, limit: Int): BaseResponse { + override suspend fun getCharacters(offset: Int, limit: Int): List { val timestamp = clock.currentTimeMillis().toString() - return service.getCharacters( + val result = service.getCharacters( apiKey = config.publicApiKey, hash = generateApiHash(timestamp), timestamp = timestamp, offset = offset, limit = limit ) + + return characterMapper.map(result) } /** diff --git a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/CharacterDetailViewModel.kt b/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/CharacterDetailViewModel.kt index a1cf57ce..14cf6cfe 100644 --- a/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/CharacterDetailViewModel.kt +++ b/application/feature/characters/detail/impl/src/main/java/com/stepango/blockme/feature/characters/detail/impl/presentation/CharacterDetailViewModel.kt @@ -20,7 +20,6 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.stepango.blockme.feature.characters.core.api.data.mapper.ICharacterMapper import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository import com.stepango.blockme.feature.characters.favorite.api.domain.usecase.IGetCharacterFavoriteUseCase @@ -32,7 +31,6 @@ class CharacterDetailViewModel @Inject constructor( private val marvelRepository: MarvelRepository, private val getCharacterFavoriteUseCase: IGetCharacterFavoriteUseCase, private val setCharacterFavoriteUseCase: ISetCharacterFavoriteUseCase, - private val characterDetailMapper: ICharacterMapper, ) : ViewModel(), ICharacterDetailViewModel { private val _data = MutableLiveData() @@ -48,7 +46,7 @@ class CharacterDetailViewModel @Inject constructor( viewModelScope.launch { try { val result = marvelRepository.getCharacter(characterId) - _data.postValue(characterDetailMapper.map(result).first()) + _data.postValue(result) getCharacterFavoriteUseCase(characterId)?.let { _state.postValue(CharacterDetailViewState.AlreadyAddedToFavorite) diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/datasource/CharactersPageDataSource.kt b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/datasource/CharactersPageDataSource.kt index 9c3f4d49..25634aa0 100644 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/datasource/CharactersPageDataSource.kt +++ b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/data/datasource/CharactersPageDataSource.kt @@ -19,7 +19,6 @@ package com.stepango.blockme.feature.characters.list.impl.data.datasource import androidx.lifecycle.MutableLiveData import androidx.paging.PageKeyedDataSource import com.stepango.blockme.core.network.library.NetworkState -import com.stepango.blockme.feature.characters.core.api.data.mapper.ICharacterMapper import com.stepango.blockme.feature.characters.core.api.domain.model.ICharacter import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository import kotlinx.coroutines.CoroutineExceptionHandler @@ -40,7 +39,6 @@ const val PAGE_MAX_ELEMENTS = 50 // Rewrite on clean version with separate Repository with local/remote datasource open class CharacterPageDataSource @Inject constructor( private val repository: MarvelRepository, - private val mapper: ICharacterMapper, ) : PageKeyedDataSource() { val networkState = MutableLiveData() @@ -64,9 +62,8 @@ open class CharacterPageDataSource @Inject constructor( offset = PAGE_INIT_ELEMENTS, limit = PAGE_MAX_ELEMENTS ) - val data = mapper.map(response) - callback.onResult(data, null, PAGE_MAX_ELEMENTS) - networkState.postValue(NetworkState.Success(isEmptyResponse = data.isEmpty())) + callback.onResult(response, null, PAGE_MAX_ELEMENTS) + networkState.postValue(NetworkState.Success(isEmptyResponse = response.isEmpty())) } } @@ -96,9 +93,8 @@ open class CharacterPageDataSource @Inject constructor( offset = params.key, limit = PAGE_MAX_ELEMENTS ) - val data = mapper.map(response) - callback.onResult(data, params.key + PAGE_MAX_ELEMENTS) - networkState.postValue(NetworkState.Success(true, data.isEmpty())) + callback.onResult(response, params.key + PAGE_MAX_ELEMENTS) + networkState.postValue(NetworkState.Success(true, response.isEmpty())) } } diff --git a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/di/CharactersListModule.kt b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/di/CharactersListModule.kt index 5361e210..3d66550c 100644 --- a/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/di/CharactersListModule.kt +++ b/application/feature/characters/list/impl/src/main/java/com/stepango/blockme/feature/characters/list/impl/di/CharactersListModule.kt @@ -19,7 +19,6 @@ package com.stepango.blockme.feature.characters.list.impl.di import androidx.lifecycle.ViewModel import com.stepango.blockme.core.di.library.scopes.FeatureScope import com.stepango.blockme.core.mvvm.library.di.ViewModelKey -import com.stepango.blockme.feature.characters.core.api.data.mapper.ICharacterMapper import com.stepango.blockme.feature.characters.core.api.domain.repository.MarvelRepository import com.stepango.blockme.feature.characters.list.impl.data.datasource.CharacterPageDataSource import com.stepango.blockme.feature.characters.list.impl.ui.CharactersListViewModel @@ -42,10 +41,8 @@ internal abstract class CharactersListModule { @Provides fun providesCharactersPageDataSource( repository: MarvelRepository, - mapper: ICharacterMapper ) = CharacterPageDataSource( repository = repository, - mapper = mapper ) } }