hopr_db_entity/conversions/
logs.rs1use 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}