mirror of
https://github.com/anyproto/anytype-kotlin.git
synced 2025-06-08 05:47:05 +09:00
DROID-2644 SyncStatus | Models + channels (#1394)
This commit is contained in:
parent
a8be6f3e93
commit
4e335a2f13
9 changed files with 213 additions and 7 deletions
|
@ -35,15 +35,15 @@ enum class SpaceMemberPermissions(
|
|||
OWNER(2),
|
||||
NO_PERMISSIONS(3);
|
||||
|
||||
fun isOwner() : Boolean {
|
||||
fun isOwner(): Boolean {
|
||||
return this == OWNER
|
||||
}
|
||||
|
||||
fun isOwnerOrEditor() : Boolean {
|
||||
fun isOwnerOrEditor(): Boolean {
|
||||
return this == OWNER || this == WRITER
|
||||
}
|
||||
|
||||
fun isAtLeastReader() : Boolean {
|
||||
fun isAtLeastReader(): Boolean {
|
||||
return this == OWNER || this == WRITER || this == READER
|
||||
}
|
||||
}
|
||||
|
@ -56,6 +56,46 @@ enum class SpaceAccessType(val code: Int) {
|
|||
|
||||
sealed class SpaceInviteError : Exception() {
|
||||
class SpaceNotFound : SpaceInviteError()
|
||||
class SpaceDeleted: SpaceInviteError()
|
||||
class InvalidInvite: SpaceInviteError()
|
||||
class SpaceDeleted : SpaceInviteError()
|
||||
class InvalidInvite : SpaceInviteError()
|
||||
}
|
||||
|
||||
data class SpaceSyncUpdate(
|
||||
val id: String,
|
||||
val status: SpaceSyncStatus,
|
||||
val network: SpaceSyncNetwork,
|
||||
val error: SpaceSyncError?,
|
||||
val syncingObjectsCounter: Long
|
||||
)
|
||||
|
||||
enum class SpaceSyncStatus {
|
||||
SYNCED,
|
||||
SYNCING,
|
||||
ERROR,
|
||||
OFFLINE
|
||||
}
|
||||
|
||||
enum class SpaceSyncNetwork {
|
||||
ANYTYPE,
|
||||
SELF_HOST,
|
||||
LOCAL_ONLY
|
||||
}
|
||||
|
||||
enum class SpaceSyncError {
|
||||
NULL,
|
||||
STORAGE_LIMIT_EXCEED,
|
||||
INCOMPATIBLE_VERSION,
|
||||
NETWORK_ERROR
|
||||
}
|
||||
|
||||
data class P2PStatusUpdate(
|
||||
val spaceId: String,
|
||||
val status: P2PStatus,
|
||||
val devicesCounter: Long
|
||||
)
|
||||
|
||||
enum class P2PStatus {
|
||||
NOT_CONNECTED,
|
||||
NOT_POSSIBLE,
|
||||
CONNECTED
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.anytypeio.anytype.data.auth.status
|
||||
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
import com.anytypeio.anytype.core_models.multiplayer.P2PStatusUpdate
|
||||
import com.anytypeio.anytype.domain.workspace.P2PStatusChannel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface P2PStatusRemoteChannel {
|
||||
fun observe(activeSpaceId: Id): Flow<List<P2PStatusUpdate>>
|
||||
}
|
||||
|
||||
class P2PStatusDataChannel(
|
||||
private val channel: P2PStatusRemoteChannel
|
||||
) : P2PStatusChannel {
|
||||
|
||||
override fun observe(activeSpaceId: Id): Flow<List<P2PStatusUpdate>> {
|
||||
return channel.observe(activeSpaceId)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.anytypeio.anytype.data.auth.status
|
||||
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncUpdate
|
||||
import com.anytypeio.anytype.domain.workspace.SpaceSyncStatusChannel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface SpaceStatusRemoteChannel {
|
||||
fun observe(activeSpaceId: String): Flow<List<SpaceSyncUpdate>>
|
||||
}
|
||||
|
||||
class SpaceStatusDataChannel(
|
||||
private val channel: SpaceStatusRemoteChannel
|
||||
) : SpaceSyncStatusChannel {
|
||||
|
||||
override fun observe(activeSpaceId: Id): Flow<List<SpaceSyncUpdate>> {
|
||||
return channel.observe(activeSpaceId)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package com.anytypeio.anytype.domain.workspace
|
||||
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
import com.anytypeio.anytype.core_models.multiplayer.P2PStatusUpdate
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface P2PStatusChannel {
|
||||
fun observe(activeSpaceId: Id): Flow<List<P2PStatusUpdate>>
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package com.anytypeio.anytype.domain.workspace
|
||||
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncUpdate
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface SpaceSyncStatusChannel {
|
||||
fun observe(activeSpaceId: Id): Flow<List<SpaceSyncUpdate>>
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package com.anytypeio.anytype.middleware.interactor
|
||||
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
import com.anytypeio.anytype.core_models.multiplayer.P2PStatusUpdate
|
||||
import com.anytypeio.anytype.data.auth.status.P2PStatusRemoteChannel
|
||||
import com.anytypeio.anytype.middleware.EventProxy
|
||||
import com.anytypeio.anytype.middleware.mappers.toCoreModel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.mapNotNull
|
||||
|
||||
class P2PStatusRemoteChannelImpl(private val events: EventProxy) : P2PStatusRemoteChannel {
|
||||
|
||||
override fun observe(activeSpaceId: Id): Flow<List<P2PStatusUpdate>> {
|
||||
return events.flow().mapNotNull { emission ->
|
||||
emission.messages.mapNotNull { message ->
|
||||
when {
|
||||
message.p2pStatusUpdate != null -> {
|
||||
val event = message.p2pStatusUpdate
|
||||
checkNotNull(event)
|
||||
if (event.spaceId == activeSpaceId) {
|
||||
P2PStatusUpdate(
|
||||
spaceId = event.spaceId,
|
||||
status = event.status.toCoreModel(),
|
||||
devicesCounter = event.devicesCounter
|
||||
)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
package com.anytypeio.anytype.middleware.interactor
|
||||
|
||||
import com.anytypeio.anytype.core_models.Id
|
||||
import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncUpdate
|
||||
import com.anytypeio.anytype.data.auth.status.SpaceStatusRemoteChannel
|
||||
import com.anytypeio.anytype.middleware.EventProxy
|
||||
import com.anytypeio.anytype.middleware.mappers.toCoreModel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.mapNotNull
|
||||
|
||||
class SpaceSyncStatusRemoteChannelImpl(private val events: EventProxy) : SpaceStatusRemoteChannel {
|
||||
|
||||
override fun observe(activeSpaceId: Id): Flow<List<SpaceSyncUpdate>> {
|
||||
return events.flow().mapNotNull { emission ->
|
||||
emission.messages.mapNotNull { message ->
|
||||
when {
|
||||
message.spaceSyncStatusUpdate != null -> {
|
||||
val event = message.spaceSyncStatusUpdate
|
||||
checkNotNull(event)
|
||||
if (event.id == activeSpaceId) {
|
||||
SpaceSyncUpdate(
|
||||
id = event.id,
|
||||
status = event.status.toCoreModel(),
|
||||
network = event.network.toCoreModel(),
|
||||
error = event.error.toCoreModel(),
|
||||
syncingObjectsCounter = event.syncingObjectsCounter
|
||||
)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -90,3 +90,9 @@ typealias MMembershipTierDataPeriodType = anytype.model.MembershipTierData.Perio
|
|||
typealias MNameServiceNameType = anytype.model.NameserviceNameType
|
||||
typealias MEmailVerificationStatus = anytype.model.Membership.EmailVerificationStatus
|
||||
typealias MDetail = anytype.model.Detail
|
||||
|
||||
typealias MSpaceSyncStatus = anytype.Event.Space.Status
|
||||
typealias MSpaceSyncNetwork = anytype.Event.Space.Network
|
||||
typealias MSpaceSyncError = anytype.Event.Space.SyncError
|
||||
|
||||
typealias MP2PStatus = anytype.Event.P2PStatus.Status
|
|
@ -50,12 +50,15 @@ import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod
|
|||
import com.anytypeio.anytype.core_models.membership.MembershipPeriodType
|
||||
import com.anytypeio.anytype.core_models.membership.MembershipTierData
|
||||
import com.anytypeio.anytype.core_models.membership.NameServiceNameType
|
||||
import com.anytypeio.anytype.core_models.multiplayer.P2PStatus
|
||||
import com.anytypeio.anytype.core_models.multiplayer.SpaceMemberPermissions
|
||||
import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncError
|
||||
import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncNetwork
|
||||
import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncStatus
|
||||
import com.anytypeio.anytype.core_models.primitives.SpaceId
|
||||
import com.anytypeio.anytype.core_models.restrictions.DataViewRestriction
|
||||
import com.anytypeio.anytype.core_models.restrictions.DataViewRestrictions
|
||||
import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction
|
||||
import com.anytypeio.anytype.core_utils.ext.orNull
|
||||
import com.anytypeio.anytype.middleware.interactor.toCoreModels
|
||||
import com.google.gson.GsonBuilder
|
||||
|
||||
|
@ -1066,4 +1069,31 @@ fun MEmailVerificationStatus.toCoreModel(): EmailVerificationStatus {
|
|||
fun MNameServiceNameType.toCoreModel(): NameServiceNameType = when (this) {
|
||||
NameserviceNameType.AnyName -> NameServiceNameType.ANY_NAME
|
||||
}
|
||||
//endregion
|
||||
//endregion
|
||||
|
||||
//region SYNC STATUS
|
||||
fun MSpaceSyncStatus.toCoreModel(): SpaceSyncStatus = when (this) {
|
||||
MSpaceSyncStatus.Synced -> SpaceSyncStatus.SYNCED
|
||||
MSpaceSyncStatus.Syncing -> SpaceSyncStatus.SYNCING
|
||||
MSpaceSyncStatus.Error -> SpaceSyncStatus.ERROR
|
||||
MSpaceSyncStatus.Offline -> SpaceSyncStatus.OFFLINE
|
||||
}
|
||||
|
||||
fun MSpaceSyncNetwork.toCoreModel(): SpaceSyncNetwork = when (this) {
|
||||
anytype.Event.Space.Network.Anytype -> SpaceSyncNetwork.ANYTYPE
|
||||
anytype.Event.Space.Network.SelfHost -> SpaceSyncNetwork.SELF_HOST
|
||||
anytype.Event.Space.Network.LocalOnly -> SpaceSyncNetwork.LOCAL_ONLY
|
||||
}
|
||||
|
||||
fun MSpaceSyncError.toCoreModel(): SpaceSyncError = when (this) {
|
||||
MSpaceSyncError.Null -> SpaceSyncError.NULL
|
||||
MSpaceSyncError.StorageLimitExceed -> SpaceSyncError.STORAGE_LIMIT_EXCEED
|
||||
MSpaceSyncError.IncompatibleVersion -> SpaceSyncError.INCOMPATIBLE_VERSION
|
||||
MSpaceSyncError.NetworkError -> SpaceSyncError.NETWORK_ERROR
|
||||
}
|
||||
|
||||
fun MP2PStatus.toCoreModel(): P2PStatus = when (this) {
|
||||
MP2PStatus.NotConnected -> P2PStatus.NOT_CONNECTED
|
||||
MP2PStatus.NotPossible -> P2PStatus.NOT_POSSIBLE
|
||||
MP2PStatus.Connected -> P2PStatus.CONNECTED
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue