diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectView.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectView.kt new file mode 100644 index 0000000000..61f0ea3316 --- /dev/null +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectView.kt @@ -0,0 +1,14 @@ +package com.anytypeio.anytype.core_models + +import com.anytypeio.anytype.core_models.restrictions.DataViewRestrictions +import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction + +data class ObjectView( + val root: Id, + val blocks: List, + val details: Map, + val type: SmartBlockType, + val relations: List, + val objectRestrictions: List, + val dataViewRestrictions: List +) \ No newline at end of file diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt index eac3f7eb7d..9844456924 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt @@ -11,10 +11,10 @@ import com.anytypeio.anytype.core_models.DVViewerType import com.anytypeio.anytype.core_models.DocumentInfo import com.anytypeio.anytype.core_models.Hash import com.anytypeio.anytype.core_models.Id -import com.anytypeio.anytype.core_models.InternalFlags import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.ObjectInfoWithLinks import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectView import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Position @@ -37,6 +37,8 @@ class BlockDataRepository( private val remote: BlockDataStore ) : BlockRepository { + override suspend fun openObject(id: Id): ObjectView = remote.openObject(id = id) + override suspend fun openDashboard( contextId: String, id: String diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataStore.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataStore.kt index aaab3c16b4..2961a9f915 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataStore.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataStore.kt @@ -13,10 +13,10 @@ import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.ObjectInfoWithLinks import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectView import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Position -import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.core_models.RelationFormat import com.anytypeio.anytype.core_models.Response import com.anytypeio.anytype.core_models.SearchResult @@ -49,6 +49,7 @@ interface BlockDataStore { suspend fun move(command: Command.Move): Payload suspend fun unlink(command: Command.Unlink): Payload + suspend fun openObject(id: Id) : ObjectView suspend fun openPage(id: String): Payload suspend fun openObjectSet(id: String): Payload suspend fun openProfile(id: String): Payload diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt index ef591af379..9af9a4ef42 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt @@ -13,10 +13,10 @@ import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.ObjectInfoWithLinks import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectView import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Position -import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.core_models.RelationFormat import com.anytypeio.anytype.core_models.Response import com.anytypeio.anytype.core_models.SearchResult @@ -49,6 +49,7 @@ interface BlockRemote { command: Command.CreateBlockLinkWithObject ): CreateBlockLinkWithObjectResult + suspend fun openObject(id: Id) : ObjectView suspend fun openPage(id: String): Payload suspend fun openProfile(id: String): Payload suspend fun openObjectSet(id: String): Payload diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemoteDataStore.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemoteDataStore.kt index 4d4a74e802..53f733b0bb 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemoteDataStore.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemoteDataStore.kt @@ -10,14 +10,13 @@ import com.anytypeio.anytype.core_models.DVViewer import com.anytypeio.anytype.core_models.DVViewerType import com.anytypeio.anytype.core_models.DocumentInfo import com.anytypeio.anytype.core_models.Id -import com.anytypeio.anytype.core_models.InternalFlags import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.ObjectInfoWithLinks import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectView import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Position -import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.core_models.RelationFormat import com.anytypeio.anytype.core_models.Response import com.anytypeio.anytype.core_models.SearchResult @@ -39,6 +38,7 @@ class BlockRemoteDataStore(private val remote: BlockRemote) : BlockDataStore { command: Command.CreateBlockLinkWithObject ): CreateBlockLinkWithObjectResult = remote.createBlockLinkWithObject(command) + override suspend fun openObject(id: Id): ObjectView = remote.openObject(id = id) override suspend fun openPage(id: String): Payload = remote.openPage(id) override suspend fun openProfile(id: String): Payload = remote.openProfile(id) override suspend fun openObjectSet(id: String): Payload = remote.openObjectSet(id) diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/base/Interactor.kt b/domain/src/main/java/com/anytypeio/anytype/domain/base/Interactor.kt index 9bdc09f994..e2ccfdb446 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/base/Interactor.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/base/Interactor.kt @@ -4,11 +4,9 @@ import com.anytypeio.anytype.domain.base.Interactor.Status import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.flatMapConcat import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.withContext import kotlin.coroutines.CoroutineContext @@ -55,6 +53,19 @@ abstract class Interactor( } } +abstract class ResultatInteractor() { + operator fun invoke(params: P): Flow> { + return flow { + emit(Resultat.Loading()) + val r = execute(params) + emit(Resultat.Success(r)) + }.catch { t -> + emit(Resultat.Failure(t)) + } + } + protected abstract suspend fun execute(params: P) : R +} + abstract class ResultInteractor( private val context: CoroutineContext = Dispatchers.IO ) { diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt b/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt index 1fa4783fe4..9bc2ec57c0 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt @@ -11,14 +11,13 @@ import com.anytypeio.anytype.core_models.DVViewerType import com.anytypeio.anytype.core_models.DocumentInfo import com.anytypeio.anytype.core_models.Hash import com.anytypeio.anytype.core_models.Id -import com.anytypeio.anytype.core_models.InternalFlags import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.ObjectInfoWithLinks import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectView import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Position -import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.core_models.RelationFormat import com.anytypeio.anytype.core_models.Response import com.anytypeio.anytype.core_models.SearchResult @@ -90,12 +89,14 @@ interface BlockRepository { suspend fun setRelationKey(command: Command.SetRelationKey): Payload + suspend fun openObject(id: Id) : ObjectView + @Deprecated("To be deleted") suspend fun openObjectPreview(id: Id): Result - + @Deprecated("To be deleted") suspend fun openPage(id: String): Result - + @Deprecated("To be deleted") suspend fun openProfile(id: String): Payload - + @Deprecated("To be deleted") suspend fun openObjectSet(id: String): Result suspend fun closePage(id: String) diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/object/OpenObject.kt b/domain/src/main/java/com/anytypeio/anytype/domain/object/OpenObject.kt new file mode 100644 index 0000000000..57a2dcf89a --- /dev/null +++ b/domain/src/main/java/com/anytypeio/anytype/domain/object/OpenObject.kt @@ -0,0 +1,21 @@ +package com.anytypeio.anytype.domain.`object` + +import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.ObjectView +import com.anytypeio.anytype.domain.auth.repo.AuthRepository +import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers +import com.anytypeio.anytype.domain.base.ResultatInteractor +import com.anytypeio.anytype.domain.block.repo.BlockRepository +import kotlinx.coroutines.withContext + +class OpenObject( + private val repo: BlockRepository, + private val auth: AuthRepository, + private val dispatchers: AppCoroutineDispatchers +) : ResultatInteractor() { + override suspend fun execute(params: Id): ObjectView = withContext(dispatchers.io) { + repo.openObject(params).also { + auth.saveLastOpenedObjectId(params) + } + } +} \ No newline at end of file diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt index 415adc6376..b2d8cf3c7e 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt @@ -14,10 +14,10 @@ import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.ObjectInfoWithLinks import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectView import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Position -import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.core_models.RelationFormat import com.anytypeio.anytype.core_models.Response import com.anytypeio.anytype.core_models.SearchResult @@ -26,7 +26,6 @@ import com.anytypeio.anytype.core_models.Url import com.anytypeio.anytype.data.auth.repo.block.BlockRemote import com.anytypeio.anytype.middleware.interactor.Middleware import com.anytypeio.anytype.middleware.mappers.toCoreModel -import com.anytypeio.anytype.middleware.mappers.toCoreModels import com.anytypeio.anytype.middleware.mappers.toMiddlewareModel class BlockMiddleware( @@ -42,9 +41,10 @@ class BlockMiddleware( middleware.objectClose(id) } - override suspend fun openPage(id: String): Payload = middleware.objectOpen(id) - override suspend fun openProfile(id: String): Payload = middleware.objectOpen(id) - override suspend fun openObjectSet(id: String): Payload = middleware.objectOpen(id) + override suspend fun openObject(id: Id): ObjectView = middleware.objectOpen(id = id) + override suspend fun openPage(id: String): Payload = middleware.objectOpenOld(id) + override suspend fun openProfile(id: String): Payload = middleware.objectOpenOld(id) + override suspend fun openObjectSet(id: String): Payload = middleware.objectOpenOld(id) override suspend fun openObjectPreview(id: Id): Payload = middleware.objectShow(id) override suspend fun closePage(id: String) { diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt index c98166cc93..7d25520cf7 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt @@ -18,6 +18,7 @@ import com.anytypeio.anytype.core_models.DVViewerType import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectView import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Position @@ -30,10 +31,10 @@ import com.anytypeio.anytype.core_models.Url import com.anytypeio.anytype.middleware.BuildConfig import com.anytypeio.anytype.middleware.auth.toAccountSetup import com.anytypeio.anytype.middleware.const.Constants -import com.anytypeio.anytype.middleware.mappers.MRelation import com.anytypeio.anytype.middleware.mappers.MRelationFormat import com.anytypeio.anytype.middleware.mappers.core import com.anytypeio.anytype.middleware.mappers.parse +import com.anytypeio.anytype.middleware.mappers.toCore import com.anytypeio.anytype.middleware.mappers.toCoreModel import com.anytypeio.anytype.middleware.mappers.toCoreModels import com.anytypeio.anytype.middleware.mappers.toMiddlewareModel @@ -1039,7 +1040,7 @@ class Middleware( } @Throws(Exception::class) - fun objectOpen(id: String): Payload { + fun objectOpenOld(id: String): Payload { val request = Rpc.Object.Open.Request(objectId = id) if (BuildConfig.DEBUG) logRequest(request) val response = service.objectOpen(request) @@ -1049,6 +1050,15 @@ class Middleware( ?: throw IllegalStateException("Object view was null") } + @Throws(Exception::class) + fun objectOpen(id: String): ObjectView { + val request = Rpc.Object.Open.Request(objectId = id) + if (BuildConfig.DEBUG) logRequest(request) + val response = service.objectOpen(request) + if (BuildConfig.DEBUG) logResponse(response) + return response.objectView?.toCore() ?: throw IllegalStateException("Object view was null") + } + @Throws(Exception::class) fun objectRedo(command: Command.Redo): Payload { val request = Rpc.Object.Redo.Request(contextId = command.context) diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt index a7fb253e9c..3fa99410fa 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt @@ -41,13 +41,26 @@ fun MObjectView.toPayload() : Payload { ), type = type, relationLinks = relationLinks.map { it.toCoreModels() }, - objectRestrictions = restrictions?.object_?.mapNotNull { it.toCoreModel() }.orEmpty(), + objectRestrictions = restrictions?.object_?.map { it.toCoreModel() }.orEmpty(), dataViewRestrictions = restrictions?.dataview?.map { it.toCoreModel() }.orEmpty() ) ) ) } +fun MObjectView.toCore() : ObjectView { + val type = type.toCoreModel() + return ObjectView( + root = rootId, + blocks = blocks.toCoreModels(types = mapOf(rootId to type)), + details = details.associate { d -> d.id to d.details.orEmpty() }, + relations = relationLinks.map { it.toCoreModels() }, + objectRestrictions = restrictions?.object_?.map { it.toCoreModel() }.orEmpty(), + dataViewRestrictions = restrictions?.dataview?.map { it.toCoreModel() }.orEmpty(), + type = type + ) +} + // ---------------------- BLOCKS ------------------------ fun List.toCoreModels(