use std::collections::HashMap;
use chrono::NaiveDateTime;
use serde::{Deserialize, Serialize};
use crate::tables::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SyncChunk {
pub from_storage_identity_key: String,
pub to_storage_identity_key: String,
pub user_identity_key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<User>,
#[serde(skip_serializing_if = "Option::is_none")]
pub proven_txs: Option<Vec<ProvenTx>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_baskets: Option<Vec<OutputBasket>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transactions: Option<Vec<Transaction>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub outputs: Option<Vec<Output>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tx_labels: Option<Vec<TxLabel>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tx_label_maps: Option<Vec<TxLabelMap>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_tags: Option<Vec<OutputTag>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_tag_maps: Option<Vec<OutputTagMap>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub certificates: Option<Vec<Certificate>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub certificate_fields: Option<Vec<CertificateField>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub commissions: Option<Vec<Commission>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub proven_tx_reqs: Option<Vec<ProvenTxReq>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EntitySyncMap {
pub entity_name: String,
pub id_map: HashMap<i64, i64>,
#[serde(default, with = "crate::serde_datetime::option")]
pub max_updated_at: Option<NaiveDateTime>,
pub count: i64,
}
impl EntitySyncMap {
pub fn new(entity_name: &str) -> Self {
Self {
entity_name: entity_name.to_string(),
id_map: HashMap::new(),
max_updated_at: None,
count: 0,
}
}
pub fn update_max(&mut self, updated_at: NaiveDateTime) {
match self.max_updated_at {
Some(current) if current >= updated_at => {}
_ => {
self.max_updated_at = Some(updated_at);
}
}
}
pub fn map_id(&mut self, foreign_id: i64, local_id: i64) -> Result<(), String> {
if let Some(existing) = self.id_map.get(&foreign_id) {
if *existing != local_id {
return Err(format!(
"EntitySyncMap[{}]: cannot override mapping {}=>{} with {}",
self.entity_name, foreign_id, existing, local_id
));
}
}
self.id_map.insert(foreign_id, local_id);
Ok(())
}
pub fn get_local_id(&self, foreign_id: i64) -> Option<i64> {
self.id_map.get(&foreign_id).copied()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SyncMap {
pub proven_tx: EntitySyncMap,
pub output_basket: EntitySyncMap,
pub transaction: EntitySyncMap,
pub output: EntitySyncMap,
pub tx_label: EntitySyncMap,
pub tx_label_map: EntitySyncMap,
pub output_tag: EntitySyncMap,
pub output_tag_map: EntitySyncMap,
pub certificate: EntitySyncMap,
pub certificate_field: EntitySyncMap,
pub commission: EntitySyncMap,
pub proven_tx_req: EntitySyncMap,
}
impl SyncMap {
pub fn new() -> Self {
Self {
proven_tx: EntitySyncMap::new("provenTx"),
output_basket: EntitySyncMap::new("outputBasket"),
transaction: EntitySyncMap::new("transaction"),
output: EntitySyncMap::new("output"),
tx_label: EntitySyncMap::new("txLabel"),
tx_label_map: EntitySyncMap::new("txLabelMap"),
output_tag: EntitySyncMap::new("outputTag"),
output_tag_map: EntitySyncMap::new("outputTagMap"),
certificate: EntitySyncMap::new("certificate"),
certificate_field: EntitySyncMap::new("certificateField"),
commission: EntitySyncMap::new("commission"),
proven_tx_req: EntitySyncMap::new("provenTxReq"),
}
}
}
impl Default for SyncMap {
fn default() -> Self {
Self::new()
}
}