Skip to content

Commit df2e8a0

Browse files
authored
Merge pull request #929 from input-output-hk/ensemble/925/refacto_artifact_message_adapters
rename signed entity service
2 parents fc57c6d + 15cce49 commit df2e8a0

File tree

23 files changed

+576
-497
lines changed

23 files changed

+576
-497
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.3.21"
3+
version = "0.3.22"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
//! The module used for building artifact
2-
3-
mod artifact_builder_service;
42
mod cardano_immutable_files_full;
53
mod interface;
64
mod mithril_stake_distribution;
75

8-
pub use artifact_builder_service::*;
96
pub use cardano_immutable_files_full::*;
107
pub use interface::*;
118
pub use mithril_stake_distribution::*;

mithril-aggregator/src/database/provider/signed_entity.rs

Lines changed: 41 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
use std::sync::Arc;
22

3+
use serde::{Deserialize, Serialize};
34
use sqlite::{Connection, Value};
45

56
use async_trait::async_trait;
67

78
use mithril_common::{
8-
entities::{Beacon, SignedEntityType, Snapshot},
9+
entities::{SignedEntity, SignedEntityType, SignedEntityTypeDiscriminants, Snapshot},
10+
signable_builder::Artifact,
911
sqlite::{
1012
EntityCursor, HydrationError, Projection, Provider, SourceAlias, SqLiteEntity,
1113
WhereCondition,
1214
},
13-
store::adapter::{AdapterError, StoreAdapter},
15+
store::adapter::AdapterError,
1416
StdResult,
1517
};
1618

