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 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>
}
Lilly
03/19/2021, 3:43 PMAlex Prince
03/19/2021, 3:44 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 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 PMGetUser
Alex 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 PMinterface UserRepo {
fun getUser()...
fun deleteUser()...
}
class GetUser(private val userRepo: UserRepo) {
...
}
class DeleteUser(private val userRepo: UserRepo) {
...
}
Lilly
03/19/2021, 4:19 PMIn both cases, there are no data source logic in domainAgree. Where does
GetUserImpl
class rely?if (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 dataLilly
03/19/2021, 4:34 PMJavier
03/19/2021, 4:37 PMLilly
03/19/2021, 4:39 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 PMLilly
03/19/2021, 5:24 PMJavier
03/19/2021, 5:24 PMLilly
03/19/2021, 5:24 PMAlex Prince
03/19/2021, 5:25 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 PMAlex Prince
03/19/2021, 5:32 PMJavier
03/19/2021, 5:46 PMAlex Prince
03/19/2021, 5:47 PM