Skip to content

Commit cddd9df

Browse files
committed
refactor(aggregator): implement TryFrom<Certificate> for CertificateRecord
1 parent 0122f3e commit cddd9df

File tree

6 files changed

+68
-43
lines changed

6 files changed

+68
-43
lines changed

mithril-aggregator/src/database/query/certificate/get_certificate.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ mod tests {
8282
let expected_certificate_records: Vec<CertificateRecord> = certificates
8383
.reversed_chain()
8484
.into_iter()
85-
.filter_map(|c| (c.epoch == Epoch(1)).then_some(c.to_owned().into()))
85+
.filter_map(|c| (c.epoch == Epoch(1)).then_some(c.to_owned().try_into().unwrap()))
8686
.collect();
8787
assert_eq!(expected_certificate_records, certificate_records);
8888

@@ -92,7 +92,7 @@ mod tests {
9292
let expected_certificate_records: Vec<CertificateRecord> = certificates
9393
.reversed_chain()
9494
.into_iter()
95-
.filter_map(|c| (c.epoch == Epoch(3)).then_some(c.to_owned().into()))
95+
.filter_map(|c| (c.epoch == Epoch(3)).then_some(c.to_owned().try_into().unwrap()))
9696
.collect();
9797
assert_eq!(expected_certificate_records, certificate_records);
9898

@@ -105,8 +105,11 @@ mod tests {
105105
#[test]
106106
fn test_get_all_certificate_records() {
107107
let certificates = setup_certificate_chain(5, 2);
108-
let expected_certificate_records: Vec<CertificateRecord> =
109-
certificates.reversed_chain().into_iter().map(Into::into).collect();
108+
let expected_certificate_records: Vec<CertificateRecord> = certificates
109+
.reversed_chain()
110+
.into_iter()
111+
.map(|c| c.try_into().unwrap())
112+
.collect();
110113

111114
let connection = main_db_connection().unwrap();
112115
insert_certificate_records(&connection, certificates.certificates_chained.clone());
@@ -127,8 +130,11 @@ mod tests {
127130
phi_f: 0.65,
128131
})
129132
.build();
130-
let first_chain_genesis: CertificateRecord =
131-
first_certificates_chain.genesis_certificate().clone().into();
133+
let first_chain_genesis: CertificateRecord = first_certificates_chain
134+
.genesis_certificate()
135+
.clone()
136+
.try_into()
137+
.unwrap();
132138
let second_certificates_chain = CertificateChainBuilder::new()
133139
.with_total_certificates(2)
134140
.with_protocol_parameters(ProtocolParameters {
@@ -137,8 +143,11 @@ mod tests {
137143
phi_f: 0.65,
138144
})
139145
.build();
140-
let second_chain_genesis: CertificateRecord =
141-
second_certificates_chain.genesis_certificate().clone().into();
146+
let second_chain_genesis: CertificateRecord = second_certificates_chain
147+
.genesis_certificate()
148+
.clone()
149+
.try_into()
150+
.unwrap();
142151
assert_ne!(first_chain_genesis, second_chain_genesis);
143152

144153
let connection = main_db_connection().unwrap();

mithril-aggregator/src/database/query/certificate/insert_certificate.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ impl Query for InsertCertificateRecordQuery {
4040

4141
#[cfg(test)]
4242
mod tests {
43-
use mithril_common::test::crypto_helper::setup_certificate_chain;
43+
use mithril_common::{entities::Certificate, test::crypto_helper::setup_certificate_chain};
4444
use mithril_persistence::sqlite::ConnectionExtensions;
4545

4646
use crate::database::test_helper::main_db_connection;
@@ -54,7 +54,7 @@ mod tests {
5454
let connection = main_db_connection().unwrap();
5555

5656
for certificate in certificates.certificates_chained {
57-
let certificate_record: CertificateRecord = certificate.into();
57+
let certificate_record: CertificateRecord = certificate.try_into().unwrap();
5858
let certificate_record_saved = connection
5959
.fetch_first(InsertCertificateRecordQuery::one(
6060
certificate_record.clone(),
@@ -67,7 +67,9 @@ mod tests {
6767
#[test]
6868
fn test_insert_many_certificates_records() {
6969
let certificates = setup_certificate_chain(5, 2);
70-
let certificates_records: Vec<CertificateRecord> = certificates.into();
70+
let certificates: Vec<Certificate> = certificates.into();
71+
let certificates_records: Vec<CertificateRecord> =
72+
certificates.into_iter().map(|c| c.try_into().unwrap()).collect();
7173

7274
let connection = main_db_connection().unwrap();
7375

mithril-aggregator/src/database/query/certificate/insert_or_replace_certificate.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ impl Query for InsertOrReplaceCertificateRecordQuery {
3838
mod tests {
3939
use std::collections::HashMap;
4040

41-
use mithril_common::entities::Epoch;
41+
use mithril_common::entities::{Certificate, Epoch};
4242
use mithril_common::test::{crypto_helper::setup_certificate_chain, double::fake_data};
4343
use mithril_persistence::sqlite::ConnectionExtensions;
4444

@@ -50,7 +50,9 @@ mod tests {
5050
#[test]
5151
fn test_insert_many_certificates_records_in_empty_db() {
5252
let certificates = setup_certificate_chain(5, 2);
53-
let certificates_records: Vec<CertificateRecord> = certificates.into();
53+
let certificates: Vec<Certificate> = certificates.into();
54+
let certificates_records: Vec<CertificateRecord> =
55+
certificates.into_iter().map(|c| c.try_into().unwrap()).collect();
5456

5557
let connection = main_db_connection().unwrap();
5658

@@ -75,7 +77,7 @@ mod tests {
7577
fn test_replace_one_certificate_record() {
7678
let certificate_record = CertificateRecord {
7779
epoch: Epoch(12),
78-
..fake_data::certificate("hash").into()
80+
..fake_data::certificate("hash").try_into().unwrap()
7981
};
8082

8183
let connection = main_db_connection().unwrap();
@@ -106,26 +108,26 @@ mod tests {
106108
let tested_records: HashMap<_, CertificateRecord> = HashMap::from([
107109
(
108110
"cert1-genesis",
109-
fake_data::genesis_certificate("genesis").into(),
111+
fake_data::genesis_certificate("genesis").try_into().unwrap(),
110112
),
111-
("cert2", fake_data::certificate("cert2").into()),
113+
("cert2", fake_data::certificate("cert2").try_into().unwrap()),
112114
(
113115
"cert2-modified",
114116
CertificateRecord {
115117
epoch: Epoch(14),
116-
..fake_data::certificate("cert2").into()
118+
..fake_data::certificate("cert2").try_into().unwrap()
117119
},
118120
),
119-
("cert3", fake_data::certificate("cert3").into()),
120-
("cert4", fake_data::certificate("cert4").into()),
121+
("cert3", fake_data::certificate("cert3").try_into().unwrap()),
122+
("cert4", fake_data::certificate("cert4").try_into().unwrap()),
121123
(
122124
"cert4-modified",
123125
CertificateRecord {
124126
epoch: Epoch(32),
125-
..fake_data::certificate("cert4").into()
127+
..fake_data::certificate("cert4").try_into().unwrap()
126128
},
127129
),
128-
("cert5", fake_data::certificate("cert5").into()),
130+
("cert5", fake_data::certificate("cert5").try_into().unwrap()),
129131
]);
130132
let connection = main_db_connection().unwrap();
131133

mithril-aggregator/src/database/record/certificate.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use chrono::{DateTime, Utc};
22

3+
use mithril_common::StdError;
34
use mithril_common::entities::{
45
Certificate, CertificateMetadata, CertificateSignature, Epoch,
56
HexEncodedAggregateVerificationKey, HexEncodedKey, ProtocolMessage, ProtocolParameters,
@@ -127,24 +128,24 @@ impl CertificateRecord {
127128
}
128129
}
129130

130-
impl From<Certificate> for CertificateRecord {
131-
fn from(other: Certificate) -> Self {
131+
impl TryFrom<Certificate> for CertificateRecord {
132+
type Error = StdError;
133+
134+
fn try_from(other: Certificate) -> Result<Self, Self::Error> {
132135
let signed_entity_type = other.signed_entity_type();
133136
let (signature, parent_certificate_id) = match other.signature {
134-
CertificateSignature::GenesisSignature(signature) => {
135-
(signature.to_bytes_hex().unwrap(), None)
136-
}
137+
CertificateSignature::GenesisSignature(signature) => (signature.to_bytes_hex()?, None),
137138
CertificateSignature::MultiSignature(_, signature) => {
138-
(signature.to_json_hex().unwrap(), Some(other.previous_hash))
139+
(signature.to_json_hex()?, Some(other.previous_hash))
139140
}
140141
};
141142

142-
CertificateRecord {
143+
let certificate_record = CertificateRecord {
143144
certificate_id: other.hash,
144145
parent_certificate_id,
145146
message: other.signed_message,
146147
signature,
147-
aggregate_verification_key: other.aggregate_verification_key.to_json_hex().unwrap(),
148+
aggregate_verification_key: other.aggregate_verification_key.to_json_hex()?,
148149
epoch: other.epoch,
149150
network: other.metadata.network,
150151
signed_entity_type,
@@ -154,7 +155,9 @@ impl From<Certificate> for CertificateRecord {
154155
signers: other.metadata.signers,
155156
initiated_at: other.metadata.initiated_at,
156157
sealed_at: other.metadata.sealed_at,
157-
}
158+
};
159+
160+
Ok(certificate_record)
158161
}
159162
}
160163

@@ -393,7 +396,7 @@ mod tests {
393396
let certificates = setup_certificate_chain(20, 3);
394397
let mut certificate_records: Vec<CertificateRecord> = Vec::new();
395398
for certificate in certificates.certificates_chained.clone() {
396-
certificate_records.push(certificate.into());
399+
certificate_records.push(certificate.try_into().unwrap());
397400
}
398401
let mut certificates_new: Vec<Certificate> = Vec::new();
399402
for certificate_record in certificate_records {

mithril-aggregator/src/database/repository/certificate_repository.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ impl CertificateRepository {
8080
let record = self
8181
.connection
8282
.fetch_first(InsertCertificateRecordQuery::one(
83-
certificate.clone().into(),
83+
certificate.clone().try_into()?,
8484
))?
8585
.unwrap_or_else(|| {
8686
panic!("No entity returned by the persister, certificate = {certificate:#?}")
@@ -98,8 +98,10 @@ impl CertificateRepository {
9898
return Ok(vec![]);
9999
}
100100

101-
let records: Vec<CertificateRecord> =
102-
certificates.into_iter().map(|cert| cert.into()).collect();
101+
let records: Vec<CertificateRecord> = certificates
102+
.into_iter()
103+
.map(|cert| cert.try_into())
104+
.collect::<StdResult<_>>()?;
103105
let new_certificates =
104106
self.connection.fetch(InsertCertificateRecordQuery::many(records))?;
105107

@@ -115,8 +117,10 @@ impl CertificateRepository {
115117
return Ok(vec![]);
116118
}
117119

118-
let records: Vec<CertificateRecord> =
119-
certificates.into_iter().map(|cert| cert.into()).collect();
120+
let records: Vec<CertificateRecord> = certificates
121+
.into_iter()
122+
.map(|cert| cert.try_into())
123+
.collect::<StdResult<_>>()?;
120124
let new_certificates = self
121125
.connection
122126
.fetch(InsertOrReplaceCertificateRecordQuery::many(records))?;

mithril-aggregator/src/database/test_helper.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,14 +183,19 @@ pub fn insert_buffered_single_signatures(
183183
Ok(())
184184
}
185185

186-
pub fn insert_certificate_records<T: Into<CertificateRecord>>(
187-
connection: &ConnectionThreadSafe,
188-
records: Vec<T>,
189-
) {
186+
pub fn insert_certificate_records<T>(connection: &ConnectionThreadSafe, records: Vec<T>)
187+
where
188+
T: TryInto<CertificateRecord>,
189+
T::Error: Into<StdError>,
190+
{
191+
let records: Vec<CertificateRecord> = records
192+
.into_iter()
193+
.map(|c| c.try_into().map_err(Into::into))
194+
.collect::<StdResult<_>>()
195+
.unwrap();
196+
190197
let _ = connection
191-
.fetch_first(InsertCertificateRecordQuery::many(
192-
records.into_iter().map(Into::into).collect(),
193-
))
198+
.fetch_first(InsertCertificateRecordQuery::many(records))
194199
.unwrap();
195200
}
196201

0 commit comments

Comments
 (0)