@@ -42,6 +44,7 @@ pub struct SignedEntityRecord {
4244
impl From<Snapshot> for SignedEntityRecord {
4345
fn from(other: Snapshot) -> Self {
4446
let entity = serde_json::to_string(&other).unwrap();
47+
4548
SignedEntityRecord {
4649
signed_entity_id: other.digest,
4750
signed_entity_type: SignedEntityType::CardanoImmutableFilesFull(other.beacon),
@@ -58,6 +61,25 @@ impl From<SignedEntityRecord> for Snapshot {
5861
}
5962
}
6063

64+
impl<T> TryFrom<SignedEntityRecord> for SignedEntity<T>
65+
where
66+
for<'a> T: Artifact + Serialize + Deserialize<'a>,
67+
{
68+
type Error = serde_json::error::Error;
69+
70+
fn try_from(other: SignedEntityRecord) -> Result<SignedEntity<T>, Self::Error> {
71+
let signed_entity = SignedEntity {
72+
signed_entity_id: other.signed_entity_id,
73+
signed_entity_type: other.signed_entity_type,
74+
created_at: other.created_at,
75+
certificate_id: other.certificate_id,
76+
artifact: serde_json::from_str::<T>(&other.artifact)?,
77+
};
78+
79+
Ok(signed_entity)
80+
}
81+
}
82+
6183
impl SqLiteEntity for SignedEntityRecord {
6284
fn hydrate(row: sqlite::Row) -> Result<Self, HydrationError>
6385
where
@@ -127,17 +149,17 @@ impl<'client> SignedEntityRecordProvider<'client> {
127149

128150
fn condition_by_signed_entity_id(
129151
&self,
130-
signed_entity_id: String,
152+
signed_entity_id: &str,
131153
) -> Result<WhereCondition, StdError> {
132154
Ok(WhereCondition::new(
133155
"signed_entity_id = ?*",
134-
vec![Value::String(signed_entity_id)],
156+
vec![Value::String(signed_entity_id.to_owned())],
135157
))
136158
}
137159

138160
fn condition_by_signed_entity_type(
139161
&self,
140-
signed_entity_type: SignedEntityType,
162+
signed_entity_type: &SignedEntityTypeDiscriminants,
141163
) -> Result<WhereCondition, StdError> {
142164
let signed_entity_type_id: i64 = signed_entity_type.index() as i64;
143165

@@ -150,7 +172,7 @@ impl<'client> SignedEntityRecordProvider<'client> {
150172
/// Get SignedEntityRecords for a given signed_entity id.
151173
pub fn get_by_signed_entity_id(
152174
&self,
153-
signed_entity_id: String,
175+
signed_entity_id: &str,
154176
) -> Result<EntityCursor<SignedEntityRecord>, StdError> {
155177
let filters = self.condition_by_signed_entity_id(signed_entity_id)?;
156178
let signed_entity_record = self.find(filters)?;
@@ -161,7 +183,7 @@ impl<'client> SignedEntityRecordProvider<'client> {
161183
/// Get SignedEntityRecords for a given signed entity type.
162184
pub fn get_by_signed_entity_type(
163185
&self,
164-
signed_entity_type: SignedEntityType,
186+
signed_entity_type: &SignedEntityTypeDiscriminants,
165187
) -> Result<EntityCursor<SignedEntityRecord>, StdError> {
166188
let filters = self.condition_by_signed_entity_type(signed_entity_type)?;
167189
let signed_entity_record = self.find(filters)?;
@@ -262,13 +284,13 @@ pub trait SignedEntityStorer: Sync + Send {
262284
/// Get signed entity type
263285
async fn get_signed_entity(
264286
&self,
265-
signed_entity_id: String,
287+
signed_entity_id: &str,
266288
) -> StdResult<Option<SignedEntityRecord>>;
267289

268290
/// Get last signed entities by signed entity type
269291
async fn get_last_signed_entities_by_type(
270292
&self,
271-
signed_entity_type: &SignedEntityType,
293+
signed_entity_type_id: &SignedEntityTypeDiscriminants,
272294
total: usize,
273295
) -> StdResult<Vec<SignedEntityRecord>>;
274296
}
@@ -297,7 +319,7 @@ impl SignedEntityStorer for SignedEntityStoreAdapter {
297319

298320
async fn get_signed_entity(
299321
&self,
300-
signed_entity_id: String,
322+
signed_entity_id: &str,
301323
) -> StdResult<Option<SignedEntityRecord>> {
302324
let connection = &*self.connection.lock().await;
303325
let provider = SignedEntityRecordProvider::new(connection);
@@ -311,92 +333,20 @@ impl SignedEntityStorer for SignedEntityStoreAdapter {
311333

312334
async fn get_last_signed_entities_by_type(
313335
&self,
314-
signed_entity_type: &SignedEntityType,
336+
signed_entity_type_id: &SignedEntityTypeDiscriminants,
315337
total: usize,
316338
) -> StdResult<Vec<SignedEntityRecord>> {
317339
let connection = &*self.connection.lock().await;
318340
let provider = SignedEntityRecordProvider::new(connection);
319341
let cursor = provider
320-
.get_by_signed_entity_type(signed_entity_type.to_owned())
342+
.get_by_signed_entity_type(signed_entity_type_id)
321343
.map_err(|e| AdapterError::GeneralError(format!("{e}")))?;
322344
let signed_entities: Vec<SignedEntityRecord> = cursor.take(total).collect();
323345

324346
Ok(signed_entities)
325347
}
326348
}
327349

328-
// TODO: this StoreAdapter implementation is temporary and concerns only the snapshots for the CardanoImmutableFilesFull signed entity type
329-
#[async_trait]
330-
impl StoreAdapter for SignedEntityStoreAdapter {
331-
type Key = String;
332-
type Record = Snapshot;
333-
334-
async fn store_record(
335-
&mut self,
336-
_key: &Self::Key,
337-
record: &Self::Record,
338-
) -> Result<(), AdapterError> {
339-
let connection = &*self.connection.lock().await;
340-
let provider = InsertSignedEntityRecordProvider::new(connection);
341-
let _signed_entity_record = provider
342-
.persist(record.to_owned().into())
343-
.map_err(|e| AdapterError::GeneralError(format!("{e}")))?;
344-
345-
Ok(())
346-
}
347-
348-
async fn get_record(&self, key: &Self::Key) -> Result<Option<Self::Record>, AdapterError> {
349-
let connection = &*self.connection.lock().await;
350-
let provider = SignedEntityRecordProvider::new(connection);
351-
let mut cursor = provider
352-
.get_by_signed_entity_id(key.to_string())
353-
.map_err(|e| AdapterError::GeneralError(format!("{e}")))?;
354-
let signed_entity = cursor
355-
.next()
356-
.filter(|record| {
357-
matches!(
358-
record.signed_entity_type,
359-
SignedEntityType::CardanoImmutableFilesFull(_)
360-
)
361-
})
362-
.map(|record| record.into());
363-
364-
Ok(signed_entity)
365-
}
366-
367-
async fn record_exists(&self, key: &Self::Key) -> Result<bool, AdapterError> {
368-
Ok(self.get_record(key).await?.is_some())
369-
}
370-
371-
async fn get_last_n_records(
372-
&self,
373-
how_many: usize,
374-
) -> Result<Vec<(Self::Key, Self::Record)>, AdapterError> {
375-
Ok(self
376-
.get_iter()
377-
.await?
378-
.take(how_many)
379-
.map(|se| (se.digest.to_owned(), se))
380-
.collect())
381-
}
382-
383-
async fn remove(&mut self, _key: &Self::Key) -> Result<Option<Self::Record>, AdapterError> {
384-
unimplemented!()
385-
}
386-
387-
async fn get_iter(&self) -> Result<Box<dyn Iterator<Item = Self::Record> + '_>, AdapterError> {
388-
let connection = &*self.connection.lock().await;
389-
let provider = SignedEntityRecordProvider::new(connection);
390-
let cursor = provider
391-
.get_by_signed_entity_type(SignedEntityType::CardanoImmutableFilesFull(
392-
Beacon::default(),
393-
))
394-
.map_err(|e| AdapterError::GeneralError(format!("{e}")))?;
395-
let signed_entities: Vec<Snapshot> = cursor.map(|se| se.into()).collect();
396-
Ok(Box::new(signed_entities.into_iter()))
397-
}
398-
}
399-
400350
#[cfg(test)]
401351
mod tests {
402352
use mithril_common::{entities::Beacon, test_utils::fake_data};
@@ -509,23 +459,22 @@ mod tests {
509459
let connection = Connection::open(":memory:").unwrap();
510460
let provider = SignedEntityRecordProvider::new(&connection);
511461
let condition = provider
512-
.condition_by_signed_entity_type(SignedEntityType::dummy())
462+
.condition_by_signed_entity_type(
463+
&SignedEntityTypeDiscriminants::CardanoImmutableFilesFull,
464+
)
513465
.unwrap();
514466
let (filter, values) = condition.expand();
515467

516468
assert_eq!("signed_entity_type_id = ?1".to_string(), filter);
517-
assert_eq!(
518-
vec![Value::Integer(SignedEntityType::dummy().index() as i64)],
519-
values
520-
);
469+
assert_eq!(vec![Value::Integer(2)], values);
521470
}
522471

523472
#[test]
524473
fn get_signed_entity_record_by_signed_entity_id() {
525474
let connection = Connection::open(":memory:").unwrap();
526475
let provider = SignedEntityRecordProvider::new(&connection);
527476
let condition = provider
528-
.condition_by_signed_entity_id("signed-ent-123".to_string())
477+
.condition_by_signed_entity_id("signed-ent-123")
529478
.unwrap();
530479
let (filter, values) = condition.expand();
531480

@@ -576,15 +525,13 @@ mod tests {
576525

577526
let first_signed_entity_type = signed_entity_records.first().unwrap().to_owned();
578527
let signed_entity_records: Vec<SignedEntityRecord> = provider
579-
.get_by_signed_entity_id(first_signed_entity_type.clone().signed_entity_id)
528+
.get_by_signed_entity_id(&first_signed_entity_type.signed_entity_id)
580529
.unwrap()
581530
.collect();
582531
assert_eq!(vec![first_signed_entity_type], signed_entity_records);
583532

584533
let signed_entity_records: Vec<SignedEntityRecord> = provider
585-
.get_by_signed_entity_type(SignedEntityType::CardanoImmutableFilesFull(
586-
Beacon::default(),
587-
))
534+
.get_by_signed_entity_type(&SignedEntityTypeDiscriminants::CardanoImmutableFilesFull)
588535
.unwrap()
589536
.collect();
590537
let expected_signed_entity_records: Vec<SignedEntityRecord> = signed_entity_records
@@ -618,51 +565,4 @@ mod tests {
618565
assert_eq!(signed_entity_record, signed_entity_record_saved);
619566
}
620567
}
621-
622-
#[tokio::test]
623-
async fn test_store_adapter() {
624-
let signed_entity_records = fake_signed_entity_records(5);
625-
626-
let connection = Connection::open(":memory:").unwrap();
627-
setup_signed_entity_db(&connection, Vec::new()).unwrap();
628-
629-
let mut signed_entity_store_adapter =
630-
SignedEntityStoreAdapter::new(Arc::new(Mutex::new(connection)));
631-
632-
for signed_entity_record in &signed_entity_records {
633-
assert!(signed_entity_store_adapter
634-
.store_record(
635-
&signed_entity_record.signed_entity_id,
636-
&signed_entity_record.to_owned().into()
637-
)
638-
.await
639-
.is_ok());
640-
}
641-
642-
for signed_entity_record in &signed_entity_records {
643-
assert!(signed_entity_store_adapter
644-
.record_exists(&signed_entity_record.signed_entity_id)
645-
.await
646-
.unwrap());
647-
assert_eq!(
648-
Some(signed_entity_record.to_owned().into()),
649-
signed_entity_store_adapter
650-
.get_record(&signed_entity_record.signed_entity_id)
651-
.await
652-
.unwrap()
653-
);
654-
}
655-
656-
assert_eq!(
657-
signed_entity_records,
658-
signed_entity_store_adapter
659-
.get_last_n_records(signed_entity_records.len())
660-
.await
661-
.unwrap()
662-
.into_iter()
663-
.map(|(_k, v)| v.into())
664-
.rev()
665-
.collect::<Vec<SignedEntityRecord>>()
666-
)
667-
}
668568
}

mithril-aggregator/src/dependency.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ use std::{collections::HashMap, sync::Arc};
1717
use tokio::sync::{Mutex, RwLock};
1818

1919
use crate::event_store::EventMessage;
20+
use crate::signed_entity_service::SignedEntityService;
2021
use crate::{
21-
artifact_builder::ArtifactBuilderService,
2222
certifier_service::CertifierService,
2323
configuration::*,
2424
database::provider::{SignedEntityStorer, StakePoolStore},
@@ -116,8 +116,8 @@ pub struct DependencyManager {
116116
/// Signable Builder Service
117117
pub signable_builder_service: Arc<dyn SignableBuilderService>,
118118

119-
/// Artifact Builder Service
120-
pub artifact_builder_service: Arc<dyn ArtifactBuilderService>,
119+
/// Signed Entity Service
120+
pub signed_entity_service: Arc<dyn SignedEntityService>,
121121

122122
/// Certifier Service
123123
pub certifier_service: Arc<dyn CertifierService>,

0 commit comments

Comments
 (0)