Skip to content

Commit

Permalink
#60 Mapper moved to repository
Browse files Browse the repository at this point in the history
  • Loading branch information
ntnsmirnov committed Jan 23, 2021
1 parent 7422ea0 commit 79babb4
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 45 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
@@ -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<CharacterResponse>
suspend fun getCharacter(id: Long): ICharacter

suspend fun getCharacters(offset: Int, limit: Int): BaseResponse<CharacterResponse>
suspend fun getCharacters(offset: Int, limit: Int): List<ICharacter>
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<BaseResponse<CharacterResponse>, List<ICharacter>>, ICharacterMapper {
class CharacterMapper : Mapper<BaseResponse<CharacterResponse>, List<ICharacter>> {

@Throws(NoSuchElementException::class)
override suspend fun map(from: BaseResponse<CharacterResponse>): List<ICharacter> =
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<BaseResponse<CharacterResponse>, List<ICharacter>>,
): MarvelRepository =
ServiceMarvelRepository(service, config, clock, characterMapper)

@Provides
fun provideCharacterMapper(): ICharacterMapper = CharacterMapper()
fun provideCharacterMapper(): Mapper<BaseResponse<CharacterResponse>, List<ICharacter>> = CharacterMapper()
}
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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<BaseResponse<CharacterResponse>, List<ICharacter>>
) : MarvelRepository {

/**
Expand All @@ -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<CharacterResponse> {
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()
}

/**
Expand All @@ -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<CharacterResponse> {
override suspend fun getCharacters(offset: Int, limit: Int): List<ICharacter> {
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)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<ICharacter>()
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<Int, ICharacter>() {

val networkState = MutableLiveData<NetworkState>()
Expand All @@ -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()))
}
}

Expand Down Expand Up @@ -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()))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -42,10 +41,8 @@ internal abstract class CharactersListModule {
@Provides
fun providesCharactersPageDataSource(
repository: MarvelRepository,
mapper: ICharacterMapper
) = CharacterPageDataSource(
repository = repository,
mapper = mapper
)
}
}

0 comments on commit 79babb4

Please sign in to comment.