1
1
use async_trait:: async_trait;
2
+ use chrono:: Utc ;
2
3
3
4
use std:: sync:: Arc ;
4
5
@@ -8,7 +9,10 @@ use mithril_common::{
8
9
StdResult ,
9
10
} ;
10
11
11
- use crate :: artifact_builder:: ArtifactBuilder ;
12
+ use crate :: {
13
+ artifact_builder:: ArtifactBuilder ,
14
+ database:: provider:: { SignedEntityRecord , SignedEntityStorer } ,
15
+ } ;
12
16
13
17
use super :: MithrilStakeDistribution ;
14
18
@@ -19,40 +23,39 @@ use mockall::automock;
19
23
#[ cfg_attr( test, automock) ]
20
24
#[ async_trait]
21
25
pub trait ArtifactBuilderService : Send + Sync {
22
- /// Compute artifact from signed entity type
23
- async fn compute_artifact (
26
+ /// Create artifact for a signed entity type and a certificate
27
+ async fn create_artifact (
24
28
& self ,
25
29
signed_entity_type : SignedEntityType ,
26
30
certificate : & Certificate ,
27
- ) -> StdResult < Arc < dyn Artifact > > ;
31
+ ) -> StdResult < ( ) > ;
28
32
}
29
33
30
34
/// Mithril ArtifactBuilder Service
31
35
pub struct MithrilArtifactBuilderService {
36
+ signed_entity_storer : Arc < dyn SignedEntityStorer > ,
32
37
mithril_stake_distribution_artifact_builder :
33
38
Arc < dyn ArtifactBuilder < Epoch , MithrilStakeDistribution > > ,
34
39
cardano_immutable_files_full_artifact_builder : Arc < dyn ArtifactBuilder < Beacon , Snapshot > > ,
35
40
}
36
41
37
42
impl MithrilArtifactBuilderService {
38
43
/// MithrilArtifactBuilderService factory
39
- #[ allow( dead_code) ]
40
44
pub fn new (
45
+ signed_entity_storer : Arc < dyn SignedEntityStorer > ,
41
46
mithril_stake_distribution_artifact_builder : Arc <
42
47
dyn ArtifactBuilder < Epoch , MithrilStakeDistribution > ,
43
48
> ,
44
49
cardano_immutable_files_full_artifact_builder : Arc < dyn ArtifactBuilder < Beacon , Snapshot > > ,
45
50
) -> Self {
46
51
Self {
52
+ signed_entity_storer,
47
53
mithril_stake_distribution_artifact_builder,
48
54
cardano_immutable_files_full_artifact_builder,
49
55
}
50
56
}
51
- }
52
57
53
- #[ async_trait]
54
- impl ArtifactBuilderService for MithrilArtifactBuilderService {
55
- #[ allow( dead_code) ]
58
+ /// Compute artifact from signed entity type
56
59
async fn compute_artifact (
57
60
& self ,
58
61
signed_entity_type : SignedEntityType ,
@@ -74,20 +77,51 @@ impl ArtifactBuilderService for MithrilArtifactBuilderService {
74
77
}
75
78
}
76
79
80
+ #[ async_trait]
81
+ impl ArtifactBuilderService for MithrilArtifactBuilderService {
82
+ async fn create_artifact (
83
+ & self ,
84
+ signed_entity_type : SignedEntityType ,
85
+ certificate : & Certificate ,
86
+ ) -> StdResult < ( ) > {
87
+ let artifact = self
88
+ . compute_artifact ( signed_entity_type. clone ( ) , certificate)
89
+ . await ?;
90
+ let signed_entity = SignedEntityRecord {
91
+ signed_entity_id : artifact. get_id ( ) ,
92
+ signed_entity_type,
93
+ certificate_id : certificate. hash . clone ( ) ,
94
+ artifact : serde_json:: to_string ( & artifact) ?,
95
+ created_at : format ! ( "{:?}" , Utc :: now( ) ) ,
96
+ } ;
97
+
98
+ self . signed_entity_storer
99
+ . store_signed_entity ( & signed_entity)
100
+ . await ?;
101
+
102
+ Ok ( ( ) )
103
+ }
104
+ }
105
+
77
106
#[ cfg( test) ]
78
107
mod tests {
79
108
use mithril_common:: { entities:: Epoch , test_utils:: fake_data} ;
80
109
81
110
use super :: * ;
82
111
83
- use crate :: artifact_builder:: MockArtifactBuilder ;
112
+ use crate :: {
113
+ artifact_builder:: MockArtifactBuilder , database:: provider:: MockSignedEntityStorer ,
114
+ } ;
84
115
85
116
#[ tokio:: test]
86
117
async fn build_mithril_stake_distribution_artifact_when_given_mithril_stake_distribution_entity_type (
87
118
) {
88
119
let signers_with_stake = fake_data:: signers_with_stakes ( 5 ) ;
89
120
let mithril_stake_distribution_expected = MithrilStakeDistribution :: new ( signers_with_stake) ;
90
121
let mithril_stake_distribution_clone = mithril_stake_distribution_expected. clone ( ) ;
122
+
123
+ let mock_signed_entity_storer = MockSignedEntityStorer :: new ( ) ;
124
+
91
125
let mut mock_mithril_stake_distribution_artifact_builder =
92
126
MockArtifactBuilder :: < Epoch , MithrilStakeDistribution > :: new ( ) ;
93
127
mock_mithril_stake_distribution_artifact_builder
@@ -99,6 +133,7 @@ mod tests {
99
133
MockArtifactBuilder :: < Beacon , Snapshot > :: new ( ) ;
100
134
101
135
let artifact_builder_service = MithrilArtifactBuilderService :: new (
136
+ Arc :: new ( mock_signed_entity_storer) ,
102
137
Arc :: new ( mock_mithril_stake_distribution_artifact_builder) ,
103
138
Arc :: new ( mock_cardano_immutable_files_full_artifact_builder) ,
104
139
) ;
@@ -121,6 +156,9 @@ mod tests {
121
156
async fn build_snapshot_artifact_when_given_cardano_immutable_files_full_entity_type ( ) {
122
157
let snapshot_expected = fake_data:: snapshots ( 1 ) . first ( ) . unwrap ( ) . to_owned ( ) ;
123
158
let snapshot_expected_clone = snapshot_expected. clone ( ) ;
159
+
160
+ let mock_signed_entity_storer = MockSignedEntityStorer :: new ( ) ;
161
+
124
162
let mock_mithril_stake_distribution_artifact_builder =
125
163
MockArtifactBuilder :: < Epoch , MithrilStakeDistribution > :: new ( ) ;
126
164
@@ -132,6 +170,7 @@ mod tests {
132
170
. return_once ( move |_, _| Ok ( snapshot_expected_clone) ) ;
133
171
134
172
let artifact_builder_service = MithrilArtifactBuilderService :: new (
173
+ Arc :: new ( mock_signed_entity_storer) ,
135
174
Arc :: new ( mock_mithril_stake_distribution_artifact_builder) ,
136
175
Arc :: new ( mock_cardano_immutable_files_full_artifact_builder) ,
137
176
) ;
0 commit comments