Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -423,9 +423,15 @@ sealed interface Message {
MessageContent.NewConversationWithCellMessage -> mutableMapOf(
typeKey to "newConversationWithCellMessage"
)

MessageContent.NewConversationWithCellSelfDeleteDisabledMessage -> mutableMapOf(
typeKey to "newConversationWithCellSelfDeleteDisabledMessage"
)

is MessageContent.ConversationAppsEnabledChanged -> mutableMapOf(
typeKey to "conversationAppsEnabledChanged",
"isEnabled" to "${content.isEnabled}"
)
}

val standardProperties = mapOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,10 @@ sealed interface MessageContent {
val receiptMode: Boolean
) : System

data class ConversationAppsEnabledChanged(
val isEnabled: Boolean
) : System

data class ConversationReceiptModeChanged(
val receiptMode: Boolean
) : System
Expand Down Expand Up @@ -499,6 +503,7 @@ fun MessageContent?.getType() = when (this) {
null -> "null"
MessageContent.NewConversationWithCellMessage -> "NewConversationWithCell"
MessageContent.NewConversationWithCellSelfDeleteDisabledMessage -> "NewConversationWithCellSelfDeleteDisabled"
is MessageContent.ConversationAppsEnabledChanged -> "ConversationAppsEnabledChanged"
}

