Skip to content

Commit 70b59ed

Browse files
committed
removed repo result
1 parent 567e574 commit 70b59ed

File tree

11 files changed

+53
-136
lines changed

11 files changed

+53
-136
lines changed
Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,11 @@
11
package com.monstarlab.arch.data
22

3-
import java.util.concurrent.TimeUnit
43

4+
/**
5+
* Empty for now, but could allow us to add cache helpers etc
6+
*/
57
abstract class Repository constructor(
6-
private val expirationInSeconds: Long = 30
7-
) {
8-
9-
private var lastFetch = 0L
108

11-
protected suspend inline fun onShouldFetch(block: suspend () -> Unit) {
12-
if(shouldFetch) block.invoke()
13-
}
14-
15-
protected val shouldFetch: Boolean
16-
get() {
17-
val shouldFetch = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - lastFetch) >= expirationInSeconds
18-
// Automatically update this value, since we're running API code in an if() and most likely updating local store
19-
if(shouldFetch) {
20-
lastFetch = System.currentTimeMillis()
21-
}
22-
return shouldFetch
23-
}
9+
) {
2410

2511
}

app/src/main/java/com/monstarlab/arch/extensions/RepositoryExtensions.kt

Lines changed: 13 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,56 +7,25 @@ import java.io.IOException
77
import kotlin.contracts.ExperimentalContracts
88
import kotlin.contracts.contract
99

