diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/connection/ConnectionRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/connection/ConnectionRepository.kt index d5cf288bf5a..60b7f00b193 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/connection/ConnectionRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/connection/ConnectionRepository.kt @@ -256,7 +256,9 @@ internal class ConnectionDataSource( accessRole = emptyList(), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) ) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt index a55a99e9f16..dab18d3e905 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt @@ -68,7 +68,9 @@ data class Conversation( val creatorId: String?, val receiptMode: ReceiptMode, val messageTimer: Duration?, - val userMessageTimer: Duration? + val userMessageTimer: Duration?, + val archived: Boolean, + val archivedDateTime: Instant? ) { companion object { @@ -295,7 +297,9 @@ sealed class ConversationDetails(open val conversation: Conversation) { creatorId = null, receiptMode = Conversation.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) ) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt index 52de2df2ba4..170a0eea7b0 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt @@ -117,7 +117,9 @@ internal class ConversationMapperImpl( receiptMode = receiptModeMapper.fromApiToDaoModel(apiModel.receiptMode), messageTimer = apiModel.messageTimer, userMessageTimer = null, // user picked self deletion timer is only persisted locally - hasIncompleteMetadata = false + hasIncompleteMetadata = false, + archived = apiModel.members.self.otrArchived ?: false, + archivedInstant = apiModel.members.self.otrArchivedRef?.toInstant() ) override fun fromApiModelToDaoModel(apiModel: ConvProtocol): Protocol = when (apiModel) { @@ -157,7 +159,9 @@ internal class ConversationMapperImpl( creatorId = creatorId, receiptMode = receiptModeMapper.fromEntityToModel(receiptMode), messageTimer = messageTimer?.toDuration(DurationUnit.MILLISECONDS), - userMessageTimer = userMessageTimer?.toDuration(DurationUnit.MILLISECONDS) + userMessageTimer = userMessageTimer?.toDuration(DurationUnit.MILLISECONDS), + archived = archived, + archivedDateTime = archivedDateTime ) } @@ -180,7 +184,9 @@ internal class ConversationMapperImpl( creatorId = creatorId, receiptMode = receiptModeMapper.fromEntityToModel(receiptMode), messageTimer = messageTimer?.toDuration(DurationUnit.MILLISECONDS), - userMessageTimer = userMessageTimer?.toDuration(DurationUnit.MILLISECONDS) + userMessageTimer = userMessageTimer?.toDuration(DurationUnit.MILLISECONDS), + archived = archived, + archivedDateTime = archivedInstant ) } @@ -371,6 +377,8 @@ internal class ConversationMapperImpl( receiptMode = receiptModeMapper.toDaoModel(conversation.receiptMode), messageTimer = messageTimer?.inWholeMilliseconds, userMessageTimer = userMessageTimer?.inWholeMilliseconds, + archived = archived, + archivedInstant = archivedDateTime ) } @@ -396,7 +404,9 @@ internal class ConversationMapperImpl( receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, userMessageTimer = null, - hasIncompleteMetadata = true + hasIncompleteMetadata = true, + archived = false, + archivedInstant = null ) private fun ConversationResponse.getProtocolInfo(mlsGroupState: GroupState?): ProtocolInfo { diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/web/WebMappers.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/web/WebMappers.kt index 90b4bbeeb45..8466140cca9 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/web/WebMappers.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/web/WebMappers.kt @@ -143,6 +143,9 @@ fun WebConversationContent.toConversation(selfUserId: UserId): Conversation? { } else { DateTimeUtil.fromEpochMillisToIsoDateTimeString(lastReadTimestamp) } + val conversationArchivedTimestamp: Instant? = archivedTimestamp?.let { timestamp -> + Instant.fromEpochMilliseconds(timestamp) + } Conversation( id = toQualifiedId(id, domain, selfUserId), @@ -164,7 +167,9 @@ fun WebConversationContent.toConversation(selfUserId: UserId): Conversation? { creatorId = creator, receiptMode = fromScalaReceiptMode(receiptMode), messageTimer = messageTimer?.toDuration(DurationUnit.MILLISECONDS), - userMessageTimer = null + userMessageTimer = null, + archived = archivedState ?: false, + archivedDateTime = conversationArchivedTimestamp ) } } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/call/usecase/EndCallOnConversationChangeUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/call/usecase/EndCallOnConversationChangeUseCaseTest.kt index b9dd3f418be..725efa0f393 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/call/usecase/EndCallOnConversationChangeUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/call/usecase/EndCallOnConversationChangeUseCaseTest.kt @@ -148,7 +148,9 @@ class EndCallOnConversationChangeUseCaseTest { creatorId = null, receiptMode = Conversation.ReceiptMode.ENABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) val otherUser = OtherUser( diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/GetOrCreateOneToOneConversationUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/GetOrCreateOneToOneConversationUseCaseTest.kt index a130220a461..eed2538d188 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/GetOrCreateOneToOneConversationUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/GetOrCreateOneToOneConversationUseCaseTest.kt @@ -127,7 +127,9 @@ class GetOrCreateOneToOneConversationUseCaseTest { creatorId = null, receiptMode = Conversation.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) } } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationAccessUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationAccessUseCaseTest.kt index a3b1486bef8..94be1e52aad 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationAccessUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationAccessUseCaseTest.kt @@ -406,7 +406,9 @@ class UpdateConversationAccessUseCaseTest { creatorId = "someCreatorId", receiptMode = Conversation.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/framework/TestConversation.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/framework/TestConversation.kt index b170f855be1..b4911825857 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/framework/TestConversation.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/framework/TestConversation.kt @@ -73,7 +73,9 @@ object TestConversation { creatorId = null, receiptMode = Conversation.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) fun SELF(protocolInfo: ProtocolInfo = ProtocolInfo.Proteus) = Conversation( @@ -92,7 +94,9 @@ object TestConversation { creatorId = null, receiptMode = Conversation.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) fun GROUP(protocolInfo: ProtocolInfo = ProtocolInfo.Proteus) = Conversation( @@ -111,7 +115,9 @@ object TestConversation { creatorId = null, receiptMode = Conversation.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) fun GROUP_VIEW_ENTITY(protocolInfo: ConversationEntity.ProtocolInfo = ConversationEntity.ProtocolInfo.Proteus) = ConversationViewEntity( @@ -151,7 +157,9 @@ object TestConversation { receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, userMessageTimer = null, - userDefederated = null + userDefederated = null, + archived = false, + archivedDateTime = null ) fun one_on_one(convId: ConversationId) = Conversation( @@ -170,7 +178,9 @@ object TestConversation { creatorId = null, receiptMode = Conversation.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) val NETWORK_ID = QualifiedID("valueConversation", "domainConversation") @@ -258,7 +268,9 @@ object TestConversation { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) val VIEW_ENTITY = ConversationViewEntity( id = ENTITY_ID, @@ -295,7 +307,9 @@ object TestConversation { receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, userMessageTimer = null, - userDefederated = null + userDefederated = null, + archived = false, + archivedDateTime = null ) val CONVERSATION = Conversation( @@ -314,7 +328,9 @@ object TestConversation { creatorId = null, receiptMode = Conversation.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) val MLS_CONVERSATION = Conversation( @@ -339,7 +355,9 @@ object TestConversation { creatorId = null, receiptMode = Conversation.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedDateTime = null ) val CONVERSATION_CODE_INFO: ConversationCodeInfo = ConversationCodeInfo("conv_id_value", "name") diff --git a/persistence/src/commonMain/db_user/com/wire/kalium/persistence/Conversations.sq b/persistence/src/commonMain/db_user/com/wire/kalium/persistence/Conversations.sq index 798217cff1d..254eb51602a 100644 --- a/persistence/src/commonMain/db_user/com/wire/kalium/persistence/Conversations.sq +++ b/persistence/src/commonMain/db_user/com/wire/kalium/persistence/Conversations.sq @@ -37,7 +37,9 @@ CREATE TABLE Conversation ( user_message_timer INTEGER DEFAULT(NULL), incomplete_metadata INTEGER AS Boolean NOT NULL DEFAULT 0, mls_degraded_notified INTEGER AS Boolean NOT NULL DEFAULT 0, - is_guest_password_protected INTEGER AS Boolean DEFAULT 0 NOT NULL + is_guest_password_protected INTEGER AS Boolean DEFAULT 0 NOT NULL, + archived INTEGER AS Boolean NOT NULL DEFAULT 0, + archived_date_time INTEGER AS Instant ); -- Optimise comparisons and sorting by dates: @@ -53,8 +55,8 @@ deleteConversation: DELETE FROM Conversation WHERE qualified_id = ?; insertConversation: -INSERT INTO Conversation(qualified_id, name, type, team_id, mls_group_id, mls_group_state, mls_epoch, protocol, muted_status, muted_time, creator_id, last_modified_date, last_notified_date, access_list, access_role_list, last_read_date, mls_last_keying_material_update_date, mls_cipher_suite, receipt_mode, message_timer, user_message_timer, incomplete_metadata) -VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +INSERT INTO Conversation(qualified_id, name, type, team_id, mls_group_id, mls_group_state, mls_epoch, protocol, muted_status, muted_time, creator_id, last_modified_date, last_notified_date, access_list, access_role_list, last_read_date, mls_last_keying_material_update_date, mls_cipher_suite, receipt_mode, message_timer, user_message_timer, incomplete_metadata, archived, archived_date_time) +VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(qualified_id) DO UPDATE SET name = excluded.name, type = excluded.type, @@ -75,7 +77,9 @@ mls_cipher_suite = excluded.mls_cipher_suite, receipt_mode = excluded.receipt_mode, message_timer = excluded.message_timer, user_message_timer = excluded.user_message_timer, -incomplete_metadata = excluded.incomplete_metadata; +incomplete_metadata = excluded.incomplete_metadata, +archived = excluded.archived, +archived_date_time = excluded.archived_date_time; updateConversation: UPDATE Conversation @@ -208,7 +212,9 @@ Conversation.last_modified_date, Conversation.receipt_mode, Conversation.message_timer, Conversation.user_message_timer, -Conversation.incomplete_metadata +Conversation.incomplete_metadata, +Conversation.archived, +Conversation.archived_date_time FROM Conversation LEFT JOIN Member ON Conversation.qualified_id = Member.conversation AND Conversation.type IS 'ONE_ON_ONE' @@ -243,7 +249,7 @@ selectByQualifiedId: SELECT * FROM ConversationDetails WHERE qualifiedId = ?; selectConversationByQualifiedId: -SELECT qualified_id, name, type, team_id, mls_group_id, mls_group_state, mls_epoch, mls_proposal_timer, protocol, muted_status, muted_time, creator_id, last_modified_date, last_notified_date, last_read_date, access_list, access_role_list, mls_last_keying_material_update_date, mls_cipher_suite, receipt_mode, message_timer, user_message_timer FROM Conversation WHERE qualified_id = ?; +SELECT qualified_id, name, type, team_id, mls_group_id, mls_group_state, mls_epoch, mls_proposal_timer, protocol, muted_status, muted_time, creator_id, last_modified_date, last_notified_date, last_read_date, access_list, access_role_list, mls_last_keying_material_update_date, mls_cipher_suite, receipt_mode, message_timer, user_message_timer, archived, archived_date_time FROM Conversation WHERE qualified_id = ?; selectProtocolInfoByQualifiedId: SELECT protocol, mls_group_id, mls_group_state, mls_epoch , diff --git a/persistence/src/commonMain/db_user/migrations/57.sqm b/persistence/src/commonMain/db_user/migrations/57.sqm new file mode 100644 index 00000000000..37dbfbbb0ab --- /dev/null +++ b/persistence/src/commonMain/db_user/migrations/57.sqm @@ -0,0 +1,96 @@ +ALTER TABLE Conversation ADD COLUMN archived INTEGER AS Boolean NOT NULL DEFAULT 0; +ALTER TABLE Conversation ADD COLUMN archived_date_time INTEGER AS Instant; + +DROP VIEW IF EXISTS ConversationDetails; + +CREATE VIEW IF NOT EXISTS ConversationDetails AS +SELECT +Conversation.qualified_id AS qualifiedId, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.name + WHEN 'CONNECTION_PENDING' THEN connection_user.name + ELSE Conversation.name +END AS name, +Conversation.type, +Call.status AS callStatus, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.preview_asset_id + WHEN 'CONNECTION_PENDING' THEN connection_user.preview_asset_id +END AS previewAssetId, +Conversation.muted_status AS mutedStatus, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.team + ELSE Conversation.team_id +END AS teamId, +CASE (Conversation.type) + WHEN 'CONNECTION_PENDING' THEN Connection.last_update_date + ELSE Conversation.last_modified_date +END AS lastModifiedDate, +Conversation.last_read_date AS lastReadDate, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.user_availability_status + WHEN 'CONNECTION_PENDING' THEN connection_user.user_availability_status +END AS userAvailabilityStatus, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.user_type + WHEN 'CONNECTION_PENDING' THEN connection_user.user_type +END AS userType, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.bot_service + WHEN 'CONNECTION_PENDING' THEN connection_user.bot_service +END AS botService, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.deleted + WHEN 'CONNECTION_PENDING' THEN connection_user.deleted +END AS userDeleted, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.defederated + WHEN 'CONNECTION_PENDING' THEN connection_user.defederated +END AS userDefederated, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.connection_status + WHEN 'CONNECTION_PENDING' THEN connection_user.connection_status +END AS connectionStatus, +CASE (Conversation.type) + WHEN 'ONE_ON_ONE' THEN User.qualified_id + WHEN 'CONNECTION_PENDING' THEN connection_user.qualified_id +END AS otherUserId, +CASE + WHEN ((SELECT id FROM SelfUser LIMIT 1) LIKE (Conversation.creator_id || '@%')) THEN 1 + ELSE 0 +END AS isCreator, +Conversation.last_notified_date AS lastNotifiedMessageDate, +memberRole. role AS selfRole, +Conversation.protocol, +Conversation.mls_cipher_suite, +Conversation.mls_epoch, +Conversation.mls_group_id, +Conversation.mls_last_keying_material_update_date, +Conversation.mls_group_state, +Conversation.access_list, +Conversation.access_role_list, +Conversation.team_id, +Conversation.mls_proposal_timer, +Conversation.muted_time, +Conversation.creator_id, +Conversation.last_modified_date, +Conversation.receipt_mode, +Conversation.message_timer, +Conversation.user_message_timer, +Conversation.incomplete_metadata, +Conversation.archived, +Conversation.archived_date_time +FROM Conversation +LEFT JOIN Member ON Conversation.qualified_id = Member.conversation + AND Conversation.type IS 'ONE_ON_ONE' + AND Member.user IS NOT (SELECT SelfUser.id FROM SelfUser LIMIT 1) +LEFT JOIN Member AS memberRole ON Conversation.qualified_id = memberRole.conversation + AND memberRole.user IS (SELECT SelfUser.id FROM SelfUser LIMIT 1) +LEFT JOIN User ON User.qualified_id = Member.user +LEFT JOIN Connection ON Connection.qualified_conversation = Conversation.qualified_id + AND (Connection.status = 'SENT' + OR Connection.status = 'PENDING' + OR Connection.status = 'NOT_CONNECTED' + AND Conversation.type IS 'CONNECTION_PENDING') +LEFT JOIN User AS connection_user ON Connection.qualified_to = connection_user.qualified_id +LEFT JOIN Call ON Call.id IS (SELECT id FROM Call WHERE Call.conversation_id = Conversation.qualified_id AND Call.status IS 'STILL_ONGOING' ORDER BY created_at DESC LIMIT 1); diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationDAOImpl.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationDAOImpl.kt index 920b2e837ac..9eec80b2018 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationDAOImpl.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationDAOImpl.kt @@ -98,7 +98,9 @@ internal class ConversationDAOImpl internal constructor( receiptMode, messageTimer, userMessageTimer, - hasIncompleteMetadata + hasIncompleteMetadata, + archived, + archivedInstant ) } } diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationEntity.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationEntity.kt index 005c54aa291..caa03d4037a 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationEntity.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationEntity.kt @@ -41,7 +41,9 @@ data class ConversationEntity( val guestRoomLink: String? = null, val messageTimer: Long?, val userMessageTimer: Long?, - val hasIncompleteMetadata: Boolean = false + val hasIncompleteMetadata: Boolean = false, + val archived: Boolean = false, + val archivedInstant: Instant? ) { enum class AccessRole { TEAM_MEMBER, NON_TEAM_MEMBER, GUEST, SERVICE, EXTERNAL; } diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationMapper.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationMapper.kt index f64596254f3..f65f3f539bd 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationMapper.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationMapper.kt @@ -64,7 +64,9 @@ internal class ConversationMapper { receiptMode = receipt_mode, messageTimer = message_timer, userMessageTimer = user_message_timer, - userDefederated = userDefederated + userDefederated = userDefederated, + archived = archived, + archivedDateTime = archived_date_time ) } @@ -92,6 +94,8 @@ internal class ConversationMapper { receiptMode: ConversationEntity.ReceiptMode, messageTimer: Long?, userMessageTimer: Long?, + archived: Boolean, + archivedDateTime: Instant? ) = ConversationEntity( id = qualifiedId, name = name, @@ -116,6 +120,8 @@ internal class ConversationMapper { receiptMode = receiptMode, messageTimer = messageTimer, userMessageTimer = userMessageTimer, + archived = archived, + archivedInstant = archivedDateTime ) fun fromOneToOneToModel(conversation: SelectConversationByMember?): ConversationViewEntity? { @@ -161,7 +167,9 @@ internal class ConversationMapper { receiptMode = receipt_mode, messageTimer = message_timer, userMessageTimer = user_message_timer, - userDefederated = userDefederated + userDefederated = userDefederated, + archived = archived, + archivedDateTime = archived_date_time ) } } diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationViewEntity.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationViewEntity.kt index 45fac851bbc..1a955d4d5f0 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationViewEntity.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/conversation/ConversationViewEntity.kt @@ -63,7 +63,9 @@ data class ConversationViewEntity( val removedBy: UserIDEntity? = null, // TODO how to calculate?, val receiptMode: ConversationEntity.ReceiptMode, val messageTimer: Long?, - val userMessageTimer: Long? + val userMessageTimer: Long?, + val archived: Boolean, + val archivedDateTime: Instant? ) { val isMember: Boolean get() = selfRole != null diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/TableMapper.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/TableMapper.kt index bed3ddeb3a9..0f4215ae42a 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/TableMapper.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/TableMapper.kt @@ -95,6 +95,7 @@ internal object TableMapper { last_modified_dateAdapter = InstantTypeAdapter, last_notified_dateAdapter = InstantTypeAdapter, mls_last_keying_material_update_dateAdapter = InstantTypeAdapter, + archived_date_timeAdapter = InstantTypeAdapter ) val memberAdapter = Member.Adapter( userAdapter = QualifiedIDAdapter, diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/DatabaseImporterTest.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/DatabaseImporterTest.kt index 348bec8eb5a..a4c5acceaa5 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/DatabaseImporterTest.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/DatabaseImporterTest.kt @@ -651,7 +651,9 @@ class DatabaseImporterTest : BaseDatabaseTest() { accessRole = accessRoleList, receiptMode = receiptMode, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) } } @@ -687,7 +689,9 @@ class DatabaseImporterTest : BaseDatabaseTest() { accessRole = listOf(ConversationEntity.AccessRole.values()[index % ConversationEntity.AccessRole.values().size]), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) conversationAdded.add(overlappingConversation) diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/UserDatabaseDataGenerator.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/UserDatabaseDataGenerator.kt index 806a9efd55e..312bd241ea3 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/UserDatabaseDataGenerator.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/UserDatabaseDataGenerator.kt @@ -277,7 +277,9 @@ class UserDatabaseDataGenerator( accessRole = listOf(ConversationEntity.AccessRole.values()[index % ConversationEntity.AccessRole.values().size]), receiptMode = DEFAULT_RECEIPT_MODE, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) ) @@ -319,7 +321,9 @@ class UserDatabaseDataGenerator( accessRole = listOf(ConversationEntity.AccessRole.values()[index % ConversationEntity.AccessRole.values().size]), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) userDatabaseBuilder.conversationDAO.insertConversation(conversation) return conversation @@ -385,7 +389,9 @@ class UserDatabaseDataGenerator( accessRole = listOf(ConversationEntity.AccessRole.values()[index % ConversationEntity.AccessRole.values().size]), receiptMode = DEFAULT_RECEIPT_MODE, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) userDatabaseBuilder.conversationDAO.insertConversation(conversationEntity) @@ -450,7 +456,9 @@ class UserDatabaseDataGenerator( accessRole = listOf(ConversationEntity.AccessRole.values()[index % ConversationEntity.AccessRole.values().size]), receiptMode = DEFAULT_RECEIPT_MODE, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) ) @@ -493,7 +501,9 @@ class UserDatabaseDataGenerator( accessRole = listOf(ConversationEntity.AccessRole.values()[index % ConversationEntity.AccessRole.values().size]), receiptMode = DEFAULT_RECEIPT_MODE, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) ) @@ -605,7 +615,9 @@ class UserDatabaseDataGenerator( accessRole = listOf(ConversationEntity.AccessRole.values()[index % ConversationEntity.AccessRole.values().size]), receiptMode = DEFAULT_RECEIPT_MODE, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) ) diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/ConversationDAOTest.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/ConversationDAOTest.kt index 4a8d1887773..7971adfc2c3 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/ConversationDAOTest.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/ConversationDAOTest.kt @@ -24,7 +24,6 @@ import com.wire.kalium.persistence.dao.asset.AssetDAO import com.wire.kalium.persistence.dao.asset.AssetEntity import com.wire.kalium.persistence.dao.conversation.ConversationDAO import com.wire.kalium.persistence.dao.conversation.ConversationEntity -import com.wire.kalium.persistence.dao.conversation.ConversationGuestLinkEntity import com.wire.kalium.persistence.dao.conversation.ConversationViewEntity import com.wire.kalium.persistence.dao.conversation.MLS_DEFAULT_LAST_KEY_MATERIAL_UPDATE_MILLI import com.wire.kalium.persistence.dao.conversation.ProposalTimerEntity @@ -983,7 +982,9 @@ class ConversationDAOTest : BaseDatabaseTest() { receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = messageTimer, userMessageTimer = null, - userDefederated = if (type == ConversationEntity.Type.ONE_ON_ONE) userEntity?.defederated else null + userDefederated = if (type == ConversationEntity.Type.ONE_ON_ONE) userEntity?.defederated else null, + archived = false, + archivedDateTime = null ) } @@ -1012,7 +1013,9 @@ class ConversationDAOTest : BaseDatabaseTest() { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = messageTimer, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) val conversationEntity2 = ConversationEntity( QualifiedIDEntity("2", "wire.com"), @@ -1035,7 +1038,9 @@ class ConversationDAOTest : BaseDatabaseTest() { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = messageTimer, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) val conversationEntity3 = ConversationEntity( @@ -1061,7 +1066,9 @@ class ConversationDAOTest : BaseDatabaseTest() { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = messageTimer, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) val conversationEntity4 = ConversationEntity( @@ -1087,7 +1094,9 @@ class ConversationDAOTest : BaseDatabaseTest() { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = messageTimer, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) val member1 = MemberEntity(user1.id, MemberEntity.Role.Admin) diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/ConversationMetaDataDAOTest.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/ConversationMetaDataDAOTest.kt index cb47de6019f..972715d73c0 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/ConversationMetaDataDAOTest.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/ConversationMetaDataDAOTest.kt @@ -21,7 +21,6 @@ import com.wire.kalium.persistence.BaseDatabaseTest import com.wire.kalium.persistence.dao.conversation.ConversationDAO import com.wire.kalium.persistence.dao.conversation.ConversationEntity import com.wire.kalium.persistence.dao.conversation.ConversationMetaDataDAO -import com.wire.kalium.persistence.db.UserDatabaseBuilder import kotlinx.coroutines.test.runTest import kotlinx.datetime.toInstant import kotlin.test.BeforeTest @@ -83,7 +82,9 @@ class ConversationMetaDataDAOTest : BaseDatabaseTest() { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = 5000L, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) } } diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/client/ClientDAOTest.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/client/ClientDAOTest.kt index 2790225ed73..8e78dafa82f 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/client/ClientDAOTest.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/client/ClientDAOTest.kt @@ -366,7 +366,9 @@ class ClientDAOTest : BaseDatabaseTest() { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) } } diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/ConversationStubs.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/ConversationStubs.kt index 33e2753c23f..26ee100a4f8 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/ConversationStubs.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/ConversationStubs.kt @@ -37,7 +37,9 @@ fun newConversationEntity(id: String = "test") = ConversationEntity( accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) fun newConversationEntity( @@ -58,5 +60,7 @@ fun newConversationEntity( accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = null, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/TestStubs.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/TestStubs.kt index e441be0f970..fe7fe090e3a 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/TestStubs.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/TestStubs.kt @@ -50,7 +50,9 @@ internal object TestStubs { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = messageTimer, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) val conversationEntity2 = ConversationEntity( QualifiedIDEntity("2", "wire.com"), @@ -73,7 +75,9 @@ internal object TestStubs { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = messageTimer, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) val conversationEntity3 = ConversationEntity( @@ -99,7 +103,9 @@ internal object TestStubs { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = messageTimer, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) val conversationEntity4 = ConversationEntity( @@ -125,7 +131,9 @@ internal object TestStubs { accessRole = listOf(ConversationEntity.AccessRole.NON_TEAM_MEMBER, ConversationEntity.AccessRole.TEAM_MEMBER), receiptMode = ConversationEntity.ReceiptMode.DISABLED, messageTimer = messageTimer, - userMessageTimer = null + userMessageTimer = null, + archived = false, + archivedInstant = null ) val member1 = MemberEntity(user1.id, MemberEntity.Role.Admin)