Skip to content
Snippets Groups Projects
Commit 36b4bf14 authored by Taras's avatar Taras
Browse files

Add relations validation

parent 70a60666
No related branches found
No related tags found
No related merge requests found
...@@ -47,7 +47,7 @@ class HomeViewModel @Inject constructor( ...@@ -47,7 +47,7 @@ class HomeViewModel @Inject constructor(
val tasks = workspaceTasksProvider.getMandatoryTasks() val tasks = workspaceTasksProvider.getMandatoryTasks()
tasks.forEach { item -> tasks.forEach { item ->
when (val validationResponse = when (val validationResponse =
createResult { workspaceDataSource.validate(item.room) }) { createResult { workspaceDataSource.validateAndFixIfExist(item.room) }) {
is Response.Error -> { is Response.Error -> {
validateWorkspaceResultLiveData.postValue(Response.Error("")) validateWorkspaceResultLiveData.postValue(Response.Error(""))
return@launchBg return@launchBg
......
...@@ -43,7 +43,7 @@ class ConfigureWorkspaceViewModel @Inject constructor( ...@@ -43,7 +43,7 @@ class ConfigureWorkspaceViewModel @Inject constructor(
tasks.forEachIndexed { i, item -> tasks.forEachIndexed { i, item ->
updateTaskStatus(i, TaskStatus.RUNNING) updateTaskStatus(i, TaskStatus.RUNNING)
when (val validationResponse = when (val validationResponse =
createResult { workspaceDataSource.validate(item.room) }) { createResult { workspaceDataSource.validateAndFixIfExist(item.room) }) {
is Response.Error -> { is Response.Error -> {
hasError = true hasError = true
updateTaskStatus(i, TaskStatus.FAILED) updateTaskStatus(i, TaskStatus.FAILED)
...@@ -71,7 +71,7 @@ class ConfigureWorkspaceViewModel @Inject constructor( ...@@ -71,7 +71,7 @@ class ConfigureWorkspaceViewModel @Inject constructor(
if (item.status == TaskStatus.SUCCESS) return@forEachIndexed if (item.status == TaskStatus.SUCCESS) return@forEachIndexed
updateTaskStatus(i, TaskStatus.RUNNING) updateTaskStatus(i, TaskStatus.RUNNING)
when (val result = createResult { workspaceDataSource.perform(item.room) }) { when (val result = createResult { workspaceDataSource.performCreate(item.room) }) {
is Response.Error -> { is Response.Error -> {
updateTaskStatus(i, TaskStatus.FAILED) updateTaskStatus(i, TaskStatus.FAILED)
workspaceResultLiveData.postValue(result) workspaceResultLiveData.postValue(result)
......
...@@ -4,19 +4,21 @@ import kotlinx.coroutines.delay ...@@ -4,19 +4,21 @@ import kotlinx.coroutines.delay
import org.futo.circles.core.model.CirclesRoom import org.futo.circles.core.model.CirclesRoom
import org.futo.circles.core.provider.MatrixSessionProvider import org.futo.circles.core.provider.MatrixSessionProvider
import org.futo.circles.core.room.CreateRoomDataSource import org.futo.circles.core.room.CreateRoomDataSource
import org.futo.circles.core.room.RoomRelationsBuilder
import org.futo.circles.core.utils.getJoinedRoomById import org.futo.circles.core.utils.getJoinedRoomById
import org.futo.circles.core.workspace.SpacesTreeAccountDataSource import org.futo.circles.core.workspace.SpacesTreeAccountDataSource
import org.matrix.android.sdk.api.session.room.Room
import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.RoomType
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
import javax.inject.Inject import javax.inject.Inject
class ConfigureWorkspaceDataSource @Inject constructor( class ConfigureWorkspaceDataSource @Inject constructor(
private val createRoomDataSource: CreateRoomDataSource, private val createRoomDataSource: CreateRoomDataSource,
private val spacesTreeAccountDataSource: SpacesTreeAccountDataSource private val spacesTreeAccountDataSource: SpacesTreeAccountDataSource,
private val roomRelationsBuilder: RoomRelationsBuilder
) { ) {
suspend fun perform(room: CirclesRoom) { suspend fun performCreate(room: CirclesRoom) {
val roomId = createRoomDataSource.createRoom(room) val roomId = createRoomDataSource.createRoom(room)
room.accountDataKey?.let { key -> room.accountDataKey?.let { key ->
spacesTreeAccountDataSource.updateSpacesConfigAccountData(key, roomId) spacesTreeAccountDataSource.updateSpacesConfigAccountData(key, roomId)
...@@ -24,21 +26,30 @@ class ConfigureWorkspaceDataSource @Inject constructor( ...@@ -24,21 +26,30 @@ class ConfigureWorkspaceDataSource @Inject constructor(
delay(CREATE_ROOM_DELAY) delay(CREATE_ROOM_DELAY)
} }
suspend fun validate(room: CirclesRoom): Boolean { suspend fun validateAndFixIfExist(room: CirclesRoom): Boolean {
val accountDataKey = room.accountDataKey ?: return false val accountDataKey = room.accountDataKey ?: return false
if (spacesTreeAccountDataSource.getRoomIdByKey(accountDataKey) == null) { var roomId = spacesTreeAccountDataSource.getRoomIdByKey(accountDataKey)
addRecordToAccountDataIfRoomExist(room) if (roomId == null) roomId = addIdToAccountDataIfRoomExistWithTag(room)
} val joinedRoom = roomId?.let { getJoinedRoomById(roomId) } ?: return false
return getJoinedRoomById( validateOrSetupRelations(room.parentAccountDataKey, joinedRoom)
spacesTreeAccountDataSource.getRoomIdByKey(accountDataKey) ?: "" return true
) != null }
private suspend fun validateOrSetupRelations(parentAccountDataKey: String?, joinedRoom: Room) {
val parentKey = parentAccountDataKey ?: return
val parentRoomId = spacesTreeAccountDataSource.getRoomIdByKey(parentKey) ?: return
val hasRelations = joinedRoom.asSpace()
?.spaceSummary()?.spaceParents?.mapNotNull { it.roomSummary?.roomId }
?.contains(parentRoomId) == true
if (!hasRelations) roomRelationsBuilder.setRelations(joinedRoom.roomId, parentRoomId)
} }
private suspend fun addRecordToAccountDataIfRoomExist(room: CirclesRoom) { private suspend fun addIdToAccountDataIfRoomExistWithTag(room: CirclesRoom): String? {
val tag = room.getTag() ?: return val tag = room.getTag() ?: return null
val key = room.accountDataKey ?: return val key = room.accountDataKey ?: return null
val roomId = getJoinedRoomIdByTag(tag) ?: return val roomId = getJoinedRoomIdByTag(tag) ?: return null
spacesTreeAccountDataSource.updateSpacesConfigAccountData(key, roomId) spacesTreeAccountDataSource.updateSpacesConfigAccountData(key, roomId)
return roomId
} }
private fun getJoinedRoomIdByTag(tag: String): String? { private fun getJoinedRoomIdByTag(tag: String): String? {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment