Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions bindings_ffi/src/mls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1091,12 +1091,14 @@ impl From<FfiArchiveOptions> for BackupOptions {
pub enum FfiBackupElementSelection {
Messages,
Consent,
Contacts,
}
impl From<FfiBackupElementSelection> for BackupElementSelection {
fn from(value: FfiBackupElementSelection) -> Self {
match value {
FfiBackupElementSelection::Consent => Self::Consent,
FfiBackupElementSelection::Messages => Self::Messages,
FfiBackupElementSelection::Contacts => Self::Contacts,
}
}
}
Expand All @@ -1107,6 +1109,7 @@ impl TryFrom<BackupElementSelection> for FfiBackupElementSelection {
let v = match value {
BackupElementSelection::Consent => Self::Consent,
BackupElementSelection::Messages => Self::Messages,
BackupElementSelection::Contacts => Self::Contacts,
_ => {
return Err(DeserializationError::Unspecified(
"Backup Element Selection",
Expand Down
26 changes: 26 additions & 0 deletions xmtp_archive/src/export_stream/contact_save.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use super::*;
use xmtp_proto::xmtp::device_sync::{backup_element::Element, contact_backup::ContactSave};

#[xmtp_common::async_trait]
impl BackupRecordProvider for ContactSave {
const BATCH_SIZE: i64 = 100;
async fn backup_records<D>(
state: Arc<BackupProviderState<D>>,
) -> Result<Vec<BackupElement>, StorageError>
where
Self: Sized,
D: DbQuery,
{
let cursor = state.cursor.load(Ordering::SeqCst);
let batch = state.db.contacts_paged(Self::BATCH_SIZE, cursor)?;

let records = batch
.into_iter()
.map(|record| BackupElement {
element: Some(Element::Contact(record.into())),
})
.collect();

Ok(records)
}
}
9 changes: 8 additions & 1 deletion xmtp_archive/src/export_stream/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ use xmtp_common::{MaybeSend, MaybeSendFuture, if_native, if_wasm};
use xmtp_db::{StorageError, prelude::*};
use xmtp_proto::xmtp::device_sync::{
BackupElement, BackupElementSelection, BackupOptions, consent_backup::ConsentSave,
group_backup::GroupSave, message_backup::GroupMessageSave,
contact_backup::ContactSave, group_backup::GroupSave, message_backup::GroupMessageSave,
};

pub(crate) mod consent_save;
pub(crate) mod contact_save;
pub(crate) mod group_save;
pub(crate) mod message_save;

Expand Down Expand Up @@ -58,6 +59,12 @@ impl BatchExportStream {
),
],
BackupElementSelection::Event => vec![],
BackupElementSelection::Contacts => {
vec![BackupRecordStreamer::<ContactSave, D>::new_stream(
db.clone(),
opts.clone(),
)]
}
BackupElementSelection::Unspecified => vec![],
})
.rev()
Expand Down
39 changes: 39 additions & 0 deletions xmtp_db/migrations/2025-12-28-000000_create_contacts/down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
-- Drop FTS triggers first
DROP TRIGGER IF EXISTS contact_addresses_fts_delete;
DROP TRIGGER IF EXISTS contact_addresses_fts_update;
DROP TRIGGER IF EXISTS contact_addresses_fts_insert;
DROP TRIGGER IF EXISTS contact_aliases_fts_delete;
DROP TRIGGER IF EXISTS contact_aliases_fts_update;
DROP TRIGGER IF EXISTS contact_aliases_fts_insert;
DROP TRIGGER IF EXISTS contact_wallet_addresses_fts_delete;
DROP TRIGGER IF EXISTS contact_wallet_addresses_fts_update;
DROP TRIGGER IF EXISTS contact_wallet_addresses_fts_insert;
DROP TRIGGER IF EXISTS contact_urls_fts_delete;
DROP TRIGGER IF EXISTS contact_urls_fts_update;
DROP TRIGGER IF EXISTS contact_urls_fts_insert;
DROP TRIGGER IF EXISTS contact_emails_fts_delete;
DROP TRIGGER IF EXISTS contact_emails_fts_update;
DROP TRIGGER IF EXISTS contact_emails_fts_insert;
DROP TRIGGER IF EXISTS contact_phone_numbers_fts_delete;
DROP TRIGGER IF EXISTS contact_phone_numbers_fts_update;
DROP TRIGGER IF EXISTS contact_phone_numbers_fts_insert;
DROP TRIGGER IF EXISTS contacts_fts_delete;
DROP TRIGGER IF EXISTS contacts_fts_update;
DROP TRIGGER IF EXISTS contacts_fts_insert;

-- Drop FTS table
DROP TABLE IF EXISTS contacts_fts;

-- Drop view
DROP VIEW IF EXISTS contact_list;

-- Drop companion tables (due to foreign key constraints)
DROP TABLE IF EXISTS contact_addresses;
DROP TABLE IF EXISTS contact_aliases;
DROP TABLE IF EXISTS contact_wallet_addresses;
DROP TABLE IF EXISTS contact_urls;
DROP TABLE IF EXISTS contact_emails;
DROP TABLE IF EXISTS contact_phone_numbers;

-- Drop main contacts table
DROP TABLE IF EXISTS contacts;
Loading
Loading