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