Update API version (#147)
* Bump VK Api version to 5.238 * Implemented new authorization flow (at the moment, without auto re-requesting token) * Add support for sticker pack preview attachments * Bump LongPoll to version 19 * Improved messages handling * Fixed coloring issues * Cache improvements * Archive screen with full functionality * Recomposition fixes * Markdown support for messages bubbles * Adjust app name font size based on screen width * Navigation related improvements * Add logout functionality
This commit is contained in:
@@ -25,8 +25,6 @@ sealed class State<out T> {
|
||||
data object InternalError : Error()
|
||||
|
||||
data class OAuthError(val error: OAuthErrorDomain) : Error()
|
||||
|
||||
data class TestError(val message: String) : Error()
|
||||
}
|
||||
|
||||
fun isLoading(): Boolean = this is Loading
|
||||
@@ -38,8 +36,8 @@ sealed class State<out T> {
|
||||
}
|
||||
|
||||
inline fun <T> State<T>.processState(
|
||||
error: (error: State.Error) -> (Unit),
|
||||
success: (data: T) -> (Unit),
|
||||
error: (error: State.Error) -> Unit,
|
||||
success: (data: T) -> Unit,
|
||||
idle: (() -> (Unit)) = {},
|
||||
loading: (() -> (Unit)) = {},
|
||||
any: () -> Unit = {}
|
||||
@@ -61,11 +59,41 @@ inline fun <T> State<T>.processState(
|
||||
}
|
||||
}
|
||||
|
||||
fun OAuthErrorDomain?.toStateApiError(): State.Error {
|
||||
if (this == null) return State.Error.ConnectionError
|
||||
return State.Error.OAuthError(this)
|
||||
}
|
||||
|
||||
fun RestApiErrorDomain?.toStateApiError(): State.Error = when (this) {
|
||||
null -> State.Error.ConnectionError
|
||||
else -> State.Error.ApiError(VkErrorCode.parse(code), message)
|
||||
}
|
||||
|
||||
fun <T : Any> ApiResult<T, OAuthErrorDomain>.asState() = when (this) {
|
||||
is ApiResult.Success -> State.Success(this.value)
|
||||
|
||||
is ApiResult.Failure.NetworkFailure -> State.Error.ConnectionError
|
||||
is ApiResult.Failure.UnknownFailure -> State.UNKNOWN_ERROR
|
||||
is ApiResult.Failure.HttpFailure -> this.error.toStateApiError()
|
||||
is ApiResult.Failure.ApiFailure -> this.error.toStateApiError()
|
||||
}
|
||||
|
||||
fun <T : Any, N> ApiResult<T, OAuthErrorDomain>.asState(successMapper: (T) -> N) =
|
||||
when (this) {
|
||||
is ApiResult.Success -> State.Success(successMapper(this.value))
|
||||
|
||||
is ApiResult.Failure.NetworkFailure -> State.Error.ConnectionError
|
||||
is ApiResult.Failure.UnknownFailure -> State.UNKNOWN_ERROR
|
||||
is ApiResult.Failure.HttpFailure -> this.error.toStateApiError()
|
||||
is ApiResult.Failure.ApiFailure -> this.error.toStateApiError()
|
||||
}
|
||||
|
||||
fun <T : Any, E : Any> ApiResult<T, E>.success(): T =
|
||||
when (this) {
|
||||
is ApiResult.Success -> value
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
|
||||
fun <T : Any> ApiResult<T, RestApiErrorDomain>.mapToState() = when (this) {
|
||||
is ApiResult.Success -> State.Success(this.value)
|
||||
|
||||
|
||||
@@ -6,17 +6,18 @@ object UserConfig {
|
||||
|
||||
private const val ARG_CURRENT_USER_ID = "current_user_id"
|
||||
|
||||
var currentUserId: Int = -1
|
||||
get() = AppSettings.getInt(ARG_CURRENT_USER_ID, -1)
|
||||
var currentUserId: Long = -1
|
||||
get() = AppSettings.getLong(ARG_CURRENT_USER_ID, -1)
|
||||
set(value) {
|
||||
field = value
|
||||
AppSettings.edit { putInt(ARG_CURRENT_USER_ID, value) }
|
||||
AppSettings.edit { putLong(ARG_CURRENT_USER_ID, value) }
|
||||
}
|
||||
|
||||
var userId: Int = -1
|
||||
var userId: Long = -1
|
||||
var accessToken: String = ""
|
||||
var fastToken: String? = ""
|
||||
var trustedHash: String? = null
|
||||
var exchangeToken: String? = null
|
||||
|
||||
fun clear() {
|
||||
currentUserId = -1
|
||||
|
||||
@@ -10,7 +10,7 @@ class VkGroupsMap(
|
||||
private val groups: List<VkGroupDomain>
|
||||
) {
|
||||
|
||||
private val map: HashMap<Int, VkGroupDomain> by lazy {
|
||||
private val map: HashMap<Long, VkGroupDomain> by lazy {
|
||||
HashMap(groups.associateBy(VkGroupDomain::id))
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ class VkGroupsMap(
|
||||
if (message.fromId >= 0) null
|
||||
else map[abs(message.fromId)]
|
||||
|
||||
fun group(groupId: Int): VkGroupDomain? = map[abs(groupId)]
|
||||
fun group(groupId: Long): VkGroupDomain? = map[abs(groupId)]
|
||||
|
||||
companion object {
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package dev.meloda.fast.data
|
||||
|
||||
import dev.meloda.fast.data.UserConfig.userId
|
||||
import dev.meloda.fast.model.api.domain.VkContactDomain
|
||||
import dev.meloda.fast.model.api.domain.VkConversation
|
||||
import dev.meloda.fast.model.api.domain.VkGroupDomain
|
||||
@@ -9,11 +10,11 @@ import kotlin.math.abs
|
||||
|
||||
object VkMemoryCache {
|
||||
|
||||
private val users: HashMap<Int, VkUser> = hashMapOf()
|
||||
private val groups: HashMap<Int, VkGroupDomain> = hashMapOf()
|
||||
private val messages: HashMap<Int, VkMessage> = hashMapOf()
|
||||
private val conversations: HashMap<Int, VkConversation> = hashMapOf()
|
||||
private val contacts: HashMap<Int, VkContactDomain> = hashMapOf()
|
||||
private val users: HashMap<Long, VkUser> = hashMapOf()
|
||||
private val groups: HashMap<Long, VkGroupDomain> = hashMapOf()
|
||||
private val messages: HashMap<Long, VkMessage> = hashMapOf()
|
||||
private val conversations: HashMap<Long, VkConversation> = hashMapOf()
|
||||
private val contacts: HashMap<Long, VkContactDomain> = hashMapOf()
|
||||
|
||||
fun appendUsers(users: List<VkUser>) {
|
||||
users.forEach { user -> VkMemoryCache.users[user.id] = user }
|
||||
@@ -37,83 +38,83 @@ object VkMemoryCache {
|
||||
contacts.forEach { contact -> VkMemoryCache.contacts[contact.userId] = contact }
|
||||
}
|
||||
|
||||
operator fun set(userId: Int, user: VkUser) {
|
||||
operator fun set(userid: Long, user: VkUser) {
|
||||
users[userId] = user
|
||||
}
|
||||
|
||||
operator fun set(groupId: Int, group: VkGroupDomain) {
|
||||
operator fun set(groupId: Long, group: VkGroupDomain) {
|
||||
groups[groupId] = group
|
||||
}
|
||||
|
||||
operator fun set(messageId: Int, message: VkMessage) {
|
||||
operator fun set(messageId: Long, message: VkMessage) {
|
||||
messages[messageId] = message
|
||||
}
|
||||
|
||||
operator fun set(conversationId: Int, conversation: VkConversation) {
|
||||
operator fun set(conversationId: Long, conversation: VkConversation) {
|
||||
conversations[conversationId] = conversation
|
||||
}
|
||||
|
||||
operator fun set(contactId: Int, contact: VkContactDomain) {
|
||||
operator fun set(contactId: Long, contact: VkContactDomain) {
|
||||
contacts[contactId] = contact
|
||||
}
|
||||
|
||||
fun getUser(id: Int): VkUser? {
|
||||
fun getUser(id: Long): VkUser? {
|
||||
return getUsers(id).firstOrNull()
|
||||
}
|
||||
|
||||
fun getUsers(vararg ids: Int): List<VkUser> {
|
||||
fun getUsers(vararg ids: Long): List<VkUser> {
|
||||
return getUsers(ids.toList())
|
||||
}
|
||||
|
||||
fun getUsers(ids: List<Int>): List<VkUser> {
|
||||
fun getUsers(ids: List<Long>): List<VkUser> {
|
||||
return ids.mapNotNull { id -> users[id] }
|
||||
}
|
||||
|
||||
fun getGroup(id: Int): VkGroupDomain? {
|
||||
fun getGroup(id: Long): VkGroupDomain? {
|
||||
return getGroups(id).firstOrNull()
|
||||
}
|
||||
|
||||
fun getGroups(vararg ids: Int): List<VkGroupDomain> {
|
||||
fun getGroups(vararg ids: Long): List<VkGroupDomain> {
|
||||
return getGroups(ids.toList())
|
||||
}
|
||||
|
||||
fun getGroups(ids: List<Int>): List<VkGroupDomain> {
|
||||
fun getGroups(ids: List<Long>): List<VkGroupDomain> {
|
||||
return ids.mapNotNull { id -> groups[id] }
|
||||
}
|
||||
|
||||
fun getMessage(id: Int): VkMessage? {
|
||||
fun getMessage(id: Long): VkMessage? {
|
||||
return getMessages(id).firstOrNull()
|
||||
}
|
||||
|
||||
fun getMessages(vararg ids: Int): List<VkMessage> {
|
||||
fun getMessages(vararg ids: Long): List<VkMessage> {
|
||||
return getMessages(ids.toList())
|
||||
}
|
||||
|
||||
fun getMessages(ids: List<Int>): List<VkMessage> {
|
||||
fun getMessages(ids: List<Long>): List<VkMessage> {
|
||||
return ids.mapNotNull { id -> messages[id] }
|
||||
}
|
||||
|
||||
fun getConversation(id: Int): VkConversation? {
|
||||
fun getConversation(id: Long): VkConversation? {
|
||||
return getConversations(id).firstOrNull()
|
||||
}
|
||||
|
||||
fun getConversations(vararg ids: Int): List<VkConversation> {
|
||||
fun getConversations(vararg ids: Long): List<VkConversation> {
|
||||
return getConversations(ids.toList())
|
||||
}
|
||||
|
||||
fun getConversations(ids: List<Int>): List<VkConversation> {
|
||||
fun getConversations(ids: List<Long>): List<VkConversation> {
|
||||
return ids.mapNotNull { id -> conversations[id] }
|
||||
}
|
||||
|
||||
fun getContact(id: Int): VkContactDomain? {
|
||||
fun getContact(id: Long): VkContactDomain? {
|
||||
return getContacts(id).firstOrNull()
|
||||
}
|
||||
|
||||
fun getContacts(vararg ids: Int): List<VkContactDomain> {
|
||||
fun getContacts(vararg ids: Long): List<VkContactDomain> {
|
||||
return getContacts(ids.toList())
|
||||
}
|
||||
|
||||
fun getContacts(ids: List<Int>): List<VkContactDomain> {
|
||||
fun getContacts(ids: List<Long>): List<VkContactDomain> {
|
||||
return ids.mapNotNull { id -> contacts[id] }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package dev.meloda.fast.data
|
||||
|
||||
import dev.meloda.fast.data.UserConfig.userId
|
||||
import dev.meloda.fast.model.api.data.VkMessageData
|
||||
import dev.meloda.fast.model.api.domain.VkConversation
|
||||
import dev.meloda.fast.model.api.domain.VkMessage
|
||||
@@ -9,7 +10,7 @@ class VkUsersMap(
|
||||
private val users: List<VkUser>
|
||||
) {
|
||||
|
||||
private val map: HashMap<Int, VkUser> by lazy {
|
||||
private val map: HashMap<Long, VkUser> by lazy {
|
||||
HashMap(users.associateBy(VkUser::id))
|
||||
}
|
||||
|
||||
@@ -35,7 +36,7 @@ class VkUsersMap(
|
||||
if (message.fromId > 0) map[message.fromId]
|
||||
else null
|
||||
|
||||
fun user(userId: Int): VkUser? = map[userId]
|
||||
fun user(userid: Long): VkUser? = map[userId]
|
||||
|
||||
companion object {
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package dev.meloda.fast.data
|
||||
|
||||
import dev.meloda.fast.model.BaseError
|
||||
import dev.meloda.fast.network.VkErrorCode
|
||||
|
||||
object VkUtils {
|
||||
|
||||
fun parseError(error: State.Error): BaseError? {
|
||||
return when (error) {
|
||||
is State.Error.ApiError -> {
|
||||
when (error.errorCode) {
|
||||
VkErrorCode.USER_AUTHORIZATION_FAILED -> {
|
||||
if (error.errorMessage.startsWith(
|
||||
"User authorization failed: user is blocked."
|
||||
)
|
||||
) {
|
||||
BaseError.AccountBlocked
|
||||
} else {
|
||||
BaseError.SessionExpired
|
||||
}
|
||||
}
|
||||
|
||||
else -> BaseError.SimpleError(message = error.errorMessage)
|
||||
}
|
||||
}
|
||||
|
||||
State.Error.ConnectionError -> BaseError.ConnectionError
|
||||
State.Error.InternalError -> BaseError.InternalError
|
||||
State.Error.UnknownError -> BaseError.UnknownError
|
||||
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,32 @@
|
||||
package dev.meloda.fast.data.api.auth
|
||||
|
||||
import com.slack.eithernet.ApiResult
|
||||
import dev.meloda.fast.model.api.responses.ExchangeSilentTokenResponse
|
||||
import dev.meloda.fast.model.api.responses.GetAnonymTokenResponse
|
||||
import dev.meloda.fast.model.api.responses.GetExchangeTokenResponse
|
||||
import dev.meloda.fast.model.api.responses.ValidatePhoneResponse
|
||||
import dev.meloda.fast.network.RestApiErrorDomain
|
||||
import com.slack.eithernet.ApiResult
|
||||
|
||||
interface AuthRepository {
|
||||
|
||||
suspend fun logout(): ApiResult<Int, RestApiErrorDomain>
|
||||
|
||||
suspend fun validatePhone(
|
||||
validationSid: String
|
||||
): ApiResult<ValidatePhoneResponse, RestApiErrorDomain>
|
||||
|
||||
suspend fun getAnonymToken(
|
||||
clientId: String,
|
||||
clientSecret: String
|
||||
): ApiResult<GetAnonymTokenResponse, RestApiErrorDomain>
|
||||
|
||||
suspend fun exchangeSilentToken(
|
||||
anonymToken: String,
|
||||
silentToken: String,
|
||||
silentUuid: String
|
||||
): ApiResult<ExchangeSilentTokenResponse, RestApiErrorDomain>
|
||||
|
||||
suspend fun getExchangeToken(
|
||||
accessToken: String
|
||||
): ApiResult<GetExchangeTokenResponse, RestApiErrorDomain>
|
||||
}
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
package dev.meloda.fast.data.api.auth
|
||||
|
||||
import com.slack.eithernet.ApiResult
|
||||
import dev.meloda.fast.common.VkConstants
|
||||
import dev.meloda.fast.model.api.requests.ExchangeSilentTokenRequest
|
||||
import dev.meloda.fast.model.api.requests.GetAnonymTokenRequest
|
||||
import dev.meloda.fast.model.api.requests.GetExchangeTokenRequest
|
||||
import dev.meloda.fast.model.api.responses.ExchangeSilentTokenResponse
|
||||
import dev.meloda.fast.model.api.responses.GetAnonymTokenResponse
|
||||
import dev.meloda.fast.model.api.responses.GetExchangeTokenResponse
|
||||
import dev.meloda.fast.model.api.responses.ValidatePhoneResponse
|
||||
import dev.meloda.fast.network.RestApiErrorDomain
|
||||
import dev.meloda.fast.network.mapApiDefault
|
||||
import dev.meloda.fast.network.service.auth.AuthService
|
||||
import com.slack.eithernet.ApiResult
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
@@ -12,9 +19,50 @@ class AuthRepositoryImpl(
|
||||
private val service: AuthService
|
||||
) : AuthRepository {
|
||||
|
||||
override suspend fun logout(): ApiResult<Int, RestApiErrorDomain> =
|
||||
withContext(Dispatchers.IO) {
|
||||
service.logout(
|
||||
clientId = VkConstants.MESSENGER_APP_ID.toString(),
|
||||
clientSecret = VkConstants.MESSENGER_APP_SECRET
|
||||
).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun validatePhone(
|
||||
validationSid: String
|
||||
): ApiResult<ValidatePhoneResponse, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
service.validatePhone(validationSid).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun getAnonymToken(
|
||||
clientId: String,
|
||||
clientSecret: String
|
||||
): ApiResult<GetAnonymTokenResponse, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = GetAnonymTokenRequest(
|
||||
clientId = clientId,
|
||||
clientSecret = clientSecret
|
||||
)
|
||||
|
||||
service.getAnonymToken(requestModel.map).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun exchangeSilentToken(
|
||||
anonymToken: String,
|
||||
silentToken: String,
|
||||
silentUuid: String
|
||||
): ApiResult<ExchangeSilentTokenResponse, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = ExchangeSilentTokenRequest(
|
||||
anonymToken = anonymToken,
|
||||
silentToken = silentToken,
|
||||
silentUuid = silentUuid
|
||||
)
|
||||
|
||||
service.exchangeSilentToken(requestModel.map).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun getExchangeToken(
|
||||
accessToken: String
|
||||
): ApiResult<GetExchangeTokenResponse, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = GetExchangeTokenRequest(accessToken = accessToken)
|
||||
service.getExchangeToken(requestModel.map).mapApiDefault()
|
||||
}
|
||||
}
|
||||
|
||||
+14
-6
@@ -1,22 +1,30 @@
|
||||
package dev.meloda.fast.data.api.conversations
|
||||
|
||||
import com.slack.eithernet.ApiResult
|
||||
import dev.meloda.fast.model.ConversationsFilter
|
||||
import dev.meloda.fast.model.api.domain.VkConversation
|
||||
import dev.meloda.fast.network.RestApiErrorDomain
|
||||
|
||||
interface ConversationsRepository {
|
||||
|
||||
suspend fun storeConversations(conversations: List<VkConversation>)
|
||||
|
||||
suspend fun getConversations(
|
||||
count: Int?,
|
||||
offset: Int?
|
||||
offset: Int?,
|
||||
filter: ConversationsFilter
|
||||
): ApiResult<List<VkConversation>, RestApiErrorDomain>
|
||||
|
||||
suspend fun getConversationsById(
|
||||
peerIds: List<Int>
|
||||
peerIds: List<Long>,
|
||||
extended: Boolean? = null,
|
||||
fields: String? = null
|
||||
): ApiResult<List<VkConversation>, RestApiErrorDomain>
|
||||
|
||||
suspend fun storeConversations(conversations: List<VkConversation>)
|
||||
suspend fun delete(peerId: Int): ApiResult<Int, RestApiErrorDomain>
|
||||
suspend fun pin(peerId: Int): ApiResult<Int, RestApiErrorDomain>
|
||||
suspend fun unpin(peerId: Int): ApiResult<Int, RestApiErrorDomain>
|
||||
suspend fun delete(peerId: Long): ApiResult<Long, RestApiErrorDomain>
|
||||
suspend fun pin(peerId: Long): ApiResult<Int, RestApiErrorDomain>
|
||||
suspend fun unpin(peerId: Long): ApiResult<Int, RestApiErrorDomain>
|
||||
suspend fun reorderPinned(peerIds: List<Long>): ApiResult<Int, RestApiErrorDomain>
|
||||
suspend fun archive(peerId: Long): ApiResult<Int, RestApiErrorDomain>
|
||||
suspend fun unarchive(peerId: Long): ApiResult<Int, RestApiErrorDomain>
|
||||
}
|
||||
|
||||
+78
-31
@@ -6,37 +6,50 @@ import dev.meloda.fast.data.VkGroupsMap
|
||||
import dev.meloda.fast.data.VkMemoryCache
|
||||
import dev.meloda.fast.data.VkUsersMap
|
||||
import dev.meloda.fast.database.dao.ConversationDao
|
||||
import dev.meloda.fast.database.dao.GroupDao
|
||||
import dev.meloda.fast.database.dao.MessageDao
|
||||
import dev.meloda.fast.database.dao.UserDao
|
||||
import dev.meloda.fast.model.ConversationsFilter
|
||||
import dev.meloda.fast.model.api.data.VkContactData
|
||||
import dev.meloda.fast.model.api.data.VkGroupData
|
||||
import dev.meloda.fast.model.api.data.VkUserData
|
||||
import dev.meloda.fast.model.api.data.asDomain
|
||||
import dev.meloda.fast.model.api.domain.VkConversation
|
||||
import dev.meloda.fast.model.api.domain.VkGroupDomain
|
||||
import dev.meloda.fast.model.api.domain.VkMessage
|
||||
import dev.meloda.fast.model.api.domain.VkUser
|
||||
import dev.meloda.fast.model.api.domain.asEntity
|
||||
import dev.meloda.fast.model.api.requests.ConversationsDeleteRequest
|
||||
import dev.meloda.fast.model.api.requests.ConversationsGetRequest
|
||||
import dev.meloda.fast.model.api.requests.ConversationsPinRequest
|
||||
import dev.meloda.fast.model.api.requests.ConversationsUnpinRequest
|
||||
import dev.meloda.fast.network.RestApiErrorDomain
|
||||
import dev.meloda.fast.network.mapApiDefault
|
||||
import dev.meloda.fast.network.mapApiResult
|
||||
import dev.meloda.fast.network.service.conversations.ConversationsService
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
class ConversationsRepositoryImpl(
|
||||
private val conversationsService: ConversationsService,
|
||||
private val messageDao: MessageDao,
|
||||
private val userDao: UserDao,
|
||||
private val groupDao: GroupDao,
|
||||
private val conversationDao: ConversationDao
|
||||
) : ConversationsRepository {
|
||||
|
||||
override suspend fun storeConversations(conversations: List<VkConversation>) {
|
||||
conversationDao.insertAll(conversations.map(VkConversation::asEntity))
|
||||
}
|
||||
|
||||
override suspend fun getConversations(
|
||||
count: Int?,
|
||||
offset: Int?
|
||||
offset: Int?,
|
||||
filter: ConversationsFilter
|
||||
): ApiResult<List<VkConversation>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = ConversationsGetRequest(
|
||||
count = count,
|
||||
offset = offset,
|
||||
fields = VkConstants.ALL_FIELDS,
|
||||
filter = "all",
|
||||
filter = filter,
|
||||
extended = true,
|
||||
startMessageId = null
|
||||
)
|
||||
@@ -56,7 +69,7 @@ class ConversationsRepositoryImpl(
|
||||
VkMemoryCache.appendGroups(groupsList)
|
||||
VkMemoryCache.appendContacts(contactsList)
|
||||
|
||||
response.items.map { item ->
|
||||
val conversations = response.items.map { item ->
|
||||
val lastMessage = item.lastMessage?.asDomain()?.let { message ->
|
||||
message.copy(
|
||||
user = usersMap.messageUser(message),
|
||||
@@ -72,6 +85,17 @@ class ConversationsRepositoryImpl(
|
||||
).also { VkMemoryCache[conversation.id] = it }
|
||||
}
|
||||
}
|
||||
|
||||
val messages = conversations.mapNotNull(VkConversation::lastMessage)
|
||||
|
||||
launch(Dispatchers.IO) {
|
||||
conversationDao.insertAll(conversations.map(VkConversation::asEntity))
|
||||
messageDao.insertAll(messages.map(VkMessage::asEntity))
|
||||
userDao.insertAll(profilesList.map(VkUser::asEntity))
|
||||
groupDao.insertAll(groupsList.map(VkGroupDomain::asEntity))
|
||||
}
|
||||
|
||||
conversations
|
||||
},
|
||||
errorMapper = { error ->
|
||||
error?.toDomain()
|
||||
@@ -80,13 +104,16 @@ class ConversationsRepositoryImpl(
|
||||
}
|
||||
|
||||
override suspend fun getConversationsById(
|
||||
peerIds: List<Int>
|
||||
peerIds: List<Long>,
|
||||
extended: Boolean?,
|
||||
fields: String?
|
||||
): ApiResult<List<VkConversation>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestParams = mapOf(
|
||||
"peer_ids" to peerIds.joinToString(separator = ","),
|
||||
"extended" to "1",
|
||||
"fields" to VkConstants.ALL_FIELDS
|
||||
)
|
||||
val requestParams = mutableMapOf(
|
||||
"peer_ids" to peerIds.joinToString(separator = ",")
|
||||
).apply {
|
||||
extended?.let { this["extended"] = if (it) "1" else "0" }
|
||||
fields?.let { this["fields"] = it }
|
||||
}
|
||||
|
||||
conversationsService.getConversationsById(requestParams).mapApiResult(
|
||||
successMapper = { apiResponse ->
|
||||
@@ -99,11 +126,7 @@ class ConversationsRepositoryImpl(
|
||||
val usersMap = VkUsersMap.forUsers(profilesList)
|
||||
val groupsMap = VkGroupsMap.forGroups(groupsList)
|
||||
|
||||
VkMemoryCache.appendUsers(profilesList)
|
||||
VkMemoryCache.appendGroups(groupsList)
|
||||
VkMemoryCache.appendContacts(contactsList)
|
||||
|
||||
response.items.map { item ->
|
||||
val conversations = response.items.map { item ->
|
||||
item.asDomain().let { conversation ->
|
||||
conversation.copy(
|
||||
user = usersMap.conversationUser(conversation),
|
||||
@@ -111,6 +134,18 @@ class ConversationsRepositoryImpl(
|
||||
).also { VkMemoryCache[conversation.id] = it }
|
||||
}
|
||||
}
|
||||
|
||||
launch(Dispatchers.IO) {
|
||||
conversationDao.insertAll(conversations.map(VkConversation::asEntity))
|
||||
userDao.insertAll(profilesList.map(VkUser::asEntity))
|
||||
groupDao.insertAll(groupsList.map(VkGroupDomain::asEntity))
|
||||
}
|
||||
|
||||
VkMemoryCache.appendUsers(profilesList)
|
||||
VkMemoryCache.appendGroups(groupsList)
|
||||
VkMemoryCache.appendContacts(contactsList)
|
||||
|
||||
conversations
|
||||
},
|
||||
errorMapper = { error ->
|
||||
error?.toDomain()
|
||||
@@ -118,31 +153,43 @@ class ConversationsRepositoryImpl(
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun storeConversations(conversations: List<VkConversation>) {
|
||||
conversationDao.insertAll(conversations.map(VkConversation::asEntity))
|
||||
}
|
||||
|
||||
override suspend fun delete(peerId: Int): ApiResult<Int, RestApiErrorDomain> =
|
||||
override suspend fun delete(peerId: Long): ApiResult<Long, RestApiErrorDomain> =
|
||||
withContext(Dispatchers.IO) {
|
||||
val requestModel = ConversationsDeleteRequest(peerId = peerId)
|
||||
|
||||
conversationsService.delete(requestModel.map).mapApiResult(
|
||||
conversationsService.delete(mapOf("peer_id" to peerId.toString())).mapApiResult(
|
||||
successMapper = { response -> response.requireResponse().lastDeletedId },
|
||||
errorMapper = { error -> error?.toDomain() }
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun pin(
|
||||
peerId: Int
|
||||
peerId: Long
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = ConversationsPinRequest(peerId = peerId)
|
||||
conversationsService.pin(requestModel.map).mapApiDefault()
|
||||
conversationsService.pin(mapOf("peer_id" to peerId.toString())).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun unpin(
|
||||
peerId: Int
|
||||
peerId: Long
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = ConversationsUnpinRequest(peerId = peerId)
|
||||
conversationsService.unpin(requestModel.map).mapApiDefault()
|
||||
conversationsService.unpin(mapOf("peer_id" to peerId.toString())).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun reorderPinned(
|
||||
peerIds: List<Long>
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
conversationsService
|
||||
.reorderPinned(mapOf("peer_ids" to peerIds.joinToString(",")))
|
||||
.mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun archive(
|
||||
peerId: Long
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
conversationsService.archive(mapOf("peer_id" to peerId.toString())).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun unarchive(
|
||||
peerId: Long
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
conversationsService.unarchive(mapOf("peer_id" to peerId.toString())).mapApiDefault()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ class FilesRepository(
|
||||
// AUDIO_MESSAGE("audio_message")
|
||||
// }
|
||||
//
|
||||
// suspend fun getMessagesUploadServer(peerId: Int, type: FileType) =
|
||||
// suspend fun getMessagesUploadServer(peerid: Long, type: FileType) =
|
||||
// filesService.getUploadServer(
|
||||
// mapOf(
|
||||
// "peer_id" to peerId.toString(),
|
||||
|
||||
@@ -22,7 +22,7 @@ interface FriendsRepository {
|
||||
suspend fun getOnlineFriends(
|
||||
count: Int?,
|
||||
offset: Int?
|
||||
): ApiResult<List<Int>, RestApiErrorDomain>
|
||||
): ApiResult<List<Long>, RestApiErrorDomain>
|
||||
|
||||
suspend fun storeUsers(users: List<VkUser>)
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package dev.meloda.fast.data.api.friends
|
||||
|
||||
import dev.meloda.fast.common.VkConstants
|
||||
import dev.meloda.fast.data.VkMemoryCache
|
||||
import dev.meloda.fast.database.dao.UsersDao
|
||||
import dev.meloda.fast.database.dao.UserDao
|
||||
import dev.meloda.fast.model.FriendsInfo
|
||||
import dev.meloda.fast.model.api.data.VkUserData
|
||||
import dev.meloda.fast.model.api.domain.VkUser
|
||||
@@ -21,7 +21,7 @@ import kotlinx.coroutines.withContext
|
||||
|
||||
class FriendsRepositoryImpl(
|
||||
private val service: FriendsService,
|
||||
private val dao: UsersDao
|
||||
private val dao: UserDao
|
||||
) : FriendsRepository {
|
||||
|
||||
override suspend fun getAllFriends(
|
||||
@@ -69,7 +69,7 @@ class FriendsRepositoryImpl(
|
||||
override suspend fun getOnlineFriends(
|
||||
count: Int?,
|
||||
offset: Int?
|
||||
): ApiResult<List<Int>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
): ApiResult<List<Long>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = GetOnlineFriendsRequest(
|
||||
order = "hints",
|
||||
count = count,
|
||||
|
||||
@@ -1,91 +1,112 @@
|
||||
package dev.meloda.fast.data.api.messages
|
||||
|
||||
import com.slack.eithernet.ApiResult
|
||||
import dev.meloda.fast.model.api.data.VkChatData
|
||||
import dev.meloda.fast.model.api.domain.VkAttachment
|
||||
import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage
|
||||
import dev.meloda.fast.model.api.domain.VkMessage
|
||||
import dev.meloda.fast.model.api.responses.MessagesGetConversationMembersResponse
|
||||
import dev.meloda.fast.model.api.responses.MessagesSendResponse
|
||||
import dev.meloda.fast.network.RestApiErrorDomain
|
||||
|
||||
interface MessagesRepository {
|
||||
|
||||
suspend fun storeMessages(messages: List<VkMessage>)
|
||||
|
||||
suspend fun getHistory(
|
||||
conversationId: Int,
|
||||
conversationId: Long,
|
||||
offset: Int?,
|
||||
count: Int?
|
||||
): ApiResult<MessagesHistoryInfo, RestApiErrorDomain>
|
||||
|
||||
suspend fun getById(
|
||||
messagesIds: List<Int>,
|
||||
peerCmIds: List<Long>?,
|
||||
peerId: Long?,
|
||||
messagesIds: List<Long>?,
|
||||
cmIds: List<Long>?,
|
||||
extended: Boolean?,
|
||||
fields: String?
|
||||
): ApiResult<List<VkMessage>, RestApiErrorDomain>
|
||||
|
||||
suspend fun send(
|
||||
peerId: Int,
|
||||
randomId: Int,
|
||||
peerId: Long,
|
||||
randomId: Long,
|
||||
message: String?,
|
||||
replyTo: Int?,
|
||||
replyTo: Long?,
|
||||
attachments: List<VkAttachment>?
|
||||
): ApiResult<Int, RestApiErrorDomain>
|
||||
): ApiResult<MessagesSendResponse, RestApiErrorDomain>
|
||||
|
||||
suspend fun markAsRead(
|
||||
peerId: Int,
|
||||
startMessageId: Int?
|
||||
peerId: Long,
|
||||
startMessageId: Long?
|
||||
): ApiResult<Int, RestApiErrorDomain>
|
||||
|
||||
suspend fun getHistoryAttachments(
|
||||
peerId: Int,
|
||||
peerId: Long,
|
||||
count: Int?,
|
||||
offset: Int?,
|
||||
attachmentTypes: List<String>,
|
||||
conversationMessageId: Int
|
||||
cmId: Long
|
||||
): ApiResult<List<VkAttachmentHistoryMessage>, RestApiErrorDomain>
|
||||
|
||||
suspend fun createChat(
|
||||
userIds: List<Int>?,
|
||||
userIds: List<Long>?,
|
||||
title: String?
|
||||
): ApiResult<Int, RestApiErrorDomain>
|
||||
): ApiResult<Long, RestApiErrorDomain>
|
||||
|
||||
suspend fun pin(
|
||||
peerId: Int,
|
||||
messageId: Int?,
|
||||
conversationMessageId: Int?
|
||||
peerId: Long,
|
||||
messageId: Long? = null,
|
||||
cmId: Long? = null
|
||||
): ApiResult<VkMessage, RestApiErrorDomain>
|
||||
|
||||
suspend fun unpin(
|
||||
peerId: Int
|
||||
peerId: Long
|
||||
): ApiResult<Int, RestApiErrorDomain>
|
||||
|
||||
suspend fun markAsImportant(
|
||||
peerId: Int,
|
||||
messageIds: List<Int>?,
|
||||
conversationMessageIds: List<Int>?,
|
||||
peerId: Long,
|
||||
messageIds: List<Long>? = null,
|
||||
cmIds: List<Long>? = null,
|
||||
important: Boolean
|
||||
): ApiResult<List<Int>, RestApiErrorDomain>
|
||||
): ApiResult<List<Long>, RestApiErrorDomain>
|
||||
|
||||
suspend fun delete(
|
||||
peerId: Int,
|
||||
messageIds: List<Int>?,
|
||||
conversationMessageIds: List<Int>?,
|
||||
peerId: Long,
|
||||
messageIds: List<Long>?,
|
||||
cmIds: List<Long>?,
|
||||
spam: Boolean,
|
||||
deleteForAll: Boolean
|
||||
): ApiResult<List<Any>, RestApiErrorDomain>
|
||||
|
||||
suspend fun storeMessages(messages: List<VkMessage>)
|
||||
//
|
||||
// suspend fun edit(
|
||||
// params: MessagesEditRequest
|
||||
// ): ApiResult<Int, RestApiErrorDomain>
|
||||
//
|
||||
// suspend fun getChat(
|
||||
// params: MessagesGetChatRequest
|
||||
// ): ApiResult<VkChatData, RestApiErrorDomain>
|
||||
//
|
||||
// suspend fun getConversationMembers(
|
||||
// params: MessagesGetConversationMembersRequest
|
||||
// ): ApiResult<MessagesGetConversationMembersResponse, RestApiErrorDomain>
|
||||
//
|
||||
// suspend fun removeChatUser(
|
||||
// params: MessagesRemoveChatUserRequest
|
||||
// ): ApiResult<Int, RestApiErrorDomain>
|
||||
suspend fun edit(
|
||||
peerId: Long,
|
||||
messageId: Long? = null,
|
||||
cmId: Long? = null,
|
||||
message: String? = null,
|
||||
lat: Float? = null,
|
||||
long: Float? = null,
|
||||
attachments: List<VkAttachment>? = null,
|
||||
notParseLinks: Boolean = false,
|
||||
keepSnippets: Boolean = true,
|
||||
keepForwardedMessages: Boolean = true
|
||||
): ApiResult<Int, RestApiErrorDomain>
|
||||
|
||||
suspend fun getChat(
|
||||
chatId: Long,
|
||||
fields: String? = null
|
||||
): ApiResult<VkChatData, RestApiErrorDomain>
|
||||
|
||||
suspend fun getConversationMembers(
|
||||
peerId: Long,
|
||||
offset: Int? = null,
|
||||
count: Int? = null,
|
||||
extended: Boolean? = null,
|
||||
fields: String? = null
|
||||
): ApiResult<MessagesGetConversationMembersResponse, RestApiErrorDomain>
|
||||
|
||||
suspend fun removeChatUser(
|
||||
chatId: Long,
|
||||
memberId: Long
|
||||
): ApiResult<Int, RestApiErrorDomain>
|
||||
}
|
||||
|
||||
+151
-85
@@ -5,40 +5,57 @@ import dev.meloda.fast.common.VkConstants
|
||||
import dev.meloda.fast.data.VkGroupsMap
|
||||
import dev.meloda.fast.data.VkMemoryCache
|
||||
import dev.meloda.fast.data.VkUsersMap
|
||||
import dev.meloda.fast.database.dao.ConversationDao
|
||||
import dev.meloda.fast.database.dao.GroupDao
|
||||
import dev.meloda.fast.database.dao.MessageDao
|
||||
import dev.meloda.fast.database.dao.UserDao
|
||||
import dev.meloda.fast.model.api.data.VkAttachmentHistoryMessageData
|
||||
import dev.meloda.fast.model.api.data.VkChatData
|
||||
import dev.meloda.fast.model.api.data.VkContactData
|
||||
import dev.meloda.fast.model.api.data.VkGroupData
|
||||
import dev.meloda.fast.model.api.data.VkUserData
|
||||
import dev.meloda.fast.model.api.data.asDomain
|
||||
import dev.meloda.fast.model.api.domain.VkAttachment
|
||||
import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage
|
||||
import dev.meloda.fast.model.api.domain.VkConversation
|
||||
import dev.meloda.fast.model.api.domain.VkGroupDomain
|
||||
import dev.meloda.fast.model.api.domain.VkMessage
|
||||
import dev.meloda.fast.model.api.domain.VkUser
|
||||
import dev.meloda.fast.model.api.domain.asEntity
|
||||
import dev.meloda.fast.model.api.requests.MessagesCreateChatRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesDeleteRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesEditRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesGetByIdRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesGetChatRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesGetConversationMembersRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesGetHistoryAttachmentsRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesGetHistoryRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesMarkAsImportantRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesMarkAsReadRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesPinMessageRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesRemoveChatUserRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesSendRequest
|
||||
import dev.meloda.fast.model.api.requests.MessagesUnpinMessageRequest
|
||||
import dev.meloda.fast.model.api.responses.MessagesGetConversationMembersResponse
|
||||
import dev.meloda.fast.model.api.responses.MessagesSendResponse
|
||||
import dev.meloda.fast.network.RestApiErrorDomain
|
||||
import dev.meloda.fast.network.mapApiDefault
|
||||
import dev.meloda.fast.network.mapApiResult
|
||||
import dev.meloda.fast.network.service.messages.MessagesService
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
class MessagesRepositoryImpl(
|
||||
private val messagesService: MessagesService,
|
||||
private val messageDao: MessageDao,
|
||||
private val userDao: UserDao,
|
||||
private val groupDao: GroupDao,
|
||||
private val conversationDao: ConversationDao
|
||||
) : MessagesRepository {
|
||||
|
||||
override suspend fun getHistory(
|
||||
conversationId: Int,
|
||||
conversationId: Long,
|
||||
offset: Int?,
|
||||
count: Int?
|
||||
): ApiResult<MessagesHistoryInfo, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
@@ -89,6 +106,13 @@ class MessagesRepositoryImpl(
|
||||
}
|
||||
}
|
||||
|
||||
launch(Dispatchers.IO) {
|
||||
conversationDao.insertAll(conversations.map(VkConversation::asEntity))
|
||||
messageDao.insertAll(messages.map(VkMessage::asEntity))
|
||||
userDao.insertAll(profilesList.map(VkUser::asEntity))
|
||||
groupDao.insertAll(groupsList.map(VkGroupDomain::asEntity))
|
||||
}
|
||||
|
||||
MessagesHistoryInfo(
|
||||
messages = messages,
|
||||
conversations = conversations
|
||||
@@ -101,12 +125,18 @@ class MessagesRepositoryImpl(
|
||||
}
|
||||
|
||||
override suspend fun getById(
|
||||
messagesIds: List<Int>,
|
||||
peerCmIds: List<Long>?,
|
||||
peerId: Long?,
|
||||
messagesIds: List<Long>?,
|
||||
cmIds: List<Long>?,
|
||||
extended: Boolean?,
|
||||
fields: String?
|
||||
): ApiResult<List<VkMessage>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesGetByIdRequest(
|
||||
peerCmIds = peerCmIds,
|
||||
peerId = peerId,
|
||||
messagesIds = messagesIds,
|
||||
cmIds = cmIds,
|
||||
extended = extended,
|
||||
fields = fields
|
||||
)
|
||||
@@ -116,12 +146,15 @@ class MessagesRepositoryImpl(
|
||||
val response = apiResponse.requireResponse()
|
||||
|
||||
val messages = response.items
|
||||
val usersMap =
|
||||
VkUsersMap.forUsers(response.profiles.orEmpty().map(VkUserData::mapToDomain))
|
||||
val groupsMap =
|
||||
VkGroupsMap.forGroups(response.groups.orEmpty().map(VkGroupData::mapToDomain))
|
||||
|
||||
messages.map { message ->
|
||||
val profilesList = response.profiles.orEmpty().map(VkUserData::mapToDomain)
|
||||
val groupsList = response.groups.orEmpty().map(VkGroupData::mapToDomain)
|
||||
val contactsList = response.contacts.orEmpty().map(VkContactData::mapToDomain)
|
||||
|
||||
val usersMap = VkUsersMap.forUsers(profilesList)
|
||||
val groupsMap = VkGroupsMap.forGroups(groupsList)
|
||||
|
||||
val domainMessages = messages.map { message ->
|
||||
message.asDomain().copy(
|
||||
user = usersMap.messageUser(message),
|
||||
group = groupsMap.messageGroup(message),
|
||||
@@ -129,18 +162,30 @@ class MessagesRepositoryImpl(
|
||||
actionGroup = groupsMap.messageActionGroup(message)
|
||||
)
|
||||
}
|
||||
|
||||
launch(Dispatchers.IO) {
|
||||
messageDao.insertAll(domainMessages.map(VkMessage::asEntity))
|
||||
userDao.insertAll(profilesList.map(VkUser::asEntity))
|
||||
groupDao.insertAll(groupsList.map(VkGroupDomain::asEntity))
|
||||
}
|
||||
|
||||
VkMemoryCache.appendUsers(profilesList)
|
||||
VkMemoryCache.appendGroups(groupsList)
|
||||
VkMemoryCache.appendContacts(contactsList)
|
||||
|
||||
domainMessages
|
||||
},
|
||||
errorMapper = { error -> error?.toDomain() }
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun send(
|
||||
peerId: Int,
|
||||
randomId: Int,
|
||||
peerId: Long,
|
||||
randomId: Long,
|
||||
message: String?,
|
||||
replyTo: Int?,
|
||||
replyTo: Long?,
|
||||
attachments: List<VkAttachment>?
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
): ApiResult<MessagesSendResponse, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesSendRequest(
|
||||
peerId = peerId,
|
||||
randomId = randomId,
|
||||
@@ -153,8 +198,8 @@ class MessagesRepositoryImpl(
|
||||
}
|
||||
|
||||
override suspend fun markAsRead(
|
||||
peerId: Int,
|
||||
startMessageId: Int?
|
||||
peerId: Long,
|
||||
startMessageId: Long?
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesMarkAsReadRequest(
|
||||
peerId = peerId,
|
||||
@@ -165,11 +210,11 @@ class MessagesRepositoryImpl(
|
||||
}
|
||||
|
||||
override suspend fun getHistoryAttachments(
|
||||
peerId: Int,
|
||||
peerId: Long,
|
||||
count: Int?,
|
||||
offset: Int?,
|
||||
attachmentTypes: List<String>,
|
||||
conversationMessageId: Int
|
||||
cmId: Long
|
||||
): ApiResult<List<VkAttachmentHistoryMessage>, RestApiErrorDomain> =
|
||||
withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesGetHistoryAttachmentsRequest(
|
||||
@@ -179,7 +224,7 @@ class MessagesRepositoryImpl(
|
||||
offset = offset,
|
||||
preserveOrder = true,
|
||||
attachmentTypes = attachmentTypes,
|
||||
conversationMessageId = conversationMessageId,
|
||||
conversationMessageId = cmId,
|
||||
fields = VkConstants.ALL_FIELDS
|
||||
)
|
||||
|
||||
@@ -195,6 +240,11 @@ class MessagesRepositoryImpl(
|
||||
VkMemoryCache.appendGroups(groupsList)
|
||||
VkMemoryCache.appendContacts(contactsList)
|
||||
|
||||
launch(Dispatchers.IO) {
|
||||
userDao.insertAll(profilesList.map(VkUser::asEntity))
|
||||
groupDao.insertAll(groupsList.map(VkGroupDomain::asEntity))
|
||||
}
|
||||
|
||||
response.items.map(VkAttachmentHistoryMessageData::toDomain)
|
||||
},
|
||||
errorMapper = { error ->
|
||||
@@ -204,9 +254,9 @@ class MessagesRepositoryImpl(
|
||||
}
|
||||
|
||||
override suspend fun createChat(
|
||||
userIds: List<Int>?,
|
||||
userIds: List<Long>?,
|
||||
title: String?
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
): ApiResult<Long, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesCreateChatRequest(
|
||||
userIds = userIds,
|
||||
title = title
|
||||
@@ -221,14 +271,14 @@ class MessagesRepositoryImpl(
|
||||
}
|
||||
|
||||
override suspend fun pin(
|
||||
peerId: Int,
|
||||
messageId: Int?,
|
||||
conversationMessageId: Int?
|
||||
peerId: Long,
|
||||
messageId: Long?,
|
||||
cmId: Long?
|
||||
): ApiResult<VkMessage, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesPinMessageRequest(
|
||||
peerId = peerId,
|
||||
messageId = messageId,
|
||||
conversationMessageId = conversationMessageId
|
||||
conversationMessageId = cmId
|
||||
)
|
||||
|
||||
messagesService.pin(requestModel.map).mapApiResult(
|
||||
@@ -240,18 +290,18 @@ class MessagesRepositoryImpl(
|
||||
}
|
||||
|
||||
override suspend fun unpin(
|
||||
peerId: Int
|
||||
peerId: Long
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesUnpinMessageRequest(peerId = peerId)
|
||||
messagesService.unpin(requestModel.map).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun markAsImportant(
|
||||
peerId: Int,
|
||||
messageIds: List<Int>?,
|
||||
conversationMessageIds: List<Int>?,
|
||||
peerId: Long,
|
||||
messageIds: List<Long>?,
|
||||
cmIds: List<Long>?,
|
||||
important: Boolean
|
||||
): ApiResult<List<Int>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
): ApiResult<List<Long>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesMarkAsImportantRequest(
|
||||
messagesIds = messageIds.orEmpty(),
|
||||
important = important
|
||||
@@ -260,16 +310,16 @@ class MessagesRepositoryImpl(
|
||||
}
|
||||
|
||||
override suspend fun delete(
|
||||
peerId: Int,
|
||||
messageIds: List<Int>?,
|
||||
conversationMessageIds: List<Int>?,
|
||||
peerId: Long,
|
||||
messageIds: List<Long>?,
|
||||
cmIds: List<Long>?,
|
||||
spam: Boolean,
|
||||
deleteForAll: Boolean
|
||||
): ApiResult<List<Any>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesDeleteRequest(
|
||||
peerId = peerId,
|
||||
messagesIds = messageIds,
|
||||
conversationsMessagesIds = conversationMessageIds,
|
||||
conversationsMessagesIds = cmIds,
|
||||
isSpam = spam,
|
||||
deleteForAll = deleteForAll
|
||||
)
|
||||
@@ -280,58 +330,74 @@ class MessagesRepositoryImpl(
|
||||
messageDao.insertAll(messages.map(VkMessage::asEntity))
|
||||
}
|
||||
|
||||
// override suspend fun markAsImportant(
|
||||
// params: MessagesMarkAsImportantRequest
|
||||
// ): ApiResult<List<Int>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
// messagesService.markAsImportant(params.map).mapResult(
|
||||
// successMapper = { response -> response.requireResponse() },
|
||||
// errorMapper = { error -> error?.toDomain() }
|
||||
// )
|
||||
// }
|
||||
//
|
||||
// override suspend fun delete(
|
||||
// params: MessagesDeleteRequest
|
||||
// ): ApiResult<Unit, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
// messagesService.delete(params.map).mapResult(
|
||||
// successMapper = {},
|
||||
// errorMapper = { error -> error?.toDomain() }
|
||||
// )
|
||||
// }
|
||||
//
|
||||
// override suspend fun edit(
|
||||
// params: MessagesEditRequest
|
||||
// ): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
// messagesService.edit(params.map).mapResult(
|
||||
// successMapper = { response -> response.requireResponse() },
|
||||
// errorMapper = { error -> error?.toDomain() }
|
||||
// )
|
||||
// }
|
||||
//
|
||||
// override suspend fun getChat(
|
||||
// params: MessagesGetChatRequest
|
||||
// ): ApiResult<VkChatData, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
// messagesService.getChat(params.map).mapResult(
|
||||
// successMapper = { response -> response.requireResponse() },
|
||||
// errorMapper = { error -> error?.toDomain() }
|
||||
// )
|
||||
// }
|
||||
//
|
||||
// override suspend fun getConversationMembers(
|
||||
// params: MessagesGetConversationMembersRequest
|
||||
// ): ApiResult<MessagesGetConversationMembersResponse, RestApiErrorDomain> =
|
||||
// withContext(Dispatchers.IO) {
|
||||
// messagesService.getConversationMembers(params.map).mapResult(
|
||||
// successMapper = { response -> response.requireResponse() },
|
||||
// errorMapper = { error -> error?.toDomain() }
|
||||
// )
|
||||
// }
|
||||
//
|
||||
// override suspend fun removeChatUser(
|
||||
// params: MessagesRemoveChatUserRequest
|
||||
// ): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
// messagesService.removeChatUser(params.map).mapResult(
|
||||
// successMapper = { response -> response.requireResponse() },
|
||||
// errorMapper = { error -> error?.toDomain() }
|
||||
// )
|
||||
// }
|
||||
override suspend fun edit(
|
||||
peerId: Long,
|
||||
messageId: Long?,
|
||||
cmId: Long?,
|
||||
message: String?,
|
||||
lat: Float?,
|
||||
long: Float?,
|
||||
attachments: List<VkAttachment>?,
|
||||
notParseLinks: Boolean,
|
||||
keepSnippets: Boolean,
|
||||
keepForwardedMessages: Boolean
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesEditRequest(
|
||||
peerId = peerId,
|
||||
messageId = messageId,
|
||||
cmId = cmId,
|
||||
message = message,
|
||||
lat = lat,
|
||||
long = long,
|
||||
attachments = attachments,
|
||||
notParseLinks = notParseLinks,
|
||||
keepSnippets = keepSnippets,
|
||||
keepForwardedMessages = keepForwardedMessages
|
||||
)
|
||||
|
||||
messagesService.edit(requestModel.map).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun getChat(
|
||||
chatId: Long,
|
||||
fields: String?
|
||||
): ApiResult<VkChatData, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesGetChatRequest(
|
||||
chatId = chatId,
|
||||
fields = fields
|
||||
)
|
||||
|
||||
messagesService.getChat(requestModel.map).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun getConversationMembers(
|
||||
peerId: Long,
|
||||
offset: Int?,
|
||||
count: Int?,
|
||||
extended: Boolean?,
|
||||
fields: String?
|
||||
): ApiResult<MessagesGetConversationMembersResponse, RestApiErrorDomain> =
|
||||
withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesGetConversationMembersRequest(
|
||||
peerId = peerId,
|
||||
offset = offset,
|
||||
count = count,
|
||||
extended = extended,
|
||||
fields = fields
|
||||
)
|
||||
|
||||
messagesService.getConversationMembers(requestModel.map).mapApiDefault()
|
||||
}
|
||||
|
||||
override suspend fun removeChatUser(
|
||||
chatId: Long,
|
||||
memberId: Long
|
||||
): ApiResult<Int, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = MessagesRemoveChatUserRequest(
|
||||
chatId = chatId,
|
||||
memberId = memberId
|
||||
)
|
||||
|
||||
messagesService.removeChatUser(requestModel.map).mapApiDefault()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package dev.meloda.fast.data.api.oauth
|
||||
|
||||
import com.slack.eithernet.ApiResult
|
||||
import dev.meloda.fast.model.api.responses.AuthDirectResponse
|
||||
import dev.meloda.fast.model.api.responses.GetSilentTokenResponse
|
||||
import dev.meloda.fast.network.OAuthErrorDomain
|
||||
|
||||
interface OAuthRepository {
|
||||
|
||||
@@ -11,5 +14,14 @@ interface OAuthRepository {
|
||||
validationCode: String?,
|
||||
captchaSid: String?,
|
||||
captchaKey: String?
|
||||
): AuthDirectResponse
|
||||
): ApiResult<AuthDirectResponse, OAuthErrorDomain>
|
||||
|
||||
suspend fun getSilentToken(
|
||||
login: String,
|
||||
password: String,
|
||||
forceSms: Boolean,
|
||||
validationCode: String?,
|
||||
captchaSid: String?,
|
||||
captchaKey: String?,
|
||||
): ApiResult<GetSilentTokenResponse, OAuthErrorDomain>
|
||||
}
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
package dev.meloda.fast.data.api.oauth
|
||||
|
||||
import com.slack.eithernet.ApiResult
|
||||
import dev.meloda.fast.common.VkConstants
|
||||
import dev.meloda.fast.model.api.requests.AuthDirectRequest
|
||||
import dev.meloda.fast.model.api.responses.AuthDirectResponse
|
||||
import dev.meloda.fast.model.api.responses.GetSilentTokenResponse
|
||||
import dev.meloda.fast.network.OAuthErrorDomain
|
||||
import dev.meloda.fast.network.ValidationType
|
||||
import dev.meloda.fast.network.VkOAuthError
|
||||
import dev.meloda.fast.network.VkOAuthErrorType
|
||||
import dev.meloda.fast.network.mapResult
|
||||
import dev.meloda.fast.network.service.oauth.OAuthService
|
||||
import com.slack.eithernet.ApiResult
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
@@ -18,37 +24,190 @@ class OAuthRepositoryImpl(
|
||||
forceSms: Boolean,
|
||||
validationCode: String?,
|
||||
captchaSid: String?,
|
||||
captchaKey: String?
|
||||
): AuthDirectResponse = withContext(Dispatchers.IO) {
|
||||
captchaKey: String?,
|
||||
): ApiResult<AuthDirectResponse, OAuthErrorDomain> = withContext(Dispatchers.IO) {
|
||||
val requestModel = AuthDirectRequest(
|
||||
grantType = VkConstants.Auth.GrantType.PASSWORD,
|
||||
clientId = VkConstants.VK_APP_ID,
|
||||
clientSecret = VkConstants.VK_SECRET,
|
||||
clientId = VkConstants.MESSENGER_APP_ID.toString(),
|
||||
clientSecret = VkConstants.MESSENGER_APP_SECRET,
|
||||
username = login,
|
||||
password = password,
|
||||
scope = VkConstants.Auth.SCOPE,
|
||||
scope = VkConstants.MESSENGER_APP_SCOPE.toString(),
|
||||
validationForceSms = forceSms,
|
||||
validationCode = validationCode,
|
||||
captchaSid = captchaSid,
|
||||
captchaKey = captchaKey,
|
||||
)
|
||||
|
||||
when (val result = oAuthService.auth(requestModel.map)) {
|
||||
is ApiResult.Success -> result.value
|
||||
oAuthService.auth(requestModel.map).mapResult(
|
||||
successMapper = {
|
||||
it
|
||||
},
|
||||
errorMapper = { response ->
|
||||
val error = response?.error?.let(VkOAuthError::parse)
|
||||
val errorType = response?.errorType?.let(VkOAuthErrorType::parse)
|
||||
|
||||
is ApiResult.Failure.HttpFailure -> {
|
||||
requireNotNull(result.error)
|
||||
when (error) {
|
||||
null -> OAuthErrorDomain.UnknownError
|
||||
|
||||
VkOAuthError.FLOOD_CONTROL -> OAuthErrorDomain.TooManyTriesError
|
||||
|
||||
VkOAuthError.NEED_VALIDATION -> {
|
||||
if (response.banInfo != null) {
|
||||
val info = requireNotNull(response.banInfo)
|
||||
|
||||
OAuthErrorDomain.UserBannedError(
|
||||
memberName = info.memberName,
|
||||
message = info.message,
|
||||
accessToken = info.accessToken,
|
||||
restoreUrl = info.restoreUrl
|
||||
)
|
||||
} else {
|
||||
OAuthErrorDomain.ValidationRequiredError(
|
||||
description = response.errorDescription.orEmpty(),
|
||||
validationType = response.validationType.orEmpty()
|
||||
.let(ValidationType::parse),
|
||||
validationSid = response.validationSid.orEmpty(),
|
||||
phoneMask = response.phoneMask.orEmpty(),
|
||||
redirectUri = response.redirectUri.orEmpty(),
|
||||
validationResend = response.validationResend,
|
||||
restoreIfCannotGetCode = response.restoreIfCannotGetCode
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
VkOAuthError.NEED_CAPTCHA -> {
|
||||
OAuthErrorDomain.CaptchaRequiredError(
|
||||
captchaSid = response.captchaSid.orEmpty(),
|
||||
captchaImageUrl = response.captchaImage.orEmpty()
|
||||
)
|
||||
}
|
||||
|
||||
VkOAuthError.INVALID_CLIENT -> {
|
||||
OAuthErrorDomain.InvalidCredentialsError
|
||||
}
|
||||
|
||||
VkOAuthError.INVALID_REQUEST -> {
|
||||
when (errorType) {
|
||||
null -> OAuthErrorDomain.UnknownError
|
||||
|
||||
VkOAuthErrorType.WRONG_OTP -> {
|
||||
OAuthErrorDomain.WrongValidationCode
|
||||
}
|
||||
|
||||
VkOAuthErrorType.WRONG_OTP_FORMAT -> {
|
||||
OAuthErrorDomain.WrongValidationCodeFormat
|
||||
}
|
||||
|
||||
VkOAuthErrorType.PASSWORD_BRUTEFORCE_ATTEMPT -> {
|
||||
OAuthErrorDomain.TooManyTriesError
|
||||
}
|
||||
|
||||
VkOAuthErrorType.USERNAME_OR_PASSWORD_IS_INCORRECT -> {
|
||||
OAuthErrorDomain.InvalidCredentialsError
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VkOAuthError.UNKNOWN -> OAuthErrorDomain.UnknownError
|
||||
}
|
||||
}
|
||||
|
||||
is ApiResult.Failure.ApiFailure -> TODO()
|
||||
|
||||
is ApiResult.Failure.NetworkFailure -> {
|
||||
// TODO: 13/07/2024, Danil Nikolaev: implement showing network error
|
||||
TODO()
|
||||
}
|
||||
is ApiResult.Failure.UnknownFailure -> TODO()
|
||||
|
||||
else -> throw IllegalStateException("Unknown result")
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun getSilentToken(
|
||||
login: String,
|
||||
password: String,
|
||||
forceSms: Boolean,
|
||||
validationCode: String?,
|
||||
captchaSid: String?,
|
||||
captchaKey: String?,
|
||||
): ApiResult<GetSilentTokenResponse, OAuthErrorDomain> =
|
||||
withContext(Dispatchers.IO) {
|
||||
val requestModel = AuthDirectRequest(
|
||||
grantType = VkConstants.Auth.GrantType.PASSWORD,
|
||||
clientId = VkConstants.MESSENGER_APP_ID.toString(),
|
||||
clientSecret = VkConstants.MESSENGER_APP_SECRET,
|
||||
username = login,
|
||||
password = password,
|
||||
scope = VkConstants.MESSENGER_APP_SCOPE.toString(),
|
||||
validationForceSms = forceSms,
|
||||
validationCode = validationCode,
|
||||
captchaSid = captchaSid,
|
||||
captchaKey = captchaKey,
|
||||
)
|
||||
|
||||
oAuthService.getSilentToken(requestModel.map).mapResult(
|
||||
successMapper = { it },
|
||||
errorMapper = { response ->
|
||||
val error = response?.error?.let(VkOAuthError::parse)
|
||||
val errorType = response?.errorType?.let(VkOAuthErrorType::parse)
|
||||
|
||||
when (error) {
|
||||
null -> OAuthErrorDomain.UnknownError
|
||||
|
||||
VkOAuthError.FLOOD_CONTROL -> OAuthErrorDomain.TooManyTriesError
|
||||
|
||||
VkOAuthError.NEED_VALIDATION -> {
|
||||
if (response.banInfo != null) {
|
||||
val info = requireNotNull(response.banInfo)
|
||||
|
||||
OAuthErrorDomain.UserBannedError(
|
||||
memberName = info.memberName,
|
||||
message = info.message,
|
||||
accessToken = info.accessToken,
|
||||
restoreUrl = info.restoreUrl
|
||||
)
|
||||
} else {
|
||||
OAuthErrorDomain.ValidationRequiredError(
|
||||
description = response.errorDescription.orEmpty(),
|
||||
validationType = response.validationType.orEmpty()
|
||||
.let(ValidationType::parse),
|
||||
validationSid = response.validationSid.orEmpty(),
|
||||
phoneMask = response.phoneMask.orEmpty(),
|
||||
redirectUri = response.redirectUri.orEmpty(),
|
||||
validationResend = response.validationResend,
|
||||
restoreIfCannotGetCode = response.restoreIfCannotGetCode
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
VkOAuthError.NEED_CAPTCHA -> {
|
||||
OAuthErrorDomain.CaptchaRequiredError(
|
||||
captchaSid = response.captchaSid.orEmpty(),
|
||||
captchaImageUrl = response.captchaImage.orEmpty()
|
||||
)
|
||||
}
|
||||
|
||||
VkOAuthError.INVALID_CLIENT -> {
|
||||
OAuthErrorDomain.InvalidCredentialsError
|
||||
}
|
||||
|
||||
VkOAuthError.INVALID_REQUEST -> {
|
||||
when (errorType) {
|
||||
null -> OAuthErrorDomain.UnknownError
|
||||
|
||||
VkOAuthErrorType.WRONG_OTP -> {
|
||||
OAuthErrorDomain.WrongValidationCode
|
||||
}
|
||||
|
||||
VkOAuthErrorType.WRONG_OTP_FORMAT -> {
|
||||
OAuthErrorDomain.WrongValidationCodeFormat
|
||||
}
|
||||
|
||||
VkOAuthErrorType.PASSWORD_BRUTEFORCE_ATTEMPT -> {
|
||||
OAuthErrorDomain.TooManyTriesError
|
||||
}
|
||||
|
||||
VkOAuthErrorType.USERNAME_OR_PASSWORD_IS_INCORRECT -> {
|
||||
OAuthErrorDomain.InvalidCredentialsError
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VkOAuthError.UNKNOWN -> OAuthErrorDomain.UnknownError
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ class PhotosRepository(
|
||||
private val photosService: PhotosService
|
||||
) {
|
||||
|
||||
suspend fun getMessagesUploadServer(peerId: Int) =
|
||||
suspend fun getMessagesUploadServer(peerId: Long) =
|
||||
photosService.getUploadServer(mapOf("peer_id" to peerId.toString()))
|
||||
|
||||
suspend fun uploadPhoto(url: String, photo: MultipartBody.Part) =
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
package dev.meloda.fast.data.api.users
|
||||
|
||||
import com.slack.eithernet.ApiResult
|
||||
import dev.meloda.fast.model.api.domain.VkUser
|
||||
import dev.meloda.fast.network.RestApiErrorDomain
|
||||
import com.slack.eithernet.ApiResult
|
||||
|
||||
interface UsersRepository {
|
||||
|
||||
suspend fun get(
|
||||
userIds: List<Int>?,
|
||||
userIds: List<Long>?,
|
||||
fields: String?,
|
||||
nomCase: String?
|
||||
): ApiResult<List<VkUser>, RestApiErrorDomain>
|
||||
|
||||
suspend fun getLocalUsers(userIds: List<Int>): List<VkUser>
|
||||
suspend fun getLocalUsers(userIds: List<Long>): List<VkUser>
|
||||
|
||||
suspend fun storeUsers(users: List<VkUser>)
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
package dev.meloda.fast.data.api.users
|
||||
|
||||
import com.slack.eithernet.ApiResult
|
||||
import dev.meloda.fast.data.VkMemoryCache
|
||||
import dev.meloda.fast.database.dao.UsersDao
|
||||
import dev.meloda.fast.database.dao.UserDao
|
||||
import dev.meloda.fast.model.api.data.VkUserData
|
||||
import dev.meloda.fast.model.api.domain.VkUser
|
||||
import dev.meloda.fast.model.api.domain.asEntity
|
||||
@@ -11,18 +12,17 @@ import dev.meloda.fast.model.database.asExternalModel
|
||||
import dev.meloda.fast.network.RestApiErrorDomain
|
||||
import dev.meloda.fast.network.mapApiResult
|
||||
import dev.meloda.fast.network.service.users.UsersService
|
||||
import com.slack.eithernet.ApiResult
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
class UsersRepositoryImpl(
|
||||
private val service: UsersService,
|
||||
private val dao: UsersDao
|
||||
private val dao: UserDao
|
||||
) : UsersRepository {
|
||||
|
||||
override suspend fun get(
|
||||
userIds: List<Int>?,
|
||||
userIds: List<Long>?,
|
||||
fields: String?,
|
||||
nomCase: String?
|
||||
): ApiResult<List<VkUser>, RestApiErrorDomain> = withContext(Dispatchers.IO) {
|
||||
@@ -38,7 +38,9 @@ class UsersRepositoryImpl(
|
||||
|
||||
val users = response.map(VkUserData::mapToDomain)
|
||||
|
||||
launch { storeUsers(users) }
|
||||
launch(Dispatchers.IO) {
|
||||
storeUsers(users)
|
||||
}
|
||||
|
||||
VkMemoryCache.appendUsers(users)
|
||||
|
||||
@@ -51,7 +53,7 @@ class UsersRepositoryImpl(
|
||||
}
|
||||
|
||||
override suspend fun getLocalUsers(
|
||||
userIds: List<Int>
|
||||
userIds: List<Long>
|
||||
): List<VkUser> = withContext(Dispatchers.IO) {
|
||||
dao.getAllByIds(userIds).map(VkUserEntity::asExternalModel)
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ interface AccountsRepository {
|
||||
|
||||
suspend fun getAccounts(): List<AccountEntity>
|
||||
|
||||
suspend fun getAccountById(userId: Int): AccountEntity?
|
||||
suspend fun getAccountById(userId: Long): AccountEntity?
|
||||
|
||||
suspend fun storeAccounts(accounts: List<AccountEntity>)
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ class AccountsRepositoryImpl(
|
||||
|
||||
override suspend fun getAccounts(): List<AccountEntity> = accountDao.getAll()
|
||||
|
||||
override suspend fun getAccountById(userId: Int): AccountEntity? =
|
||||
override suspend fun getAccountById(userId: Long): AccountEntity? =
|
||||
accountDao.getById(userId)
|
||||
|
||||
override suspend fun storeAccounts(
|
||||
|
||||
@@ -65,7 +65,6 @@ val dataModule = module {
|
||||
|
||||
singleOf(::FriendsRepositoryImpl) bind FriendsRepository::class
|
||||
|
||||
// TODO: 11/08/2024, Danil Nikolaev: find a better solution
|
||||
single<Interceptor>(named("token_interceptor")) {
|
||||
AccessTokenInterceptor()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user