im-core 0.1.0

Rust IM SDK for Awiki clients built on Agent Network Protocol (ANP)
Documentation
//! Migration-only local state helpers for `awiki-cli` wrappers.

#[cfg(feature = "sqlite")]
use std::collections::BTreeMap;

#[cfg(feature = "sqlite")]
pub const SCHEMA_VERSION: i64 = crate::internal::local_state::schema::SCHEMA_VERSION;

#[cfg(feature = "sqlite")]
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct MessageRecord {
    pub msg_id: String,
    pub owner_identity_id: String,
    pub owner_did: String,
    pub thread_id: String,
    pub direction: i64,
    pub sender_did: String,
    pub receiver_did: String,
    pub group_id: String,
    pub group_did: String,
    pub content_type: String,
    pub content: String,
    pub title: String,
    pub server_seq: Option<i64>,
    pub sent_at: String,
    pub stored_at: String,
    pub is_e2ee: bool,
    pub is_read: bool,
    pub sender_name: String,
    pub metadata: String,
    pub credential_name: String,
}

#[cfg(feature = "sqlite")]
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ContactRecord {
    pub owner_identity_id: String,
    pub owner_did: String,
    pub did: String,
    pub name: String,
    pub handle: String,
    pub nick_name: String,
    pub bio: String,
    pub profile_md: String,
    pub tags: String,
    pub relationship: String,
    pub source_type: String,
    pub source_name: String,
    pub source_group_id: String,
    pub connected_at: String,
    pub recommended_reason: String,
    pub followed: Option<bool>,
    pub messaged: Option<bool>,
    pub note: String,
    pub first_seen_at: String,
    pub last_seen_at: String,
    pub metadata: String,
    pub credential_name: String,
}

#[cfg(feature = "sqlite")]
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct GroupRecord {
    pub owner_identity_id: String,
    pub owner_did: String,
    pub group_id: String,
    pub group_did: String,
    pub name: String,
    pub group_mode: String,
    pub slug: String,
    pub description: String,
    pub goal: String,
    pub rules: String,
    pub message_prompt: String,
    pub doc_url: String,
    pub group_owner_did: String,
    pub group_owner_handle: String,
    pub my_role: String,
    pub membership_status: String,
    pub join_enabled: Option<bool>,
    pub join_code: String,
    pub join_code_expires_at: String,
    pub member_count: Option<i64>,
    pub last_synced_seq: Option<i64>,
    pub last_read_seq: Option<i64>,
    pub last_message_at: String,
    pub remote_created_at: String,
    pub remote_updated_at: String,
    pub stored_at: String,
    pub metadata: String,
    pub credential_name: String,
}

#[cfg(feature = "sqlite")]
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct GroupMemberRecord {
    pub owner_identity_id: String,
    pub owner_did: String,
    pub group_id: String,
    pub user_id: String,
    pub member_did: String,
    pub member_handle: String,
    pub profile_url: String,
    pub role: String,
    pub status: String,
    pub joined_at: String,
    pub sent_message_count: Option<i64>,
    pub last_synced_at: String,
    pub metadata: String,
    pub credential_name: String,
}

#[cfg(feature = "sqlite")]
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ConversationRecord {
    pub owner_did: String,
    pub thread_id: String,
    pub message_count: i64,
    pub unread_count: i64,
    pub last_message_at: String,
    pub last_content: String,
}

#[cfg(feature = "sqlite")]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OwnerInvariantViolation {
    pub table: String,
    pub invariant: String,
    pub row_count: i64,
}

#[cfg(feature = "sqlite")]
#[doc(hidden)]
pub fn ensure_schema(connection: &rusqlite::Connection) -> crate::ImResult<()> {
    crate::internal::local_state::schema::ensure_schema(connection)
}

#[cfg(feature = "sqlite")]
#[doc(hidden)]
pub fn current_schema_version(connection: &rusqlite::Connection) -> crate::ImResult<i64> {
    crate::internal::local_state::schema::current_schema_version(connection)
}

#[cfg(feature = "sqlite")]
#[doc(hidden)]
pub fn ensure_identity_owned_schema(connection: &rusqlite::Connection) -> crate::ImResult<()> {
    crate::internal::local_state::schema::ensure_schema(connection)
}

#[cfg(feature = "sqlite")]
#[doc(hidden)]
pub fn identity_owned_owner_invariants(
    connection: &rusqlite::Connection,
) -> crate::ImResult<Vec<OwnerInvariantViolation>> {
    crate::internal::local_state::schema::identity_owned_owner_invariants(
        connection,
        crate::internal::local_state::schema::IdentityOwnedSchemaTableMode::Final,
    )
    .map(|violations| {
        violations
            .into_iter()
            .map(|violation| OwnerInvariantViolation {
                table: violation.table.to_string(),
                invariant: violation.invariant.to_string(),
                row_count: violation.row_count,
            })
            .collect()
    })
}

