From 20edfe62e41539195157db59ee393ec1d37fe218 Mon Sep 17 00:00:00 2001 From: Sven Jost Date: Thu, 4 Apr 2024 16:18:28 +0200 Subject: [PATCH] feat: testservice can return message receipts [WPB-7414] (#2694) --- .../api/v1/ConversationResources.kt | 38 +++++++++++++++++++ .../managed/ConversationRepository.kt | 25 ++++++++++++ .../models/GetMessageReceiptsRequest.kt | 24 ++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 testservice/src/main/kotlin/com/wire/kalium/testservice/models/GetMessageReceiptsRequest.kt diff --git a/testservice/src/main/kotlin/com/wire/kalium/testservice/api/v1/ConversationResources.kt b/testservice/src/main/kotlin/com/wire/kalium/testservice/api/v1/ConversationResources.kt index ecaf64e7ba2..6778f988478 100644 --- a/testservice/src/main/kotlin/com/wire/kalium/testservice/api/v1/ConversationResources.kt +++ b/testservice/src/main/kotlin/com/wire/kalium/testservice/api/v1/ConversationResources.kt @@ -21,12 +21,14 @@ package com.wire.kalium.testservice.api.v1 import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.message.Message import com.wire.kalium.logic.data.message.mention.MessageMention +import com.wire.kalium.logic.data.message.receipt.DetailedReceipt import com.wire.kalium.logic.data.message.receipt.ReceiptType import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.testservice.managed.ConversationRepository import com.wire.kalium.testservice.managed.InstanceService import com.wire.kalium.testservice.models.ClearConversationRequest import com.wire.kalium.testservice.models.DeleteMessageRequest +import com.wire.kalium.testservice.models.GetMessageReceiptsRequest import com.wire.kalium.testservice.models.GetMessagesRequest import com.wire.kalium.testservice.models.SendButtonActionConfirmationRequest import com.wire.kalium.testservice.models.SendButtonActionRequest @@ -134,6 +136,42 @@ class ConversationResources(private val instanceService: InstanceService) { } } + @POST + @Path("/instance/{id}/getMessageReadReceipts") + @Operation(summary = "Get all read receipts of a specific message") + @Consumes(MediaType.APPLICATION_JSON) + fun getMessageReadReceipts(@PathParam("id") id: String, @Valid request: GetMessageReceiptsRequest): List { + val instance = instanceService.getInstanceOrThrow(id) + with(request) { + return runBlocking { + ConversationRepository.getMessageReceipts( + instance, + ConversationId(conversationId, conversationDomain), + messageId, + ReceiptType.READ + ) + } + } + } + + @POST + @Path("/instance/{id}/getMessageDeliveryReceipts") + @Operation(summary = "Get all delivery receipts of a specific message") + @Consumes(MediaType.APPLICATION_JSON) + fun getMessageDeliveryReceipts(@PathParam("id") id: String, @Valid request: GetMessageReceiptsRequest): List { + val instance = instanceService.getInstanceOrThrow(id) + with(request) { + return runBlocking { + ConversationRepository.getMessageReceipts( + instance, + ConversationId(conversationId, conversationDomain), + messageId, + ReceiptType.DELIVERED + ) + } + } + } + // POST /api/v1/instance/{instanceId}/mute // Mute a conversation. diff --git a/testservice/src/main/kotlin/com/wire/kalium/testservice/managed/ConversationRepository.kt b/testservice/src/main/kotlin/com/wire/kalium/testservice/managed/ConversationRepository.kt index f716923522a..3920d0c48b8 100644 --- a/testservice/src/main/kotlin/com/wire/kalium/testservice/managed/ConversationRepository.kt +++ b/testservice/src/main/kotlin/com/wire/kalium/testservice/managed/ConversationRepository.kt @@ -29,6 +29,7 @@ import com.wire.kalium.logic.feature.conversation.ClearConversationContentUseCas import com.wire.kalium.logic.feature.debug.BrokenState import com.wire.kalium.logic.feature.debug.SendBrokenAssetMessageResult import com.wire.kalium.logic.data.message.SelfDeletionTimer +import com.wire.kalium.logic.data.message.receipt.DetailedReceipt import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.message.composite.SendButtonActionConfirmationMessageUseCase import com.wire.kalium.logic.feature.message.composite.SendButtonActionMessageUseCase @@ -382,6 +383,30 @@ sealed class ConversationRepository { throw WebApplicationException("Instance ${instance.instanceId}: Could not get recent messages") } + suspend fun getMessageReceipts( + instance: Instance, + conversationId: ConversationId, + messageId: String, + type: ReceiptType + ): List { + instance.coreLogic.globalScope { + when (val session = session.currentSession()) { + is CurrentSessionResult.Success -> { + instance.coreLogic.sessionScope(session.accountInfo.userId) { + log.info("Instance ${instance.instanceId}: Get receipts...") + val receipts = messages.observeMessageReceipts(conversationId, messageId, type).first() + return receipts + } + } + + is CurrentSessionResult.Failure -> { + Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Session failure").build() + } + } + } + throw WebApplicationException("Instance ${instance.instanceId}: Could not get receipts from message") + } + @Suppress("LongParameterList", "LongMethod", "ThrowsCount") suspend fun sendFile( instance: Instance, diff --git a/testservice/src/main/kotlin/com/wire/kalium/testservice/models/GetMessageReceiptsRequest.kt b/testservice/src/main/kotlin/com/wire/kalium/testservice/models/GetMessageReceiptsRequest.kt new file mode 100644 index 00000000000..46a948b4eb8 --- /dev/null +++ b/testservice/src/main/kotlin/com/wire/kalium/testservice/models/GetMessageReceiptsRequest.kt @@ -0,0 +1,24 @@ +/* + * Wire + * Copyright (C) 2024 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.kalium.testservice.models + +data class GetMessageReceiptsRequest( + val conversationDomain: String = "staging.zinfra.io", + val conversationId: String = "", + val messageId: String = "", +)