Skip to content

Commit

Permalink
feat: support migrating to mls 1-1 (#1875)
Browse files Browse the repository at this point in the history
  • Loading branch information
typfel committed Oct 6, 2023
1 parent f3892b8 commit 8666153
Show file tree
Hide file tree
Showing 8 changed files with 158 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ UPDATE Connection SET last_update_date = ? WHERE to_id = ?;
updateNotificationFlag:
UPDATE Connection SET should_notify = ? WHERE qualified_to = ?;

updateConnectionConversation:
UPDATE Connection SET conversation_id = ?, qualified_conversation = ? WHERE qualified_to = ?;

setAllConnectionsAsNotified:
UPDATE Connection SET should_notify = 0
WHERE status = 'PENDING' AND should_notify = 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -506,3 +506,8 @@ WHERE conversation_id = ? AND id = ?;
insertMessageRecipientsFailure:
INSERT OR IGNORE INTO MessageRecipientFailure(message_id, conversation_id, recipient_failure_list, recipient_failure_type)
VALUES(?, ?, ?, ?);

moveMessages:
UPDATE Message
SET conversation_id = :to
WHERE conversation_id = :from;
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ interface ConnectionDAO {
suspend fun insertConnection(connectionEntity: ConnectionEntity)
suspend fun insertConnections(users: List<ConnectionEntity>)
suspend fun updateConnectionLastUpdatedTime(lastUpdate: String, id: String)
suspend fun updateConnectionConversation(conversationId: QualifiedIDEntity, userId: QualifiedIDEntity)
suspend fun deleteConnectionDataAndConversation(conversationId: QualifiedIDEntity)
suspend fun getConnectionRequestsForNotification(): Flow<List<ConnectionEntity>>
suspend fun updateNotificationFlag(flag: Boolean, userId: QualifiedIDEntity)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ class ConnectionDAOImpl(
connectionsQueries.updateConnectionLastUpdated(lastUpdate.toInstant(), id)
}

override suspend fun updateConnectionConversation(conversationId: QualifiedIDEntity, userId: QualifiedIDEntity) {
connectionsQueries.updateConnectionConversation(conversationId.value, conversationId, userId)
}

override suspend fun deleteConnectionDataAndConversation(conversationId: QualifiedIDEntity) = withContext(queriesContext) {
connectionsQueries.transaction {
connectionsQueries.deleteConnection(conversationId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,5 +133,7 @@ interface MessageDAO {
recipientFailureTypeEntity: RecipientFailureTypeEntity
)

suspend fun moveMessages(from: ConversationIDEntity, to: ConversationIDEntity)

val platformExtensions: MessageExtensions
}
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,11 @@ internal class MessageDAOImpl internal constructor(
queries.insertMessageRecipientsFailure(id, conversationsId, recipientsFailed, recipientFailureTypeEntity)
}

override suspend fun moveMessages(from: ConversationIDEntity, to: ConversationIDEntity) =
withContext(coroutineContext) {
queries.moveMessages(to, from)
}

override suspend fun getConversationUnreadEventsCount(conversationId: QualifiedIDEntity): Long = withContext(coroutineContext) {
unreadEventsQueries.getConversationUnreadEventsCount(conversationId).executeAsOne()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,27 @@ class ConnectionDaoTest : BaseDatabaseTest() {
assertEquals(false, result[1].shouldNotify)
}

@Test
fun givenConnection_WhenUpdatingConnectionConversation_ThenItIsUpdated() = runTest {
val newConversationId = QualifiedIDEntity("new", "wire.com")
db.connectionDAO.insertConnection(connection1)
db.connectionDAO.updateConnectionConversation(newConversationId, connection1.qualifiedToId)
val result = db.connectionDAO.getConnectionRequests().first()
assertEquals(newConversationId, result[0].qualifiedConversationId)
assertEquals(newConversationId.value, result[0].conversationId)
}

companion object {
val OTHER_USER_ID = QualifiedIDEntity("me", "wire.com")

private fun connectionEntity(id: String = "0") = ConnectionEntity(
conversationId = "$id@wire.com",
conversationId = id,
from = "from_string",
lastUpdateDate = "2022-03-30T15:36:00.000Z".toInstant(),
qualifiedConversationId = QualifiedIDEntity(id, "wire.com"),
qualifiedToId = QualifiedIDEntity("me", "wire.com"),
qualifiedToId = OTHER_USER_ID,
status = ConnectionEntity.State.PENDING,
toId = "[email protected]",
toId = OTHER_USER_ID.value,
shouldNotify = true
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1633,6 +1633,129 @@ class MessageDAOTest : BaseDatabaseTest() {
assertTrue(result.readCount == 0L)
}

@Test
fun givenExistingMessagesAtSource_whenMovingMessages_thenMessagesAreAccessibleAtDestination() = runTest {
// given
val source = conversationEntity1
val destination = conversationEntity2
userDAO.upsertUsers(listOf(userEntity1, userEntity2))
conversationDAO.insertConversation(source)
conversationDAO.insertConversation(destination)

val allMessages = listOf(
newRegularMessageEntity(
id = "1",
senderUserId = userEntity1.id,
conversationId = source.id,
content = MessageEntityContent.Text(messageBody = "Message 1")
),
newRegularMessageEntity(
id = "2",
senderUserId = userEntity1.id,
conversationId = source.id,
content = MessageEntityContent.Text(messageBody = "Message 2")
)
)
messageDAO.insertOrIgnoreMessages(allMessages)

// when
messageDAO.moveMessages(source.id, destination.id)

// then
val retrievedMessages = messageDAO.getMessagesByConversationAndVisibility(
destination.id,
10,
0,
listOf(MessageEntity.Visibility.VISIBLE)
).first()

assertEquals(
allMessages.map { it.content }.toSet(),
retrievedMessages.map { it.content }.toSet())
}

@Test
fun givenExistingMessagesAtSourceAndDestination_whenMovingMessages_thenMessagesAreAccessibleAtDestination() = runTest {
// given
val source = conversationEntity1
val destination = conversationEntity2
userDAO.upsertUsers(listOf(userEntity1, userEntity2))
conversationDAO.insertConversation(source)
conversationDAO.insertConversation(destination)

val allMessages = listOf(
newRegularMessageEntity(
id = "1",
senderUserId = userEntity1.id,
conversationId = source.id,
content = MessageEntityContent.Text(messageBody = "Message 1")
),
newRegularMessageEntity(
id = "2",
senderUserId = userEntity1.id,
conversationId = destination.id,
content = MessageEntityContent.Text(messageBody = "Message 2")
)
)
messageDAO.insertOrIgnoreMessages(allMessages)

// when
messageDAO.moveMessages(source.id, destination.id)

// then
val retrievedMessages = messageDAO.getMessagesByConversationAndVisibility(
destination.id,
10,
0,
listOf(MessageEntity.Visibility.VISIBLE)
).first()

assertEquals(
allMessages.map { it.content }.toSet(),
retrievedMessages.map { it.content }.toSet())
}

@Test
fun givenNoExistingMessagesAtSource_whenMovingMessages_thenExistingMessagesAreAccessibleAtDestination() = runTest {
// given
val source = conversationEntity1
val destination = conversationEntity2
userDAO.upsertUsers(listOf(userEntity1, userEntity2))
conversationDAO.insertConversation(source)
conversationDAO.insertConversation(destination)

val allMessages = listOf(
newRegularMessageEntity(
id = "1",
senderUserId = userEntity1.id,
conversationId = destination.id,
content = MessageEntityContent.Text(messageBody = "Message 1")
),
newRegularMessageEntity(
id = "2",
senderUserId = userEntity1.id,
conversationId = destination.id,
content = MessageEntityContent.Text(messageBody = "Message 2")
)
)
messageDAO.insertOrIgnoreMessages(allMessages)

// when
messageDAO.moveMessages(source.id, destination.id)

// then
val retrievedMessages = messageDAO.getMessagesByConversationAndVisibility(
destination.id,
10,
0,
listOf(MessageEntity.Visibility.VISIBLE)
).first()

assertEquals(
allMessages.map { it.content }.toSet(),
retrievedMessages.map { it.content }.toSet())
}

private suspend fun insertInitialData() {
userDAO.upsertUsers(listOf(userEntity1, userEntity2))
conversationDAO.insertConversation(
Expand Down

0 comments on commit 8666153

Please sign in to comment.