blob: da9b1155e125a7d4217db93bbc1fc464dc3d555b (
plain)
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
package mx.trackermap.TrackerMap.controllers
import android.util.Log
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import kotlinx.serialization.json.JsonPrimitive
import mx.trackermap.TrackerMap.client.apis.SessionApi
import mx.trackermap.TrackerMap.client.apis.UsersApi
import mx.trackermap.TrackerMap.client.models.SessionBody
import mx.trackermap.TrackerMap.client.models.User
@DelicateCoroutinesApi
class SessionController(
private val sessionApi: SessionApi,
private val usersApi: UsersApi
) {
sealed class LoginState {
object Loading: LoginState()
object EmailMissing : LoginState()
object PasswordMissing : LoginState()
object Failure : LoginState()
object Success : LoginState()
object SignOut : LoginState()
}
val loginStateFlow = MutableStateFlow<LoginState?>(null)
val userFlow = MutableStateFlow<User?>(null)
fun getSession() {
loginStateFlow.value = LoginState.Loading
GlobalScope.launch {
try {
userFlow.value = sessionApi.sessionGet()
Log.d("LoginViewModel", userFlow.value.toString())
loginStateFlow.value = LoginState.Success
} catch (e: Exception) {
loginStateFlow.value = LoginState.Failure
}
}
}
fun restoreSession() {
loginStateFlow.value = LoginState.Loading
GlobalScope.launch {
try {
userFlow.value = sessionApi.sessionGet()
Log.d("LoginViewModel", userFlow.value.toString())
loginStateFlow.value = LoginState.Success
} catch (e: Exception) {
Log.d("LoginViewModel", "No session")
}
}
}
fun login(body: SessionBody) {
val email = body.email.trim()
val password = body.password.trim()
val token = body.fcmToken
if (email.isEmpty()) {
loginStateFlow.value = LoginState.EmailMissing
return
}
if (password.isEmpty()) {
loginStateFlow.value = LoginState.PasswordMissing
return
}
loginStateFlow.value = LoginState.Loading
GlobalScope.launch {
try {
val session = sessionApi.sessionPost(email, password)
userFlow.value = session
usersApi.token = sessionApi.token
token?.let { registerFcmToken(it) }
loginStateFlow.value = LoginState.Success
} catch (e: Exception) {
loginStateFlow.value = LoginState.Failure
}
}
}
private suspend fun registerFcmToken(token: String) {
print("FCM token: $token\n")
try {
userFlow.value?.let { user ->
val attributes = user.attributes.toMutableMap()
attributes["notificationTokens"].toString().let { tokens ->
if (tokens == "null" || !tokens.contains(token)) {
if (tokens == "null") {
attributes["notificationTokens"] = JsonPrimitive(token)
} else if (tokens.contains(token)) {
attributes["notificationTokens"] = JsonPrimitive("$tokens,$token")
}
}
}
usersApi.usersIdPut(user.copy(
attributes = attributes
), user.id!!)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
fun logout() {
GlobalScope.launch {
loginStateFlow.value = LoginState.Loading
sessionApi.sessionDelete()
loginStateFlow.value = LoginState.SignOut
}
}
}
|