sealed interface MessagePreviewContent {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,12 @@ internal class ConversationGroupRepositoryImpl(
newGroupConversationSystemMessagesCreator.value.conversationStarted(conversationEntity)
}.flatMap {
newGroupConversationSystemMessagesCreator.value.conversationCellStatus(conversationEntity)
}.flatMap {
newGroupConversationSystemMessagesCreator.value.conversationAppsAccessIfEnabled(
conversationId = conversationEntity.id.toModel(),
hasAppsAccessEnabled = conversationResponse.hasAppsAccessEnabled(),
creatorId = selfUserId,
)
}.flatMap {
when (protocol) {
is Conversation.ProtocolInfo.Proteus -> Either.Right(setOf())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
*/
package com.wire.kalium.logic.data.conversation

import kotlin.uuid.Uuid
import com.wire.kalium.common.error.CoreFailure
import com.wire.kalium.common.functional.Either
import com.wire.kalium.common.functional.fold
import com.wire.kalium.common.functional.right
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.logic.data.id.QualifiedIdMapper
import com.wire.kalium.logic.data.id.SelfTeamIdProvider
Expand All @@ -37,6 +37,7 @@ import com.wire.kalium.persistence.dao.message.LocalId
import io.mockative.Mockable
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlin.uuid.Uuid

/**
* This class is responsible to generate system messages for new group conversations.
Expand Down Expand Up @@ -66,6 +67,12 @@ internal interface NewGroupConversationSystemMessagesCreator {
): Either<CoreFailure, Unit>

suspend fun conversationCellStatus(conversation: ConversationEntity): Either<CoreFailure, Unit>
suspend fun conversationAppsAccessIfEnabled(
eventId: String = LocalId.generate(),
conversationId: ConversationId,
hasAppsAccessEnabled: Boolean,
creatorId: UserId
): Either<CoreFailure, Unit>
}

internal class NewGroupConversationSystemMessagesCreatorImpl(
Expand Down Expand Up @@ -246,5 +253,29 @@ internal class NewGroupConversationSystemMessagesCreatorImpl(
} ?: Either.Right(Unit)
}

override suspend fun conversationAppsAccessIfEnabled(
eventId: String,
conversationId: ConversationId,
hasAppsAccessEnabled: Boolean,
creatorId: UserId
): Either<CoreFailure, Unit> {
return if (hasAppsAccessEnabled) {
persistMessage(
Message.System(
eventId,
MessageContent.ConversationAppsEnabledChanged(isEnabled = true),
conversationId,
Clock.System.now(),
creatorId,
Message.Status.Sent,
Message.Visibility.VISIBLE,
expirationData = null
)
)
} else {
Unit.right()
}
}

private suspend fun isSelfATeamMember() = selfTeamIdProvider().fold({ false }, { it != null })
}
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,7 @@ class MessageMapperImpl(
MessageEntity.ContentType.LEGAL_HOLD -> null
MessageEntity.ContentType.CONVERSATION_WITH_CELL -> null
MessageEntity.ContentType.CONVERSATION_WITH_CELL_SELF_DELETE_DISABLED -> null
MessageEntity.ContentType.CONVERSATION_APPS_ENABLED_CHANGED -> null

MessageEntity.ContentType.MULTIPART -> LocalNotificationMessage.Text(
messageId = message.id,
Expand Down Expand Up @@ -498,9 +499,12 @@ fun MessageEntityContent.System.toMessageContent(): MessageContent.System = when
MessageContent.LegalHold.ForMembers.Enabled(this.memberUserIdList.map { it.toModel() })
}
}

is MessageEntityContent.NewConversationWithCellMessage -> MessageContent.NewConversationWithCellMessage
is MessageEntityContent.NewConversationWithCellSelfDeleteDisabledMessage ->
MessageContent.NewConversationWithCellSelfDeleteDisabledMessage

is MessageEntityContent.ConversationAppsAccessChanged -> MessageContent.ConversationAppsEnabledChanged(isEnabled)
}

fun Message.Visibility.toEntityVisibility(): MessageEntity.Visibility = when (this) {
Expand Down Expand Up @@ -812,6 +816,7 @@ fun MessageContent.System.toMessageEntityContent(): MessageEntityContent.System

MessageContent.NewConversationWithCellMessage -> MessageEntityContent.NewConversationWithCellMessage
MessageContent.NewConversationWithCellSelfDeleteDisabledMessage -> MessageEntityContent.NewConversationWithCellSelfDeleteDisabledMessage
is MessageContent.ConversationAppsEnabledChanged -> MessageEntityContent.ConversationAppsAccessChanged(isEnabled)
}

fun MessageAssetStatus.toDao(): MessageAssetStatusEntity {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@
package com.wire.kalium.logic.data.message

import com.wire.kalium.common.error.CoreFailure
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.data.notification.NotificationEventsManager
import com.wire.kalium.common.functional.Either
import com.wire.kalium.common.functional.fold
import com.wire.kalium.common.functional.map
import com.wire.kalium.common.functional.onSuccess
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.notification.NotificationEventsManager
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.persistence.dao.message.InsertMessageResult
import io.mockative.Mockable

Expand Down Expand Up @@ -134,6 +134,7 @@ internal class PersistMessageUseCaseImpl(
is MessageContent.History -> false
is MessageContent.NewConversationWithCellMessage -> false
is MessageContent.NewConversationWithCellSelfDeleteDisabledMessage -> false
is MessageContent.ConversationAppsEnabledChanged -> false
}

@Suppress("ComplexMethod")
Expand Down Expand Up @@ -194,6 +195,7 @@ internal class PersistMessageUseCaseImpl(
is MessageContent.InCallEmoji,
is MessageContent.History,
is MessageContent.NewConversationWithCellMessage,
is MessageContent.ConversationAppsEnabledChanged,
is MessageContent.NewConversationWithCellSelfDeleteDisabledMessage -> false
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@
package com.wire.kalium.logic.data.message

import com.wire.kalium.common.error.CoreFailure
import com.wire.kalium.common.functional.Either
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.common.functional.Either
import com.wire.kalium.persistence.dao.message.LocalId
import io.mockative.Mockable
import kotlinx.datetime.Clock
Expand All @@ -48,6 +48,13 @@ internal interface SystemMessageInserter {
suspend fun insertLostCommitSystemMessage(conversationId: ConversationId, instant: Instant): Either<CoreFailure, Unit>

suspend fun insertConversationStartedUnverifiedWarning(conversationId: ConversationId)

suspend fun insertConversationAppsAccessChanged(
eventId: String = LocalId.generate(),
conversationId: ConversationId,
senderUserId: UserId,
isAppsAccessEnabled: Boolean
)
}

internal class SystemMessageInserterImpl(
Expand Down Expand Up @@ -137,4 +144,24 @@ internal class SystemMessageInserterImpl(
)
)
}

override suspend fun insertConversationAppsAccessChanged(
eventId: String,
conversationId: ConversationId,
senderUserId: UserId,
isAppsAccessEnabled: Boolean
) {
persistMessage(
Message.System(
id = eventId,
content = MessageContent.ConversationAppsEnabledChanged(isAppsAccessEnabled),
conversationId = conversationId,
date = Clock.System.now(),
senderUserId = senderUserId,
status = Message.Status.Sent,
visibility = Message.Visibility.VISIBLE,
expirationData = null
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1736,7 +1736,8 @@ class UserSessionScope internal constructor(
private val conversationAccessUpdateEventHandler: AccessUpdateEventHandler
get() = AccessUpdateEventHandler(
conversationDAO = userStorage.database.conversationDAO,
selfUserId = userId
selfUserId = userId,
systemMessageInserter = systemMessageInserter
)

private val mlsResetConversationEventHandler: MLSResetConversationEventHandler
Expand Down Expand Up @@ -2120,6 +2121,7 @@ class UserSessionScope internal constructor(
persistConversationsUseCase,
cryptoTransactionProvider,
resetMlsConversation,
systemMessageInserter
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import com.wire.kalium.logic.data.id.CurrentClientIdProvider
import com.wire.kalium.logic.data.id.SelfTeamIdProvider
import com.wire.kalium.logic.data.message.MessageRepository
import com.wire.kalium.logic.data.message.PersistMessageUseCase
import com.wire.kalium.logic.data.message.SystemMessageInserter
import com.wire.kalium.logic.data.properties.UserPropertyRepository
import com.wire.kalium.logic.data.sync.SlowSyncRepository
import com.wire.kalium.logic.data.team.TeamRepository
Expand All @@ -52,6 +53,7 @@ import com.wire.kalium.logic.feature.connection.MarkConnectionRequestAsNotifiedU
import com.wire.kalium.logic.feature.connection.ObserveConnectionListUseCase
import com.wire.kalium.logic.feature.connection.ObservePendingConnectionRequestsUseCase
import com.wire.kalium.logic.feature.connection.ObservePendingConnectionRequestsUseCaseImpl
import com.wire.kalium.logic.feature.conversation.apps.ChangeAccessForAppsInConversationUseCase
import com.wire.kalium.logic.feature.conversation.createconversation.CreateChannelUseCase
import com.wire.kalium.logic.feature.conversation.createconversation.CreateRegularGroupUseCase
import com.wire.kalium.logic.feature.conversation.createconversation.CreateRegularGroupUseCaseImpl
Expand Down Expand Up @@ -90,7 +92,6 @@ import com.wire.kalium.logic.feature.conversation.keyingmaterials.UpdateKeyingMa
import com.wire.kalium.logic.feature.conversation.messagetimer.UpdateMessageTimerUseCase
import com.wire.kalium.logic.feature.conversation.messagetimer.UpdateMessageTimerUseCaseImpl
import com.wire.kalium.logic.feature.conversation.mls.OneOnOneResolver
import com.wire.kalium.messaging.sending.MessageSender
import com.wire.kalium.logic.feature.message.ephemeral.DeleteEphemeralMessagesAfterEndDateUseCase
import com.wire.kalium.logic.feature.message.receipt.ConversationWorkQueue
import com.wire.kalium.logic.feature.message.receipt.ParallelConversationWorkQueue
Expand All @@ -101,6 +102,7 @@ import com.wire.kalium.logic.feature.team.DeleteTeamConversationUseCaseImpl
import com.wire.kalium.logic.sync.SyncManager
import com.wire.kalium.logic.sync.receiver.conversation.RenamedConversationEventHandler
import com.wire.kalium.logic.sync.receiver.handler.CodeUpdateHandlerImpl
import com.wire.kalium.messaging.sending.MessageSender
import com.wire.kalium.util.KaliumDispatcher
import com.wire.kalium.util.KaliumDispatcherImpl
import kotlinx.coroutines.CoroutineScope
Expand Down Expand Up @@ -140,6 +142,7 @@ class ConversationScope internal constructor(
private val persistConversationsUseCase: PersistConversationsUseCase,
private val transactionProvider: CryptoTransactionProvider,
private val resetMLSConversationUseCase: ResetMLSConversationUseCase,
private val systemMessageInserter: SystemMessageInserter,
internal val dispatcher: KaliumDispatcher = KaliumDispatcherImpl,
) {

Expand Down Expand Up @@ -271,7 +274,10 @@ class ConversationScope internal constructor(
)

val updateConversationAccess: UpdateConversationAccessRoleUseCase
get() = UpdateConversationAccessRoleUseCase(conversationRepository, conversationGroupRepository, syncManager)
get() = UpdateConversationAccessRoleUseCaseImpl(conversationRepository, conversationGroupRepository, syncManager)

val changeAccessForAppsInConversation: ChangeAccessForAppsInConversationUseCase
get() = ChangeAccessForAppsInConversationUseCase(updateConversationAccess, systemMessageInserter, selfUserId)

val updateConversationMemberRole: UpdateConversationMemberRoleUseCase
get() = UpdateConversationMemberRoleUseCaseImpl(conversationRepository)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@
package com.wire.kalium.logic.feature.conversation

import com.wire.kalium.common.error.CoreFailure
import com.wire.kalium.common.functional.Either
import com.wire.kalium.common.functional.flatMap
import com.wire.kalium.common.functional.fold
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.conversation.ConversationGroupRepository
import com.wire.kalium.logic.data.conversation.ConversationRepository
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.common.functional.Either
import com.wire.kalium.common.functional.flatMap
import com.wire.kalium.common.functional.fold
import com.wire.kalium.logic.sync.SyncManager
import io.mockative.Mockable
import kotlinx.coroutines.flow.first

/**
Expand All @@ -47,17 +48,36 @@ import kotlinx.coroutines.flow.first
*
* @see Conversation.Access
*/
@Mockable
interface UpdateConversationAccessRoleUseCase {
/**
* @param conversationId the id of the conversation
* @param accessRoles the set of access roles to set
* @param access the set of access to set
* @return the [Result] indicating a successful operation, otherwise a [CoreFailure]
*/
suspend operator fun invoke(
conversationId: ConversationId,
accessRoles: Set<Conversation.AccessRole>,
access: Set<Conversation.Access>,
): Result

sealed interface Result {
data object Success : Result
data class Failure(val cause: CoreFailure) : Result
}
}

class UpdateConversationAccessRoleUseCase internal constructor(
internal class UpdateConversationAccessRoleUseCaseImpl internal constructor(
private val conversationRepository: ConversationRepository,
private val conversationGroupRepository: ConversationGroupRepository,
private val syncManager: SyncManager
) {
suspend operator fun invoke(
) : UpdateConversationAccessRoleUseCase {
override suspend operator fun invoke(
conversationId: ConversationId,
accessRoles: Set<Conversation.AccessRole>,
access: Set<Conversation.Access>,
): Result {
): UpdateConversationAccessRoleUseCase.Result {

syncManager.waitUntilLiveOrFailure().flatMap {
if (!accessRoles.contains(Conversation.AccessRole.GUEST)
Expand All @@ -72,14 +92,9 @@ class UpdateConversationAccessRoleUseCase internal constructor(
return conversationRepository
.updateAccessInfo(conversationId, access, accessRoles)
.fold({
Result.Failure(it)
UpdateConversationAccessRoleUseCase.Result.Failure(it)
}, {
Result.Success
UpdateConversationAccessRoleUseCase.Result.Success
})
}

sealed interface Result {
data object Success : Result
data class Failure(val cause: CoreFailure) : Result
}
}
Loading
Loading