Skip to content

Commit

Permalink
chore: add archived field to conversations table (WPB-4471) (#2056)
Browse files Browse the repository at this point in the history
* feat: add otr_archived to database and db mappers

* feat: add otr_archived to logic conversation and mapper

* feat: add missing fields from select query

* feat: add missing fields for connection conversation

* feat: add missing fields for web mappers conversation

* test: adjust tests with missing new fields

* chore: add db migration file

* chore: rename db fields to remove prefix otr

* chore: rename params to remove prefix otr

* test: rename params to remove prefix otr in tests

* chore: rename archivedRef to archivedDateTime to represente correctly its value

* chore: rename archivedRef to archivedDateTime on mappers and repos

* test: rename archivedRef to archivedDateTime on tests

* chore: change archived date time from String to Instant

* chore: adjust domain archived date to instant
  • Loading branch information
alexandreferris authored Sep 14, 2023
1 parent b2a859c commit 38df69b
Show file tree
Hide file tree
Showing 22 changed files with 256 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,9 @@ internal class ConnectionDataSource(
accessRole = emptyList(),
receiptMode = ConversationEntity.ReceiptMode.DISABLED,
messageTimer = null,
userMessageTimer = null
userMessageTimer = null,
archived = false,
archivedInstant = null
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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
)
}

Expand All @@ -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
)
}

Expand Down Expand Up @@ -371,6 +377,8 @@ internal class ConversationMapperImpl(
receiptMode = receiptModeMapper.toDaoModel(conversation.receiptMode),
messageTimer = messageTimer?.inWholeMilliseconds,
userMessageTimer = userMessageTimer?.inWholeMilliseconds,
archived = archived,
archivedInstant = archivedDateTime
)
}

Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -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
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,9 @@ class GetOrCreateOneToOneConversationUseCaseTest {
creatorId = null,
receiptMode = Conversation.ReceiptMode.DISABLED,
messageTimer = null,
userMessageTimer = null
userMessageTimer = null,
archived = false,
archivedDateTime = null
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,9 @@ class UpdateConversationAccessUseCaseTest {
creatorId = "someCreatorId",
receiptMode = Conversation.ReceiptMode.DISABLED,
messageTimer = null,
userMessageTimer = null
userMessageTimer = null,
archived = false,
archivedDateTime = null
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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(
Expand All @@ -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(
Expand Down Expand Up @@ -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(
Expand All @@ -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")
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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(
Expand All @@ -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(
Expand All @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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'
Expand Down Expand Up @@ -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 ,
Expand Down
96 changes: 96 additions & 0 deletions persistence/src/commonMain/db_user/migrations/57.sqm
Original file line number Diff line number Diff line change
@@ -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);
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,9 @@ internal class ConversationDAOImpl internal constructor(
receiptMode,
messageTimer,
userMessageTimer,
hasIncompleteMetadata
hasIncompleteMetadata,
archived,
archivedInstant
)
}
}
Expand Down
Loading

0 comments on commit 38df69b

Please sign in to comment.