From de65fbb1302764ef3697e3c93f3d1a2155ccc983 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Wed, 27 May 2026 09:25:01 +0800 Subject: [PATCH 1/2] fix(job): skip auto-create for group conversation in checkConversationExist The createConversation path in MixinJob builds a minimal ConversationRequest without random_id, name, announcement, or full participants. When a GROUP conversation falls into SendMessageJob's checkConversationExist with a non-SUCCESS status, it triggers /conversations create with category=GROUP but no random_id, which the server rejects (missing or invalid UUID). Short-circuit groups here so creation stays on the proper flow via GroupViewModel / ConversationListViewModel.createGroupConversation, which always supplies a valid randomId. --- app/src/main/java/one/mixin/android/job/MixinJob.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/one/mixin/android/job/MixinJob.kt b/app/src/main/java/one/mixin/android/job/MixinJob.kt index 797f65ac9e..11f3453b62 100644 --- a/app/src/main/java/one/mixin/android/job/MixinJob.kt +++ b/app/src/main/java/one/mixin/android/job/MixinJob.kt @@ -209,6 +209,9 @@ abstract class MixinJob( } protected fun checkConversationExist(conversation: Conversation): Long? { + if (conversation.isGroupConversation()) { + return conversation.expireIn + } return if (conversation.status != ConversationStatus.SUCCESS.ordinal) { createConversation(conversation) } else { From aa209717d3018adfcf7a0984d05ea0d2d15d1af6 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Wed, 27 May 2026 10:39:21 +0800 Subject: [PATCH 2/2] fix(job): guard against group conversation in createConversation createConversation builds a minimal ConversationRequest without random_id, name, or full participants, which is only valid for CONTACT (1v1) where the conversationId is deterministically derived from two userIds. If a GROUP slips into this path (e.g. SendMessageJob.checkConversationExist on a non-SUCCESS local group), the /conversations POST hits the server with category=GROUP but no random_id, yielding 'invalid UUID' or missing-param errors and a broken group on the server. Bail out early for groups and report the unexpected state so the proper GroupViewModel / ConversationListViewModel flow remains the only path that creates groups. --- app/src/main/java/one/mixin/android/job/MixinJob.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/one/mixin/android/job/MixinJob.kt b/app/src/main/java/one/mixin/android/job/MixinJob.kt index 11f3453b62..e5d7d67a6f 100644 --- a/app/src/main/java/one/mixin/android/job/MixinJob.kt +++ b/app/src/main/java/one/mixin/android/job/MixinJob.kt @@ -182,6 +182,13 @@ abstract class MixinJob( } private fun createConversation(conversation: Conversation): Long? { + if (conversation.isGroupConversation()) { + reportException( + "Skip MixinJob.createConversation for group", + IllegalStateException("conversation_id=${conversation.conversationId}"), + ) + return conversation.expireIn + } val request = ConversationRequest( conversationId = conversation.conversationId, @@ -209,9 +216,6 @@ abstract class MixinJob( } protected fun checkConversationExist(conversation: Conversation): Long? { - if (conversation.isGroupConversation()) { - return conversation.expireIn - } return if (conversation.status != ConversationStatus.SUCCESS.ordinal) { createConversation(conversation) } else {