diff --git a/core/data/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageContent.kt b/core/data/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageContent.kt index a99081b8137c..1263237b4bf9 100644 --- a/core/data/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageContent.kt +++ b/core/data/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageContent.kt @@ -315,9 +315,10 @@ sealed interface MessageContent { data class FederationRemoved(override val members: List) : MemberChange(members) /** - * Self user was assigned the admin role in the conversation. Local-only. + * A user was assigned the admin role in the conversation. + * `members.first()` is the promoted user. */ - data class SelfUserPromotedToAdmin(override val members: List) : MemberChange(members) + data class UserPromotedToAdmin(override val members: List) : MemberChange(members) } data class LastRead( @@ -491,7 +492,7 @@ fun MessageContent?.getType() = when (this) { is MessageContent.ButtonAction -> "ButtonAction" is MessageContent.ButtonActionConfirmation -> "ButtonActionConfirmation" is MessageContent.MemberChange.FederationRemoved -> "MemberChange.FederationRemoved" - is MessageContent.MemberChange.SelfUserPromotedToAdmin -> "MemberChange.PromotedToAdmin" + is MessageContent.MemberChange.UserPromotedToAdmin -> "MemberChange.PromotedToAdmin" is MessageContent.FederationStopped.ConnectionRemoved -> "Federation.ConnectionRemoved" is MessageContent.FederationStopped.Removed -> "Federation.Removed" is MessageContent.ConversationProtocolChanged -> "ConversationProtocolChanged" diff --git a/data/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageEntity.kt b/data/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageEntity.kt index 870814c634aa..24c246a822b6 100644 --- a/data/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageEntity.kt +++ b/data/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageEntity.kt @@ -203,9 +203,9 @@ sealed interface MessageEntity { REMOVED_FROM_TEAM, /** - * Self user was assigned the admin role in the conversation. Local-only. + * A user was assigned the admin role in the conversation. */ - SELF_USER_PROMOTED_TO_ADMIN + USER_PROMOTED_TO_ADMIN } enum class FederationType { diff --git a/data/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageMapper.kt b/data/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageMapper.kt index 9a287057e724..fbb8ce9053b0 100644 --- a/data/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageMapper.kt +++ b/data/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageMapper.kt @@ -201,7 +201,7 @@ object MessageMapper { otherUserIdList = userIdList.filterNot { it == selfUserId }, ) - MessageEntity.MemberChangeType.SELF_USER_PROMOTED_TO_ADMIN -> MessagePreviewEntityContent.Unknown + MessageEntity.MemberChangeType.USER_PROMOTED_TO_ADMIN -> MessagePreviewEntityContent.Unknown } } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt index 0354eea74246..3d1825b71a9a 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt @@ -470,7 +470,7 @@ internal fun MessageEntityContent.System.toMessageContent(): MessageContent.Syst MessageEntity.MemberChangeType.FEDERATION_REMOVED -> MessageContent.MemberChange.FederationRemoved(memberList) MessageEntity.MemberChangeType.REMOVED_FROM_TEAM -> MessageContent.MemberChange.RemovedFromTeam(memberList) - MessageEntity.MemberChangeType.SELF_USER_PROMOTED_TO_ADMIN -> MessageContent.MemberChange.SelfUserPromotedToAdmin(memberList) + MessageEntity.MemberChangeType.USER_PROMOTED_TO_ADMIN -> MessageContent.MemberChange.UserPromotedToAdmin(memberList) } } @@ -785,9 +785,9 @@ internal fun MessageContent.System.toMessageEntityContent(): MessageEntityConten MessageEntity.MemberChangeType.REMOVED_FROM_TEAM ) - is MessageContent.MemberChange.SelfUserPromotedToAdmin -> MessageEntityContent.MemberChange( + is MessageContent.MemberChange.UserPromotedToAdmin -> MessageEntityContent.MemberChange( memberUserIdList, - MessageEntity.MemberChangeType.SELF_USER_PROMOTED_TO_ADMIN + MessageEntity.MemberChangeType.USER_PROMOTED_TO_ADMIN ) } } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/PersistMessageUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/PersistMessageUseCase.kt index d6ce76f509af..9f49627e8204 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/PersistMessageUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/PersistMessageUseCase.kt @@ -143,7 +143,7 @@ internal class PersistMessageUseCaseImpl( is MessageContent.Location -> true is MessageContent.LegalHold -> false is MessageContent.MemberChange.RemovedFromTeam -> false - is MessageContent.MemberChange.SelfUserPromotedToAdmin -> false + is MessageContent.MemberChange.UserPromotedToAdmin -> true is MessageContent.TeamMemberRemoved -> false is MessageContent.DataTransfer -> false is MessageContent.InCallEmoji -> false @@ -208,7 +208,7 @@ internal class PersistMessageUseCaseImpl( is MessageContent.ConversationStartedUnverifiedWarning, is MessageContent.LegalHold, is MessageContent.MemberChange.RemovedFromTeam, - is MessageContent.MemberChange.SelfUserPromotedToAdmin, + is MessageContent.MemberChange.UserPromotedToAdmin, is MessageContent.TeamMemberRemoved, is MessageContent.DataTransfer, is MessageContent.InCallEmoji, diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberChangeEventHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberChangeEventHandler.kt index d6cdeacf2c8a..5998fa0a83d0 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberChangeEventHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberChangeEventHandler.kt @@ -107,11 +107,11 @@ internal class MemberChangeEventHandlerImpl( } .onFailure { eventLogger.logFailure(it) } .onSuccess { - if (event.member?.id == selfUserId && event.member.role == Conversation.Member.Role.Admin) { + event.member?.takeIf { it.role == Conversation.Member.Role.Admin }?.let { promotedMember -> persistMessage( Message.System( id = event.id, - content = MessageContent.MemberChange.SelfUserPromotedToAdmin(members = listOf(selfUserId)), + content = MessageContent.MemberChange.UserPromotedToAdmin(members = listOf(promotedMember.id)), conversationId = event.conversationId, date = Instant.parse(event.timestampIso), senderUserId = selfUserId, diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberChangeEventHandlerTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberChangeEventHandlerTest.kt index 8ea063463347..d574c6da19ff 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberChangeEventHandlerTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberChangeEventHandlerTest.kt @@ -178,26 +178,35 @@ class MemberChangeEventHandlerTest { verifySuspend(VerifyMode.exactly(1)) { arrangement.persistMessage( matches { message -> - message.content is MessageContent.MemberChange.SelfUserPromotedToAdmin + val content = message.content + content is MessageContent.MemberChange.UserPromotedToAdmin && + content.members == listOf(TestUser.USER_ID) } ) } } @Test - fun givenOtherUserPromotedToAdmin_whenHandlingMemberChangedRole_thenNoSystemMessageIsPersisted() = runTest { + fun givenOtherUserPromotedToAdmin_whenHandlingMemberChangedRole_thenSystemMessageIsPersisted() = runTest { val otherMember = Member(TestUser.OTHER_USER_ID, Member.Role.Admin) val event = TestEvent.memberChange(member = otherMember) val (arrangement, eventHandler) = Arrangement() .withFetchConversationIfUnknownSucceeding() .withUpdateMemberSucceeding() + .withPersistMessageSucceeding() .arrange() eventHandler.handle(arrangement.transactionContext, event) - verifySuspend(VerifyMode.not) { - arrangement.persistMessage(any()) + verifySuspend(VerifyMode.exactly(1)) { + arrangement.persistMessage( + matches { message -> + val content = message.content + content is MessageContent.MemberChange.UserPromotedToAdmin && + content.members == listOf(TestUser.OTHER_USER_ID) + } + ) } }