1
1
use async_trait:: async_trait;
2
+ use chrono:: Utc ;
3
+ use uuid:: Uuid ;
2
4
3
5
use std:: sync:: Arc ;
4
6
@@ -8,7 +10,10 @@ use mithril_common::{
8
10
StdResult ,
9
11
} ;
10
12
11
- use crate :: artifact_builder:: ArtifactBuilder ;
13
+ use crate :: {
14
+ artifact_builder:: ArtifactBuilder ,
15
+ database:: provider:: { SignedEntityRecord , SignedEntityStorer } ,
16
+ } ;
12
17
13
18
use super :: MithrilStakeDistribution ;
14
19
@@ -25,25 +30,35 @@ pub trait ArtifactBuilderService: Send + Sync {
25
30
signed_entity_type : SignedEntityType ,
26
31
certificate : & Certificate ,
27
32
) -> StdResult < Arc < dyn Artifact > > ;
33
+
34
+ /// Create an save signed entity
35
+ async fn create_and_save_signed_entity (
36
+ & self ,
37
+ signed_entity_type : SignedEntityType ,
38
+ certificate : & Certificate ,
39
+ artifact : Arc < dyn Artifact > ,
40
+ ) -> StdResult < ( ) > ;
28
41
}
29
42
30
43
/// Mithril ArtifactBuilder Service
31
44
pub struct MithrilArtifactBuilderService {
45
+ signed_entity_storer : Arc < dyn SignedEntityStorer > ,
32
46
mithril_stake_distribution_artifact_builder :
33
47
Arc < dyn ArtifactBuilder < Epoch , MithrilStakeDistribution > > ,
34
48
cardano_immutable_files_full_artifact_builder : Arc < dyn ArtifactBuilder < Beacon , Snapshot > > ,
35
49
}
36
50
37
51
impl MithrilArtifactBuilderService {
38
52
/// MithrilArtifactBuilderService factory
39
- #[ allow( dead_code) ]
40
53
pub fn new (
54
+ signed_entity_storer : Arc < dyn SignedEntityStorer > ,
41
55
mithril_stake_distribution_artifact_builder : Arc <
42
56
dyn ArtifactBuilder < Epoch , MithrilStakeDistribution > ,
43
57
> ,
44
58
cardano_immutable_files_full_artifact_builder : Arc < dyn ArtifactBuilder < Beacon , Snapshot > > ,
45
59
) -> Self {
46
60
Self {
61
+ signed_entity_storer,
47
62
mithril_stake_distribution_artifact_builder,
48
63
cardano_immutable_files_full_artifact_builder,
49
64
}
@@ -52,7 +67,6 @@ impl MithrilArtifactBuilderService {
52
67
53
68
#[ async_trait]
54
69
impl ArtifactBuilderService for MithrilArtifactBuilderService {
55
- #[ allow( dead_code) ]
56
70
async fn compute_artifact (
57
71
& self ,
58
72
signed_entity_type : SignedEntityType ,
@@ -72,6 +86,27 @@ impl ArtifactBuilderService for MithrilArtifactBuilderService {
72
86
SignedEntityType :: CardanoStakeDistribution ( _) => todo ! ( ) ,
73
87
}
74
88
}
89
+
90
+ async fn create_and_save_signed_entity (
91
+ & self ,
92
+ signed_entity_type : SignedEntityType ,
93
+ certificate : & Certificate ,
94
+ artifact : Arc < dyn Artifact > ,
95
+ ) -> StdResult < ( ) > {
96
+ let signed_entity = SignedEntityRecord {
97
+ signed_entity_id : Uuid :: new_v4 ( ) . to_string ( ) ,
98
+ signed_entity_type,
99
+ certificate_id : certificate. hash . clone ( ) ,
100
+ entity : serde_json:: to_string ( & artifact) ?,
101
+ created_at : format ! ( "{:?}" , Utc :: now( ) ) ,
102
+ } ;
103
+
104
+ self . signed_entity_storer
105
+ . store_signed_entity ( & signed_entity)
106
+ . await ?;
107
+
108
+ Ok ( ( ) )
109
+ }
75
110
}
76
111
77
112
#[ cfg( test) ]
@@ -80,14 +115,19 @@ mod tests {
80
115
81
116
use super :: * ;
82
117
83
- use crate :: artifact_builder:: MockArtifactBuilder ;
118
+ use crate :: {
119
+ artifact_builder:: MockArtifactBuilder , database:: provider:: MockSignedEntityStorer ,
120
+ } ;
84
121
85
122
#[ tokio:: test]
86
123
async fn build_mithril_stake_distribution_artifact_when_given_mithril_stake_distribution_entity_type (
87
124
) {
88
125
let signers_with_stake = fake_data:: signers_with_stakes ( 5 ) ;
89
126
let mithril_stake_distribution_expected = MithrilStakeDistribution :: new ( signers_with_stake) ;
90
127
let mithril_stake_distribution_clone = mithril_stake_distribution_expected. clone ( ) ;
128
+
129
+ let mock_signed_entity_storer = MockSignedEntityStorer :: new ( ) ;
130
+
91
131
let mut mock_mithril_stake_distribution_artifact_builder =
92
132
MockArtifactBuilder :: < Epoch , MithrilStakeDistribution > :: new ( ) ;
93
133
mock_mithril_stake_distribution_artifact_builder
@@ -99,6 +139,7 @@ mod tests {
99
139
MockArtifactBuilder :: < Beacon , Snapshot > :: new ( ) ;
100
140
101
141
let artifact_builder_service = MithrilArtifactBuilderService :: new (
142
+ Arc :: new ( mock_signed_entity_storer) ,
102
143
Arc :: new ( mock_mithril_stake_distribution_artifact_builder) ,
103
144
Arc :: new ( mock_cardano_immutable_files_full_artifact_builder) ,
104
145
) ;
@@ -121,6 +162,9 @@ mod tests {
121
162
async fn build_snapshot_artifact_when_given_cardano_immutable_files_full_entity_type ( ) {
122
163
let snapshot_expected = fake_data:: snapshots ( 1 ) . first ( ) . unwrap ( ) . to_owned ( ) ;
123
164
let snapshot_expected_clone = snapshot_expected. clone ( ) ;
165
+
166
+ let mock_signed_entity_storer = MockSignedEntityStorer :: new ( ) ;
167
+
124
168
let mock_mithril_stake_distribution_artifact_builder =
125
169
MockArtifactBuilder :: < Epoch , MithrilStakeDistribution > :: new ( ) ;
126
170
@@ -132,6 +176,7 @@ mod tests {
132
176
. return_once ( move |_, _| Ok ( snapshot_expected_clone) ) ;
133
177
134
178
let artifact_builder_service = MithrilArtifactBuilderService :: new (
179
+ Arc :: new ( mock_signed_entity_storer) ,
135
180
Arc :: new ( mock_mithril_stake_distribution_artifact_builder) ,
136
181
Arc :: new ( mock_cardano_immutable_files_full_artifact_builder) ,
137
182
) ;
0 commit comments