hopr_db_entity/conversions/
logs.rs

1use sea_orm::Set;
2
3use hopr_crypto_types::types::Hash;
4use hopr_primitive_types::prelude::*;
5
6use crate::errors::DbEntityError;
7use crate::{log, log_status};
8
9impl From<SerializableLog> for log::ActiveModel {
10    fn from(value: SerializableLog) -> Self {
11        log::ActiveModel {
12            address: Set(value.address.as_ref().to_vec()),
13            topics: Set(value.topics.into_iter().flatten().collect()),
14            data: Set(value.data),
15            block_number: Set(value.block_number.to_be_bytes().to_vec()),
16            transaction_hash: Set(value.tx_hash.to_vec()),
17            transaction_index: Set(value.tx_index.to_be_bytes().to_vec()),
18            block_hash: Set(value.block_hash.to_vec()),
19            log_index: Set(value.log_index.to_be_bytes().to_vec()),
20            removed: Set(value.removed),
21            ..Default::default()
22        }
23    }
24}
25
26impl TryFrom<log::Model> for SerializableLog {
27    type Error = DbEntityError;
28
29    fn try_from(value: log::Model) -> Result<Self, Self::Error> {
30        let tx_hash: [u8; 32] = value
31            .transaction_hash
32            .try_into()
33            .map_err(|_| DbEntityError::ConversionError("Invalid tx_hash".into()))?;
34        let block_hash: [u8; 32] = value
35            .block_hash
36            .try_into()
37            .map_err(|_| DbEntityError::ConversionError("Invalid block_hash".into()))?;
38        let address = Address::new(value.address.as_ref());
39
40        let mut topics: Vec<[u8; 32]> = Vec::new();
41        for chunk in value.topics.chunks_exact(32) {
42            let mut topic = [0u8; 32];
43            topic.copy_from_slice(chunk);
44            topics.push(topic);
45        }
46
47        let log = SerializableLog {
48            address,
49            topics,
50            data: value.data,
51            block_number: U256::from_be_bytes(value.block_number).as_u64(),
52            tx_hash,
53            tx_index: U256::from_be_bytes(value.transaction_index).as_u64(),
54            block_hash,
55            log_index: U256::from_be_bytes(value.log_index).as_u64(),
56            removed: value.removed,
57            ..Default::default()
58        };
59
60        Ok(log)
61    }
62}
63
64impl From<SerializableLog> for log_status::ActiveModel {
65    fn from(value: SerializableLog) -> Self {
66        let processed = value.processed.unwrap_or(false);
67        let processed_at = value.processed_at.map(|p| p.naive_utc());
68        let checksum = value
69            .checksum
70            .map(|c| Hash::from_hex(&c).expect("Invalid checksum").as_ref().to_vec());
71
72        log_status::ActiveModel {
73            block_number: Set(value.block_number.to_be_bytes().to_vec()),
74            transaction_index: Set(value.tx_index.to_be_bytes().to_vec()),
75            log_index: Set(value.log_index.to_be_bytes().to_vec()),
76            processed: Set(processed),
77            processed_at: Set(processed_at),
78            checksum: Set(checksum),
79        }
80    }
81}