xmtp_db/encrypted_store/group_message/
convert.rs

1use super::*;
2use xmtp_configuration::Originators;
3use xmtp_proto::ConversionError;
4use xmtp_proto::xmtp::device_sync::message_backup::{
5    ContentTypeSave, DeliveryStatusSave, GroupMessageKindSave, GroupMessageSave,
6};
7
8impl TryFrom<GroupMessageSave> for StoredGroupMessage {
9    type Error = ConversionError;
10    fn try_from(value: GroupMessageSave) -> Result<Self, Self::Error> {
11        let kind = value.kind().try_into()?;
12        let delivery_status = value.delivery_status().try_into()?;
13
14        let mut content_type: ContentType = value.content_type_save().into();
15        if matches!(content_type, ContentType::Unknown) {
16            content_type = value.content_type.into();
17        }
18
19        Ok(Self {
20            id: value.id,
21            group_id: value.group_id,
22            decrypted_message_bytes: value.decrypted_message_bytes,
23            sent_at_ns: value.sent_at_ns,
24            kind,
25            sender_installation_id: value.sender_installation_id,
26            sender_inbox_id: value.sender_inbox_id,
27            delivery_status,
28            content_type,
29            version_major: value.version_major,
30            version_minor: value.version_minor,
31            authority_id: value.authority_id,
32            reference_id: value.reference_id,
33            sequence_id: value.sequence_id.unwrap_or(0),
34            originator_id: value
35                .originator_id
36                .unwrap_or(Originators::APPLICATION_MESSAGES.into()),
37            expire_at_ns: None,
38            inserted_at_ns: 0,  // Will be set by database
39            should_push: false, // Default to false for synced messages
40        })
41    }
42}
43
44impl TryFrom<GroupMessageKindSave> for GroupMessageKind {
45    type Error = ConversionError;
46    fn try_from(value: GroupMessageKindSave) -> Result<Self, Self::Error> {
47        let message_kind = match value {
48            GroupMessageKindSave::Application => Self::Application,
49            GroupMessageKindSave::MembershipChange => Self::MembershipChange,
50            GroupMessageKindSave::Unspecified => {
51                return Err(ConversionError::Unspecified("message_kind"));
52            }
53        };
54        Ok(message_kind)
55    }
56}
57
58impl TryFrom<DeliveryStatusSave> for DeliveryStatus {
59    type Error = ConversionError;
60    fn try_from(value: DeliveryStatusSave) -> Result<Self, Self::Error> {
61        let delivery_status = match value {
62            DeliveryStatusSave::Failed => Self::Failed,
63            DeliveryStatusSave::Published => Self::Published,
64            DeliveryStatusSave::Unpublished => Self::Unpublished,
65            DeliveryStatusSave::Unspecified => {
66                return Err(ConversionError::Unspecified("delivery_status"));
67            }
68        };
69        Ok(delivery_status)
70    }
71}
72
73impl From<ContentTypeSave> for ContentType {
74    fn from(value: ContentTypeSave) -> Self {
75        match value {
76            ContentTypeSave::Attachment => Self::Attachment,
77            ContentTypeSave::GroupMembershipChange => Self::GroupMembershipChange,
78            ContentTypeSave::GroupUpdated => Self::GroupUpdated,
79            ContentTypeSave::Reaction => Self::Reaction,
80            ContentTypeSave::ReadReceipt => Self::ReadReceipt,
81            ContentTypeSave::RemoteAttachment => Self::RemoteAttachment,
82            ContentTypeSave::Reply => Self::Reply,
83            ContentTypeSave::Text => Self::Text,
84            ContentTypeSave::TransactionReference => Self::TransactionReference,
85            _ => Self::Unknown,
86        }
87    }
88}
89
90impl From<StoredGroupMessage> for GroupMessageSave {
91    fn from(value: StoredGroupMessage) -> Self {
92        let kind: GroupMessageKindSave = value.kind.into();
93        let delivery_status: DeliveryStatusSave = value.delivery_status.into();
94
95        Self {
96            id: value.id,
97            group_id: value.group_id,
98            decrypted_message_bytes: value.decrypted_message_bytes,
99            sent_at_ns: value.sent_at_ns,
100            kind: kind as i32,
101            sender_installation_id: value.sender_installation_id,
102            sender_inbox_id: value.sender_inbox_id,
103            delivery_status: delivery_status as i32,
104            content_type: value.content_type.to_string(),
105            version_major: value.version_major,
106            version_minor: value.version_minor,
107            authority_id: value.authority_id,
108            reference_id: value.reference_id,
109            sequence_id: Some(value.sequence_id),
110            originator_id: Some(value.originator_id),
111
112            // Deprecated
113            #[allow(deprecated)]
114            content_type_save: 0,
115        }
116    }
117}
118impl From<GroupMessageKind> for GroupMessageKindSave {
119    fn from(value: GroupMessageKind) -> Self {
120        match value {
121            GroupMessageKind::Application => Self::Application,
122            GroupMessageKind::MembershipChange => Self::MembershipChange,
123        }
124    }
125}
126impl From<DeliveryStatus> for DeliveryStatusSave {
127    fn from(value: DeliveryStatus) -> Self {
128        match value {
129            DeliveryStatus::Failed => Self::Failed,
130            DeliveryStatus::Published => Self::Published,
131            DeliveryStatus::Unpublished => Self::Unpublished,
132        }
133    }
134}