#[cfg(feature = "sqlite")]
#[doc(hidden)]
pub fn record_identity_did_history_transition<S: AsRef<str>>(
    connection: &mut rusqlite::Connection,
    owner_identity_id: &str,
    current_did: &str,
    previous_dids: &[S],
) -> crate::ImResult<BTreeMap<String, i64>> {
    crate::internal::local_state::schema::record_identity_did_history_transition(
        connection,
        owner_identity_id,
        current_did,
        previous_dids,
    )
}

#[cfg(feature = "sqlite")]
#[doc(hidden)]
pub fn list_email_notifications_for_test(
    sqlite_path: &std::path::Path,
    owner_identity_id: &str,
    owner_did: &str,
    limit: crate::ids::PageLimit,
) -> crate::ImResult<crate::ids::Page<crate::email::EmailNotification>> {
    crate::internal::local_state::email::list_mail_notifications(
        sqlite_path,
        owner_identity_id,
        owner_did,
        limit,
    )
}

#[cfg(feature = "sqlite")]
#[doc(hidden)]
pub fn plan_replace_did_local_state_rebind(
    sqlite_path: &std::path::Path,
    old_owner_did: &str,
    new_owner_did: &str,
) -> crate::ImResult<(BTreeMap<String, i64>, BTreeMap<String, i64>)> {
    let affected = crate::internal::identity_replace_did_plan::plan_replace_did_local_state_rebind(
        sqlite_path,
        old_owner_did,
        new_owner_did,
    )?;
    Ok((affected.store_rebind_counts, affected.e2ee_cleanup_counts))
}

#[cfg(feature = "sqlite")]
impl From<MessageRecord> for crate::internal::local_state::messages::MessageRecord {
    fn from(record: MessageRecord) -> Self {
        Self {
            msg_id: record.msg_id,
            owner_identity_id: record.owner_identity_id,
            owner_did: record.owner_did,
            conversation_id: String::new(),
            thread_id: record.thread_id,
            direction: record.direction,
            sender_did: record.sender_did,
            receiver_did: record.receiver_did,
            group_id: record.group_id,
            group_did: record.group_did,
            content_type: record.content_type,
            content: record.content,
            title: record.title,
            server_seq: record.server_seq,
            sent_at: record.sent_at,
            stored_at: record.stored_at,
            is_e2ee: record.is_e2ee,
            is_read: record.is_read,
            sender_name: record.sender_name,
            metadata: record.metadata,
            mentions_current_user: false,
            credential_name: record.credential_name,
        }
    }
}

#[cfg(feature = "sqlite")]
impl From<ContactRecord> for crate::internal::local_state::contacts::ContactRecord {
    fn from(record: ContactRecord) -> Self {
        Self {
            owner_did: record.owner_did,
            owner_identity_id: record.owner_identity_id,
            did: record.did,
            name: record.name,
            handle: record.handle,
            nick_name: record.nick_name,
            bio: record.bio,
            profile_md: record.profile_md,
            tags: record.tags,
            relationship: record.relationship,
            source_type: record.source_type,
            source_name: record.source_name,
            source_group_id: record.source_group_id,
            connected_at: record.connected_at,
            recommended_reason: record.recommended_reason,
            followed: record.followed,
            messaged: record.messaged,
            note: record.note,
            first_seen_at: record.first_seen_at,
            last_seen_at: record.last_seen_at,
            metadata: record.metadata,
            credential_name: record.credential_name,
        }
    }
}

#[cfg(feature = "sqlite")]
impl From<GroupRecord> for crate::internal::local_state::groups::GroupRecord {
    fn from(record: GroupRecord) -> Self {
        Self {
            owner_did: record.owner_did,
            owner_identity_id: record.owner_identity_id,
            group_id: record.group_id,
            group_did: record.group_did,
            name: record.name,
            group_mode: record.group_mode,
            slug: record.slug,
            description: record.description,
            goal: record.goal,
            rules: record.rules,
            message_prompt: record.message_prompt,
            doc_url: record.doc_url,
            group_owner_did: record.group_owner_did,
            group_owner_handle: record.group_owner_handle,
            my_role: record.my_role,
            membership_status: record.membership_status,
            join_enabled: record.join_enabled,
            join_code: record.join_code,
            join_code_expires_at: record.join_code_expires_at,
            member_count: record.member_count,
            last_synced_seq: record.last_synced_seq,
            last_read_seq: record.last_read_seq,
            last_message_at: record.last_message_at,
            remote_created_at: record.remote_created_at,
            remote_updated_at: record.remote_updated_at,
            stored_at: record.stored_at,
            metadata: record.metadata,
            credential_name: record.credential_name,
        }
    }
}

#[cfg(feature = "sqlite")]
impl From<GroupMemberRecord> for crate::internal::local_state::groups::GroupMemberRecord {
    fn from(record: GroupMemberRecord) -> Self {
        Self {
            owner_did: record.owner_did,
            owner_identity_id: record.owner_identity_id,
            group_id: record.group_id,
            user_id: record.user_id,
            member_did: record.member_did,
            member_handle: record.member_handle,
            profile_url: record.profile_url,
            role: record.role,
            status: record.status,
            joined_at: record.joined_at,
            sent_message_count: record.sent_message_count,
            last_synced_at: record.last_synced_at,
            metadata: record.metadata,
            credential_name: record.credential_name,
        }
    }
}