Lilly
03/19/2021, 12:38 PMAlex Prince
03/19/2021, 1:52 PMJavier
03/19/2021, 3:00 PMLilly
03/19/2021, 3:36 PMin repo:
override fun executeCacheRequest(cacheOperation: () -> Data) {
cache[CACHE_DATA_KEY] = cacheOperation()
}
in use case:
val model = repo.fetchData()
repo.executeCacheRequest {
// do some transformation
}
right?
@Javier What does it mean in practices? Can you elaborate pls?Javier
03/19/2021, 3:37 PMJavier
03/19/2021, 3:40 PMinterface GetUser {
operator fun invoke(): Flow<Either<Error, User>>
}
// or if there is not a stream of data
interface GetUser {
suspend operator fun invoke(): Either<Error, User>
}Javier
03/19/2021, 3:41 PMLilly
03/19/2021, 3:43 PMAlex Prince
03/19/2021, 3:44 PMAlex Prince
03/19/2021, 3:45 PMLilly
03/19/2021, 3:45 PMJavier
03/19/2021, 3:45 PMAlex Prince
03/19/2021, 3:46 PMJavier
03/19/2021, 3:46 PMAlex Prince
03/19/2021, 3:46 PMJavier
03/19/2021, 3:47 PMLilly
03/19/2021, 3:48 PMAlex Prince
03/19/2021, 3:48 PMLilly
03/19/2021, 3:49 PMJavier
03/19/2021, 3:51 PMAlex Prince
03/19/2021, 3:51 PMLilly
03/19/2021, 3:52 PMJavier
03/19/2021, 3:52 PMinterface GetUser {
operator fun invoke(): Flow<Either<Error, User>>
}
// or if there is not a stream of data
interface GetUser {
suspend operator fun invoke(): Either<Error, User>
}Alex Prince
03/19/2021, 3:53 PMLilly
03/19/2021, 3:53 PMLilly
03/19/2021, 3:53 PMJavier
03/19/2021, 3:54 PMinterface GetUser {
suspend operator fun invoke(): Either<Error, User>
}
class GetUserImpl(val remote: Remote, val cache: Cache) {
suspend operator fun invoke(): Either<Error, User> {
if (cache.hasData) return Either.Right(cache.data.mapToDomain())
else return remote.fetch().mapToDomain().also { cache.insert(it.mapToWhatever()) }
}
}Lilly
03/19/2021, 3:55 PMJavier
03/19/2021, 3:56 PMGetUserJavier
03/19/2021, 3:56 PMAlex Prince
03/19/2021, 3:57 PMLilly
03/19/2021, 4:03 PMCache in domain layer, implement it in data layer and in use case you pass make Cache available and do your caching. That was also my first thoughts but wasn't sure if this is a common solution and allowed. Javier
03/19/2021, 4:08 PMJavier
03/19/2021, 4:09 PMJavier
03/19/2021, 4:10 PMJavier
03/19/2021, 4:10 PMJavier
03/19/2021, 4:11 PMinterface UserRepo {
fun getUser()...
fun deleteUser()...
}
class GetUser(private val userRepo: UserRepo) {
...
}
class DeleteUser(private val userRepo: UserRepo) {
...
}Javier
03/19/2021, 4:11 PMLilly
03/19/2021, 4:19 PMIn both cases, there are no data source logic in domainAgree. Where does
GetUserImpl class rely?Lilly
03/19/2021, 4:29 PMif (cache.hasData) return Either.Right(cache.data.mapToDomain())
else return remote.fetch().mapToDomain().also {
cache.insert(it.mapToWhatever())
}Javier
03/19/2021, 4:31 PMGetUserImpl should be in dataJavier
03/19/2021, 4:32 PMLilly
03/19/2021, 4:34 PMJavier
03/19/2021, 4:37 PMLilly
03/19/2021, 4:39 PMJavier
03/19/2021, 4:42 PMJavier
03/19/2021, 4:42 PMLilly
03/19/2021, 4:46 PMJavier
03/19/2021, 5:15 PMLilly
03/19/2021, 5:16 PMJavier
03/19/2021, 5:22 PMLilly
03/19/2021, 5:23 PMJavier
03/19/2021, 5:23 PMJavier
03/19/2021, 5:23 PMLilly
03/19/2021, 5:24 PMJavier
03/19/2021, 5:24 PMJavier
03/19/2021, 5:24 PMJavier
03/19/2021, 5:24 PMLilly
03/19/2021, 5:24 PMLilly
03/19/2021, 5:25 PMAlex Prince
03/19/2021, 5:25 PMAlex Prince
03/19/2021, 5:26 PMJavier
03/19/2021, 5:28 PMJavier
03/19/2021, 5:28 PMAlex Prince
03/19/2021, 5:29 PMLilly
03/19/2021, 5:29 PMJavier
03/19/2021, 5:30 PMJavier
03/19/2021, 5:30 PMAlex Prince
03/19/2021, 5:32 PMJavier
03/19/2021, 5:46 PMAlex Prince
03/19/2021, 5:47 PM