-
Notifications
You must be signed in to change notification settings - Fork 16
Expand file tree
/
Copy pathLoginRepository.kt
More file actions
46 lines (38 loc) · 1.71 KB
/
LoginRepository.kt
File metadata and controls
46 lines (38 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.flatstack.android.login
import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.api.Response
import com.apollographql.apollo.coroutines.toDeferred
import com.flatstack.android.graphql.mutation.LoginMutation
import com.flatstack.android.model.entities.Session
import com.flatstack.android.model.network.NetworkBoundResource
import com.flatstack.android.model.network.errors.ErrorHandler
import com.flatstack.android.profile.AuthorizationModel
import com.flatstack.android.type.SignInInput
import kotlinx.coroutines.*
class LoginRepository(
private val apolloClient: ApolloClient,
private val authorizationModel: AuthorizationModel,
private val errorHandler: ErrorHandler,
private val loginMapper: LoginMapper
) : CoroutineScope {
override val coroutineContext = SupervisorJob() + Dispatchers.IO
fun login(username: String, password: String) =
object : NetworkBoundResource<Session, LoginMutation.Data>(coroutineContext, errorHandler) {
override suspend fun createCallAsync(): Deferred<Response<LoginMutation.Data>> =
apolloClient.mutate(loginMutation(username, password)).toDeferred()
override suspend fun saveCallResult(item: LoginMutation.Data?) {
authorizationModel.setSession(loginMapper.mapLogin(item?.signin))
}
override suspend fun loadFromDb() = authorizationModel.getSession()
}.asLiveData()
fun unAuthorize() {
launch {
authorizationModel.unAuthorize()
}
}
fun onDestroy() {
coroutineContext.cancelChildren()
}
private fun loginMutation(email: String, password: String) =
LoginMutation(SignInInput(email, password))
}