10-
11-
inline fun <T> safeCall(
12-
block: () -> Response<T>
13-
): RepositoryResult<T> {
10+
inline fun <T> repoCall(
11+
block: () -> Response<T>
12+
): T {
1413
val response = block()
1514
val body = response.body()
1615
return when (response.isSuccessful && body != null) {
17-
true -> RepositoryResult.Success(body)
18-
false -> RepositoryResult.Error(response.toError())
19-
}
20-
}
21-
22-
fun <T> Response<out T>.toResult(): RepositoryResult<T> {
23-
val body = this.body()
24-
return when (this.isSuccessful && body != null) {
25-
true -> RepositoryResult.Success(body)
26-
false -> RepositoryResult.Error(this.toError())
16+
true -> body
17+
false -> throw response.toError()
2718
}
2819
}
2920

30-
fun <T, R> Response<out T>.toResultAndMap(transform: (T) -> R): RepositoryResult<R> {
31-
val body = this.body()
32-
return when (this.isSuccessful && body != null) {
33-
true -> RepositoryResult.Success(transform(body))
34-
false -> RepositoryResult.Error(this.toError())
21+
inline fun <T, R> Response<T>.mapSuccess(
22+
crossinline block: (T) -> R
23+
): R {
24+
val safeBody = body()
25+
if(this.isSuccessful && safeBody != null) {
26+
return block(safeBody)
27+
} else {
28+
throw toError()
3529
}
3630
}
3731

38-
39-
40-
sealed class RepositoryResult<out T> {
41-
data class Success<T>(val value: T): RepositoryResult<T>()
42-
data class Error(val error: ErrorModel): RepositoryResult<Nothing>()
43-
}
44-
45-
inline fun <T> RepositoryResult<T>.onSuccess(block: (T) -> Unit): RepositoryResult<T> {
46-
if(this is RepositoryResult.Success) block.invoke(value)
47-
return this
48-
}
49-
50-
inline fun <T> RepositoryResult<T>.onError(block: (ErrorModel) -> Unit): RepositoryResult<T> {
51-
if(this is RepositoryResult.Error) block.invoke(error)
52-
return this
53-
}
54-
55-
fun <T> RepositoryResult<T>.isError(): Boolean {
56-
return this is RepositoryResult.Error
57-
}
58-
59-
val <T> RepositoryResult<T>.errorOrNull: ErrorModel?
60-
get() {
61-
return if(this is RepositoryResult.Error) error else null
62-
}

app/src/main/java/com/monstarlab/arch/extensions/UseCaseExtensions.kt

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,21 @@ sealed class UseCaseResult<out T> {
1313
}
1414

1515
suspend inline fun <T> safeUseCase(
16-
crossinline block: suspend () -> RepositoryResult<T>
16+
crossinline block: suspend () -> T
1717
): UseCaseResult<T> = try {
18-
when (val repoResult = block()) {
19-
is RepositoryResult.Success -> UseCaseResult.Success(repoResult.value)
20-
is RepositoryResult.Error -> UseCaseResult.Error(repoResult.error)
21-
}
22-
} catch (e: Exception) {
18+
UseCaseResult.Success(block())
19+
} catch (e: ErrorModel) {
2320
UseCaseResult.Error(e.toError())
2421
}
2522

2623
inline fun <T> safeFlow(
27-
crossinline block: suspend () -> RepositoryResult<T>
24+
crossinline block: suspend () -> T
2825
): Flow<UseCaseResult<T>> = flow {
2926
try {
30-
val res = when (val repoResult = block()) {
31-
is RepositoryResult.Success -> UseCaseResult.Success(repoResult.value)
32-
is RepositoryResult.Error -> UseCaseResult.Error(repoResult.error)
33-
}
34-
emit(res)
27+
val repoResult = block()
28+
emit(UseCaseResult.Success(repoResult))
29+
} catch (e: ErrorModel) {
30+
emit(UseCaseResult.Error(e))
3531
} catch (e: Exception) {
3632
emit(UseCaseResult.Error(e.toError()))
3733
}
Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.monstarlab.core.data.repositories
22

33
import com.monstarlab.arch.data.*
4-
import com.monstarlab.arch.extensions.RepositoryResult
5-
import com.monstarlab.arch.extensions.isError
6-
import com.monstarlab.arch.extensions.onSuccess
7-
import com.monstarlab.arch.extensions.toResultAndMap
4+
import com.monstarlab.arch.extensions.*
85
import com.monstarlab.core.data.network.dtos.toEntity
96
import com.monstarlab.core.data.network.Api
107
import com.monstarlab.core.data.storage.PostPreferenceStore
@@ -16,17 +13,10 @@ class PostRepository @Inject constructor(
1613
private val postPreferenceStore: PostPreferenceStore
1714
): Repository() {
1815

19-
suspend fun getPosts(): RepositoryResult<List<Post>> {
20-
onShouldFetch {
21-
val result = api.getPosts().toResultAndMap { list -> list.map { it.toEntity() } }
22-
23-
result.onSuccess { list ->
24-
postPreferenceStore.addAll(list)
25-
}
26-
27-
if(result.isError()) return result
28-
}
29-
return RepositoryResult.Success(postPreferenceStore.getAll())
16+
suspend fun getPosts(): List<Post> {
17+
return api.getPosts()
18+
.mapSuccess { list -> list.map { it.toEntity() } }
19+
.also { postPreferenceStore.addAll(it) }
3020
}
3121

3222
}
Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.monstarlab.core.data.repositories
22

33
import com.monstarlab.arch.data.Repository
4-
import com.monstarlab.arch.extensions.RepositoryResult
5-
import com.monstarlab.arch.extensions.onError
6-
import com.monstarlab.arch.extensions.onSuccess
7-
import com.monstarlab.arch.extensions.toResultAndMap
4+
import com.monstarlab.arch.extensions.*
85
import com.monstarlab.core.data.network.Api
96
import com.monstarlab.core.data.network.dtos.toEntity
107
import com.monstarlab.core.data.storage.ResourcePreferenceStore
@@ -16,18 +13,10 @@ class ResourceRepository @Inject constructor(
1613
private val resourcePreferenceStore: ResourcePreferenceStore
1714
): Repository() {
1815

19-
suspend fun getResources(): RepositoryResult<List<Resource>> {
20-
onShouldFetch {
21-
val result = api.getResources().toResultAndMap { response -> response.data.map { it.toEntity() } }
22-
23-
result.onSuccess {
24-
resourcePreferenceStore.addAll(it)
25-
}
26-
27-
result.onError { return RepositoryResult.Error(it) }
28-
}
29-
30-
return RepositoryResult.Success(resourcePreferenceStore.getAll())
16+
suspend fun getResources(): List<Resource> {
17+
return api.getResources()
18+
.mapSuccess { response -> response.data.map { it.toEntity() } }
19+
.also { resourcePreferenceStore.addAll(it) }
3120
}
3221

3322
}

app/src/main/java/com/monstarlab/core/data/repositories/UserRepository.kt

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.monstarlab.arch.extensions.*
55
import com.monstarlab.core.data.mappers.toUser
66
import com.monstarlab.core.data.network.Api
77
import com.monstarlab.core.data.network.responses.TokenResponse
8+
import com.monstarlab.core.data.network.responses.UserResponse
89
import com.monstarlab.core.data.storage.UserPreferenceStore
910
import com.monstarlab.core.domain.error.ErrorModel
1011
import com.monstarlab.core.domain.model.User
@@ -17,25 +18,17 @@ class UserRepository @Inject constructor(
1718
private val userPreferenceStore: UserPreferenceStore
1819
): Repository() {
1920

20-
suspend fun login(email: String, password: String): RepositoryResult<TokenResponse> {
21-
return api.postLogin(email, password).toResult()
21+
suspend fun login(email: String, password: String): TokenResponse = repoCall {
22+
api.postLogin(email, password)
2223
}
2324

24-
suspend fun getUser(): RepositoryResult<User> {
25-
onShouldFetch {
26-
val result = api.getUser().toResultAndMap { it.data.toUser() }
27-
result.onSuccess { user ->
28-
userPreferenceStore.add(user)
25+
suspend fun getUser(): User {
26+
return api.getUser()
27+
.mapSuccess {
28+
it.data.toUser()
29+
}.also {
30+
userPreferenceStore.add(it)
2931
}
30-
if(result.isError()) return result
31-
}
32-
33-
val user = userPreferenceStore.get()
34-
35-
return when {
36-
user != null -> RepositoryResult.Success(user)
37-
else -> RepositoryResult.Error(ErrorModel.DataError.NoData)
38-
}
3932
}
4033

4134
}

app/src/main/java/com/monstarlab/core/domain/error/ErrorModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.monstarlab.core.domain.error
22

3-
sealed class ErrorModel {
3+
sealed class ErrorModel: Throwable() {
44

55
sealed class Http: ErrorModel() {
66
object BadRequest: Http()
@@ -13,7 +13,7 @@ sealed class ErrorModel {
1313

1414
data class Custom(
1515
val code: Int?,
16-
val message: String?,
16+
override val message: String?,
1717
val errorBody: String?
1818
): Http()
1919
}

app/src/main/java/com/monstarlab/core/usecases/blog/GetPostsUseCase.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.monstarlab.core.usecases.blog
22

33
import com.monstarlab.arch.extensions.UseCaseResult
4-
import com.monstarlab.arch.extensions.safeCall
54
import com.monstarlab.arch.extensions.safeFlow
6-
import com.monstarlab.arch.extensions.safeUseCase
75
import com.monstarlab.core.data.repositories.PostRepository
86
import com.monstarlab.core.domain.model.Post
97
import kotlinx.coroutines.flow.Flow

app/src/main/java/com/monstarlab/core/usecases/user/LoginUseCase.kt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.monstarlab.core.usecases.user
22

33
import com.monstarlab.arch.extensions.*
4-
import com.monstarlab.core.data.network.responses.TokenResponse
54
import com.monstarlab.core.data.repositories.UserRepository
65
import com.monstarlab.core.domain.model.User
7-
import kotlinx.coroutines.delay
86
import kotlinx.coroutines.flow.Flow
97
import javax.inject.Inject
108

@@ -13,13 +11,7 @@ class LoginUseCase @Inject constructor(
1311
) {
1412

1513
fun login(email: String, password: String): Flow<UseCaseResult<User>> = safeFlow {
16-
delay(2000)
17-
userRepository.login(email, password).onSuccess {
18-
// Insert into local token store
19-
}.onError {
20-
return@safeFlow RepositoryResult.Error(it)
21-
}
22-
14+
userRepository.login(email, password)
2315
userRepository.getUser()
2416
}
2517

app/src/main/java/com/monstarlab/features/login/LoginFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.monstarlab.R
1111
import com.monstarlab.arch.base.BaseFragment
1212
import com.monstarlab.arch.extensions.clicks
1313
import com.monstarlab.arch.extensions.collectFlow
14+
import com.monstarlab.arch.extensions.combineFlows
1415
import com.monstarlab.arch.extensions.viewBinding
1516
import com.monstarlab.databinding.FragmentLoginBinding
1617
import kotlinx.coroutines.flow.launchIn
@@ -41,7 +42,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
4142
}
4243

4344
collectFlow(viewModel.loadingFlow) { loading ->
44-
TransitionManager.beginDelayedTransition(binding.loginRootView)
45+
TransitionManager.beginDelayedTransition(binding.root)
4546
binding.loginEmailEditText.isEnabled = !loading
4647
binding.loginPasswordEditText.isEnabled = !loading
4748
binding.loginButton.visibility = if(loading) View.GONE else View.VISIBLE

0 commit comments

Comments
 (0)