Skip to main content

force_sync/apply/
postgres.rs

1//! Postgres-side projection helpers for apply results.
2
3use force::types::SalesforceId;
4
5use crate::{model::ChangeEnvelope, store::pg::SyncLink};
6
7/// Projects the latest sync link row after a successful apply.
8#[must_use]
9pub fn project_sync_link(
10    existing: Option<&SyncLink>,
11    envelope: &ChangeEnvelope,
12    salesforce_id: Option<&SalesforceId>,
13    tombstone: bool,
14) -> SyncLink {
15    SyncLink {
16        tenant: envelope.sync_key().tenant().to_owned(),
17        object_name: envelope.sync_key().object_name().to_owned(),
18        external_id: envelope.sync_key().external_id().to_owned(),
19        salesforce_id: salesforce_id
20            .map(|id| id.as_str().to_owned())
21            .or_else(|| existing.and_then(|link| link.salesforce_id.clone())),
22        postgres_id: existing.and_then(|link| link.postgres_id.clone()),
23        last_source: Some(envelope.source().as_db_value().to_owned()),
24        last_source_cursor: envelope
25            .cursor()
26            .map(crate::model::SourceCursor::as_db_value),
27        last_payload_hash: Some(envelope.payload_hash().to_vec()),
28        tombstone,
29    }
30}