mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-19 14:19:53 +01:00
Use Conversation Manager for message retrieval
This commit is contained in:
@@ -1,15 +1,42 @@
|
|||||||
package org.briarproject.briar.headless.messaging
|
package org.briarproject.briar.headless.messaging
|
||||||
|
|
||||||
import org.briarproject.bramble.api.contact.ContactId
|
import org.briarproject.bramble.api.contact.ContactId
|
||||||
|
import org.briarproject.briar.api.introduction.IntroductionRequest
|
||||||
|
import org.briarproject.briar.api.introduction.IntroductionResponse
|
||||||
import org.briarproject.briar.api.messaging.PrivateMessage
|
import org.briarproject.briar.api.messaging.PrivateMessage
|
||||||
import org.briarproject.briar.api.messaging.PrivateMessageHeader
|
import org.briarproject.briar.api.messaging.PrivateMessageHeader
|
||||||
|
import org.briarproject.briar.api.messaging.PrivateRequest
|
||||||
|
import org.briarproject.briar.api.messaging.PrivateResponse
|
||||||
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent
|
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent
|
||||||
|
import org.briarproject.briar.api.sharing.InvitationRequest
|
||||||
|
import org.briarproject.briar.api.sharing.InvitationResponse
|
||||||
|
|
||||||
internal fun PrivateMessageHeader.output(contactId: ContactId, body: String) =
|
internal fun PrivateMessageHeader.output(
|
||||||
OutputPrivateMessage(this, contactId, body)
|
contactId: ContactId,
|
||||||
|
body: String?
|
||||||
|
) = OutputPrivateMessage(this, contactId, body)
|
||||||
|
|
||||||
internal fun PrivateMessage.output(contactId: ContactId, body: String) =
|
internal fun PrivateMessage.output(contactId: ContactId, body: String) =
|
||||||
OutputPrivateMessage(this, contactId, body)
|
OutputPrivateMessage(this, contactId, body)
|
||||||
|
|
||||||
internal fun PrivateMessageReceivedEvent.output(body: String) =
|
internal fun PrivateMessageReceivedEvent<*>.output(body: String) =
|
||||||
messageHeader.output(contactId, body)
|
messageHeader.output(contactId, body)
|
||||||
|
|
||||||
|
internal fun IntroductionRequest.output(contactId: ContactId) =
|
||||||
|
OutputIntroductionRequest(this, contactId)
|
||||||
|
|
||||||
|
internal fun PrivateRequest<*>.output(contactId: ContactId): OutputPrivateMessage {
|
||||||
|
return when (this) {
|
||||||
|
is IntroductionRequest -> OutputIntroductionRequest(this, contactId)
|
||||||
|
is InvitationRequest -> OutputInvitationRequest(this, contactId)
|
||||||
|
else -> throw AssertionError("Unknown PrivateRequest")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun PrivateResponse.output(contactId: ContactId): OutputPrivateMessage {
|
||||||
|
return when (this) {
|
||||||
|
is IntroductionResponse -> OutputIntroductionResponse(this, contactId)
|
||||||
|
is InvitationResponse -> OutputInvitationResponse(this, contactId)
|
||||||
|
else -> throw AssertionError("Unknown PrivateResponse")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,9 +11,8 @@ import org.briarproject.bramble.api.db.NoSuchContactException
|
|||||||
import org.briarproject.bramble.api.event.Event
|
import org.briarproject.bramble.api.event.Event
|
||||||
import org.briarproject.bramble.api.event.EventListener
|
import org.briarproject.bramble.api.event.EventListener
|
||||||
import org.briarproject.bramble.api.system.Clock
|
import org.briarproject.bramble.api.system.Clock
|
||||||
|
import org.briarproject.briar.api.messaging.*
|
||||||
import org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_BODY_LENGTH
|
import org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_BODY_LENGTH
|
||||||
import org.briarproject.briar.api.messaging.MessagingManager
|
|
||||||
import org.briarproject.briar.api.messaging.PrivateMessageFactory
|
|
||||||
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent
|
import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent
|
||||||
import org.briarproject.briar.headless.WebSocketController
|
import org.briarproject.briar.headless.WebSocketController
|
||||||
import java.util.concurrent.Executor
|
import java.util.concurrent.Executor
|
||||||
@@ -21,11 +20,15 @@ import javax.annotation.concurrent.Immutable
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
private const val EVENT_PRIVATE_MESSAGE =
|
||||||
|
"org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent"
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@Singleton
|
@Singleton
|
||||||
internal class MessagingControllerImpl @Inject
|
internal class MessagingControllerImpl @Inject
|
||||||
constructor(
|
constructor(
|
||||||
private val messagingManager: MessagingManager,
|
private val messagingManager: MessagingManager,
|
||||||
|
private val conversationManager: ConversationManager,
|
||||||
private val privateMessageFactory: PrivateMessageFactory,
|
private val privateMessageFactory: PrivateMessageFactory,
|
||||||
private val contactManager: ContactManager,
|
private val contactManager: ContactManager,
|
||||||
private val webSocketController: WebSocketController,
|
private val webSocketController: WebSocketController,
|
||||||
@@ -35,10 +38,15 @@ constructor(
|
|||||||
|
|
||||||
override fun list(ctx: Context): Context {
|
override fun list(ctx: Context): Context {
|
||||||
val contact = getContact(ctx)
|
val contact = getContact(ctx)
|
||||||
|
val messages = conversationManager.getMessageHeaders(contact.id).map { header ->
|
||||||
val messages = messagingManager.getMessageHeaders(contact.id).map { header ->
|
when (header) {
|
||||||
val body = messagingManager.getMessageBody(header.id)
|
is PrivateRequest<*> -> header.output(contact.id)
|
||||||
header.output(contact.id, body)
|
is PrivateResponse -> header.output(contact.id)
|
||||||
|
else -> {
|
||||||
|
val body = messagingManager.getMessageBody(header.id)
|
||||||
|
header.output(contact.id, body)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ctx.json(messages)
|
return ctx.json(messages)
|
||||||
}
|
}
|
||||||
@@ -62,11 +70,9 @@ constructor(
|
|||||||
|
|
||||||
override fun eventOccurred(e: Event) {
|
override fun eventOccurred(e: Event) {
|
||||||
when (e) {
|
when (e) {
|
||||||
is PrivateMessageReceivedEvent -> dbExecutor.run {
|
is PrivateMessageReceivedEvent<*> -> dbExecutor.run {
|
||||||
val name =
|
|
||||||
"org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent"
|
|
||||||
val body = messagingManager.getMessageBody(e.messageHeader.id)
|
val body = messagingManager.getMessageBody(e.messageHeader.id)
|
||||||
webSocketController.sendEvent(name, e.output(body))
|
webSocketController.sendEvent(EVENT_PRIVATE_MESSAGE, e.output(body))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
@file:Suppress("MemberVisibilityCanBePrivate", "unused")
|
||||||
|
|
||||||
package org.briarproject.briar.headless.messaging
|
package org.briarproject.briar.headless.messaging
|
||||||
|
|
||||||
import org.briarproject.bramble.api.contact.ContactId
|
import org.briarproject.bramble.api.contact.ContactId
|
||||||
@@ -6,8 +8,8 @@ import org.briarproject.briar.api.messaging.PrivateMessageHeader
|
|||||||
import javax.annotation.concurrent.Immutable
|
import javax.annotation.concurrent.Immutable
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
internal data class OutputPrivateMessage(
|
internal open class OutputPrivateMessage(
|
||||||
val body: String,
|
val body: String?,
|
||||||
val timestamp: Long,
|
val timestamp: Long,
|
||||||
val read: Boolean,
|
val read: Boolean,
|
||||||
val seen: Boolean,
|
val seen: Boolean,
|
||||||
@@ -17,7 +19,13 @@ internal data class OutputPrivateMessage(
|
|||||||
val groupId: ByteArray,
|
val groupId: ByteArray,
|
||||||
val contactId: Int
|
val contactId: Int
|
||||||
) {
|
) {
|
||||||
internal constructor(header: PrivateMessageHeader, contactId: ContactId, body: String) : this(
|
open val type = "org.briarproject.briar.api.messaging.PrivateMessageHeader"
|
||||||
|
|
||||||
|
internal constructor(
|
||||||
|
header: PrivateMessageHeader,
|
||||||
|
contactId: ContactId,
|
||||||
|
body: String?
|
||||||
|
) : this(
|
||||||
body = body,
|
body = body,
|
||||||
timestamp = header.timestamp,
|
timestamp = header.timestamp,
|
||||||
read = header.isRead,
|
read = header.isRead,
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
@file:Suppress("MemberVisibilityCanBePrivate", "unused")
|
||||||
|
|
||||||
|
package org.briarproject.briar.headless.messaging
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.contact.ContactId
|
||||||
|
import org.briarproject.briar.api.blog.BlogInvitationRequest
|
||||||
|
import org.briarproject.briar.api.forum.ForumInvitationRequest
|
||||||
|
import org.briarproject.briar.api.introduction.IntroductionRequest
|
||||||
|
import org.briarproject.briar.api.messaging.PrivateRequest
|
||||||
|
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest
|
||||||
|
import org.briarproject.briar.api.sharing.InvitationRequest
|
||||||
|
import javax.annotation.concurrent.Immutable
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
internal abstract class OutputPrivateRequest(header: PrivateRequest<*>, contactId: ContactId) :
|
||||||
|
OutputPrivateMessage(header, contactId, header.message) {
|
||||||
|
|
||||||
|
val sessionId: ByteArray = header.sessionId.bytes
|
||||||
|
val name: String = header.name
|
||||||
|
val answered = header.wasAnswered()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
internal class OutputIntroductionRequest(header: IntroductionRequest, contactId: ContactId) :
|
||||||
|
OutputPrivateRequest(header, contactId) {
|
||||||
|
|
||||||
|
override val type = "org.briarproject.briar.api.introduction.IntroductionRequest"
|
||||||
|
val alreadyContact = header.isContact
|
||||||
|
}
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
internal class OutputInvitationRequest(header: InvitationRequest<*>, contactId: ContactId) :
|
||||||
|
OutputPrivateRequest(header, contactId) {
|
||||||
|
|
||||||
|
override val type = when (header) {
|
||||||
|
is ForumInvitationRequest -> "org.briarproject.briar.api.forum.ForumInvitationRequest"
|
||||||
|
is BlogInvitationRequest -> "org.briarproject.briar.api.blog.BlogInvitationRequest"
|
||||||
|
is GroupInvitationRequest -> "org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest"
|
||||||
|
else -> throw AssertionError("Unknown InvitationRequest")
|
||||||
|
}
|
||||||
|
val canBeOpened = header.canBeOpened()
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
@file:Suppress("MemberVisibilityCanBePrivate", "unused")
|
||||||
|
|
||||||
|
package org.briarproject.briar.headless.messaging
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.contact.ContactId
|
||||||
|
import org.briarproject.briar.api.blog.BlogInvitationResponse
|
||||||
|
import org.briarproject.briar.api.forum.ForumInvitationResponse
|
||||||
|
import org.briarproject.briar.api.introduction.IntroductionResponse
|
||||||
|
import org.briarproject.briar.api.messaging.PrivateResponse
|
||||||
|
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse
|
||||||
|
import org.briarproject.briar.api.sharing.InvitationResponse
|
||||||
|
import org.briarproject.briar.headless.output
|
||||||
|
import javax.annotation.concurrent.Immutable
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
internal abstract class OutputPrivateResponse(header: PrivateResponse, contactId: ContactId) :
|
||||||
|
OutputPrivateMessage(header, contactId, null) {
|
||||||
|
|
||||||
|
val sessionId: ByteArray = header.sessionId.bytes
|
||||||
|
val accepted = header.wasAccepted()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
internal class OutputIntroductionResponse(header: IntroductionResponse, contactId: ContactId) :
|
||||||
|
OutputPrivateResponse(header, contactId) {
|
||||||
|
|
||||||
|
override val type = "org.briarproject.briar.api.introduction.IntroductionResponse"
|
||||||
|
val introducedAuthor = header.introducedAuthor.output()
|
||||||
|
val introducer = header.isIntroducer
|
||||||
|
}
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
internal class OutputInvitationResponse(header: InvitationResponse, contactId: ContactId) :
|
||||||
|
OutputPrivateResponse(header, contactId) {
|
||||||
|
|
||||||
|
override val type = when (header) {
|
||||||
|
is ForumInvitationResponse -> "org.briarproject.briar.api.forum.ForumInvitationResponse"
|
||||||
|
is BlogInvitationResponse -> "org.briarproject.briar.api.blog.BlogInvitationResponse"
|
||||||
|
is GroupInvitationResponse -> "org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse"
|
||||||
|
else -> throw AssertionError("Unknown InvitationResponse")
|
||||||
|
}
|
||||||
|
val shareableId: ByteArray = header.shareableId.bytes
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user