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 @@ -315,9 +315,10 @@ sealed interface MessageContent {
data class FederationRemoved(override val members: List<UserId>) : 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<UserId>) : MemberChange(members)
data class UserPromotedToAdmin(override val members: List<UserId>) : MemberChange(members)
}

data class LastRead(
Expand Down Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

Expand Down Expand Up @@ -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
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
)
}
}

Expand Down
Loading