1use async_trait::async_trait;
2use chrono::Utc;
3use std::sync::Arc;
4
5use mithril_common::StdResult;
6use mithril_common::entities::{Epoch, ProtocolMessage, SignedEntityType};
7use mithril_persistence::sqlite::{ConnectionExtensions, SqliteConnection};
8
9use crate::database::query::{
10 DeleteOpenMessageQuery, GetOpenMessageQuery, GetOpenMessageWithSingleSignaturesQuery,
11 InsertOpenMessageQuery, InsertOrReplaceOpenMessageQuery, UpdateOpenMessageQuery,
12};
13use crate::database::record::{OpenMessageRecord, OpenMessageWithSingleSignaturesRecord};
14use crate::entities::OpenMessage;
15use crate::services::OpenMessageStorer;
16
17pub struct OpenMessageRepository {
22 connection: Arc<SqliteConnection>,
23}
24
25impl OpenMessageRepository {
26 pub fn new(connection: Arc<SqliteConnection>) -> Self {
28 Self { connection }
29 }
30
31 pub async fn get_open_message(
33 &self,
34 signed_entity_type: &SignedEntityType,
35 ) -> StdResult<Option<OpenMessageRecord>> {
36 self.connection
37 .fetch_first(GetOpenMessageQuery::by_epoch_and_signed_entity_type(
38 signed_entity_type.get_epoch(),
39 signed_entity_type,
40 )?)
41 }
42
43 pub async fn get_open_message_with_single_signatures(
45 &self,
46 signed_entity_type: &SignedEntityType,
47 ) -> StdResult<Option<OpenMessageWithSingleSignaturesRecord>> {
48 self.connection.fetch_first(
49 GetOpenMessageWithSingleSignaturesQuery::by_epoch_and_signed_entity_type(
50 signed_entity_type.get_epoch_when_signed_entity_type_is_signed(),
51 signed_entity_type,
52 )?,
53 )
54 }
55
56 pub async fn get_expired_open_message(
58 &self,
59 signed_entity_type: &SignedEntityType,
60 ) -> StdResult<Option<OpenMessageRecord>> {
61 self.connection
62 .fetch_first(GetOpenMessageQuery::by_expired_entity_type(
63 Utc::now(),
64 signed_entity_type,
65 )?)
66 }
67
68 pub async fn create_open_message(
70 &self,
71 epoch: Epoch,
72 signed_entity_type: &SignedEntityType,
73 protocol_message: &ProtocolMessage,
74 ) -> StdResult<OpenMessageRecord> {
75 let message = self.connection.fetch_first(InsertOpenMessageQuery::one(
76 epoch,
77 signed_entity_type,
78 protocol_message,
79 )?)?;
80
81 message.ok_or_else(|| panic!("Inserting an open_message should not return nothing."))
82 }
83
84 pub async fn create_or_replace_open_message(
87 &self,
88 record: OpenMessageRecord,
89 ) -> StdResult<OpenMessageRecord> {
90 let message = self
91 .connection
92 .fetch_first(InsertOrReplaceOpenMessageQuery::one(record)?)?;
93
94 message.ok_or_else(|| {
95 panic!("Inserting or replacing an open_message should not return nothing.")
96 })
97 }
98
99 pub async fn update_open_message(
101 &self,
102 open_message: &OpenMessageRecord,
103 ) -> StdResult<OpenMessageRecord> {
104 let message = self
105 .connection
106 .fetch_first(UpdateOpenMessageQuery::one(open_message)?)?;
107
108 message.ok_or_else(|| panic!("Updating an open_message should not return nothing."))
109 }
110
111 pub async fn clean_epoch(&self, epoch: Epoch) -> StdResult<usize> {
114 let cursor = self
115 .connection
116 .fetch(DeleteOpenMessageQuery::below_epoch_threshold(epoch))?;
117
118 Ok(cursor.count())
119 }
120}
121
122#[async_trait]
123impl OpenMessageStorer for OpenMessageRepository {
124 async fn insert_or_replace_open_message(&self, open_message: OpenMessage) -> StdResult<()> {
125 let record = OpenMessageRecord {
126 open_message_id: OpenMessageRecord::new_id(),
127 epoch: open_message.epoch,
128 signed_entity_type: open_message.signed_entity_type,
129 protocol_message: open_message.protocol_message,
130 is_certified: open_message.is_certified,
131 is_expired: open_message.is_expired,
132 created_at: open_message.created_at,
133 expires_at: open_message.expires_at,
134 };
135 self.create_or_replace_open_message(record).await?;
136 Ok(())
137 }
138}
139
140#[cfg(test)]
141mod tests {
142 use mithril_common::entities::{BlockNumber, CardanoDbBeacon};
143 use mithril_common::test::double::Dummy;
144
145 use crate::database::record::SingleSignatureRecord;
146 use crate::database::test_helper::{
147 insert_epoch_settings, insert_single_signatures_in_db, main_db_connection,
148 setup_single_signature_records,
149 };
150
151 use super::*;
152
153 async fn get_connection() -> Arc<SqliteConnection> {
154 let connection = main_db_connection().unwrap();
155 insert_epoch_settings(&connection, &[1, 2]).unwrap();
156 Arc::new(connection)
157 }
158
159 fn insert_golden_open_message_with_signature(connection: &SqliteConnection) {
160 connection
161 .execute(
162 r#"
163 insert into open_message values(
164 'd9498619-c12d-4379-ba76-c63035afd03c',
165 275,
166 275,
167 0,
168 '2023-07-27T00:02:44.505640275+00:00',
169 '{ "message_parts": {
170 "next_aggregate_verification_key":"7b226d745f636f6d6d69746d656e74223a7b22726f6f74223a5b3131312c3230352c3133392c3131322c32382c392c3233382c3134382c3133342c302c3230372c3233302c3234312c3130352c3135372c3131302c3232362c3131342c32362c35332c3136362c3235342c3230382c3132372c3231362c3230362c3230302c34382c35352c32312c3231372c31335d2c226e725f6c6561766573223a332c22686173686572223a6e756c6c7d2c22746f74616c5f7374616b65223a32383439323639303636317d"
171 }}',
172 1,
173 0,
174 '2021-07-27T01:02:44.505640275+00:00'
175 );
176
177 insert into single_signature values(
178 'd9498619-c12d-4379-ba76-c63035afd03c',
179 'pool1r0tln8nct3mpyvehgy6uu3cdlmjnmtr2fxjcqnfl6v0qg0we42e',
180 274,
181 '[15,49,52,56,84,85,109,138,171,174,194,209,221,222,224,247,257,258,261,272,299,317,336,346,347,351,394,408,431,453,457,480,481,504,525,535,553,571,572,573,588,591,594,598,603,628,635,637,645,652,663,694,696,700,710,714,727,731,738,745,747,757,763,811,825,831,853,855,891,896,901,917,980,986,989,1010,1025,1077,1082,1092,1096,1140,1146,1147,1171,1192,1197,1246,1248,1261,1270,1277,1280,1290,1304,1349,1360,1363,1374,1409,1416,1418,1425,1432,1437,1440,1476,1481,1491,1499,1505,1527,1528,1544,1552,1559,1561,1571,1574,1596,1628,1638,1659,1680,1733,1736,1761,1782,1807,1868,1873,1877,1915,1923,1926,1927,1968,1969,1999,2078,2084,2125,2154,2156,2200,2207,2214,2231,2245,2247,2248,2280,2337,2364,2404,2442,2452,2461,2472,2484,2500,2511,2544,2565,2574,2578,2597,2600,2607,2611,2612,2620,2626,2638,2651,2668,2689,2698,2717,2764,2767,2843,2847,2855,2867,2869,2873,2906,2911,2918,2919,2921,2933,2936,2950,2953,2958,2960,2967,2973,2994,3002,3004,3030,3031,3037,3049,3056,3132,3136,3140,3194,3218,3240,3261,3283,3294,3298,3318,3320,3324,3358,3361,3368,3373,3378,3398,3415,3417,3428,3450,3458,3462,3467,3501,3512,3539,3545,3558,3568,3573,3581,3600,3618,3628,3634,3635,3638,3646,3667,3677,3698,3699,3701,3706,3708,3728,3741,3744,3748,3762,3771,3779,3792,3806,3807,3821,3823,3827,3828,3842,3849,3850,3854,3856,3861,3907,3925,3938,3942,3950,3985,3998,4015,4018,4021,4077,4092,4094,4103,4115,4165,4174,4188,4190,4199,4216,4220,4223,4252,4280,4314,4315,4338,4340,4353,4363,4367,4400,4403,4407,4419,4423,4427,4429,4450,4472,4486,4489,4497,4525,4537,4542,4550,4578,4598,4601,4613,4618,4621,4623,4640,4648,4656,4660,4661,4702,4710,4715,4737,4748,4753,4754,4766,4776,4779,4784,4794,4801,4803,4834,4854,4855,4861,4871,4873,4878,4887,4915,4920,4923,4945,4950,4951,4960,4962,4980,4993,4999,5028,5067,5068,5081,5091,5125,5129,5132,5133,5142,5176,5194,5223,5239,5256,5267,5292,5300,5337,5343,5354,5357,5366,5375,5376,5386,5405,5409,5416,5454,5457,5458,5465,5467,5471,5483,5490,5504,5540,5552,5565,5582,5617,5646,5659,5660,5666,5678,5685,5696,5706,5716,5722,5746,5752,5753,5760,5762,5782,5798,5799,5804,5810,5816,5817,5844,5857,5864,5873,5894,5970,5974,5994,6002,6006,6025,6026,6031,6047,6052,6065,6077,6084,6085,6098,6108,6115,6123,6137,6146,6171,6195,6206,6219,6229,6261,6263,6266,6274,6281,6301,6308,6312,6339,6360,6378,6422,6425,6449,6462,6477,6499,6508,6545,6546,6549,6551,6554,6563,6587,6589,6593,6599,6609,6610,6625,6636,6642,6644,6649,6653,6669,6673,6683,6697,6710,6712,6714,6717,6732,6766,6813,6864,6896,6908,6919,6943,6947,6965,6968,6969,6987,7000,7001,7022,7035,7037,7046,7047,7059,7074,7136,7146,7147,7161,7174,7191,7193,7221,7222,7225,7227,7255,7263,7281,7294,7313,7330,7349,7375,7387,7427,7442,7452,7466,7472,7482,7483,7488,7540,7586,7602,7624,7636,7657,7675,7678,7683,7691,7696,7713,7726,7737,7740,7781,7800,7809,7826,7827,7833,7836,7863,7868,7878,7886,7895,7923,7942,7945,7993,8007,8023,8029,8040,8051,8056,8079,8092,8094,8099,8120,8137,8152,8175,8191,8213,8219,8271,8280,8281,8293,8296,8300,8301,8304,8312,8326,8329,8336,8346,8347,8352,8363,8395,8397,8403,8405,8413,8426,8437,8441,8442,8458,8488,8519,8527,8534,8543,8643,8663,8669,8691,8730,8748,8756,8757,8760,8763,8772,8800,8806,8825,8837,8850,8853,8857,8864,8887,8903,8924,8970,8988,9015,9051,9084,9102,9111,9121,9122,9147,9171,9177,9178,9183,9194,9210,9246,9253,9266,9279,9292,9338,9339,9344,9348,9359,9374,9378,9404,9410,9418,9464,9468,9472,9479,9489,9494,9497,9549,9604,9613,9644,9663,9684,9686,9691,9696,9707,9717,9718,9773,9779,9794,9795,9796,9824,9871,9876,9881,9883,9886,9899,9920,9921,9922,9929,9930,9955,9956,9961,9982,9988,9991,10008,10025,10036,10038,10061,10064,10069,10070,10087,10090,10098,10119,10122,10124,10126,10139,10158,10164,10187,10203,10205,10242,10259,10269,10270,10285,10318,10324,10360,10381,10382,10407,10420,10438,10469,10481,10504,10508,10510,10590,10595,10608,10614,10626,10632,10662,10679,10685,10697,10705,10716,10719,10743,10790,10801,10815,10830,10844,10847,10856,10860,10877,10919,10930,10933,10938,10940,10942,10945,10950,10967,10985,10995,11021,11029,11032,11039,11131,11158,11170,11192,11205,11209,11220,11270,11283,11299,11328,11352,11358,11373,11376,11391,11421,11422,11431,11438,11449,11457,11474,11497,11506,11512,11542,11548,11563,11581,11591,11592,11593,11602,11657,11659,11673,11695,11706,11712,11717,11729,11744,11767,11777,11779,11793,11804,11824,11826,11843,11880,11884,11887,11924,11934,11936,11940,11966,11978,11989,11998,12026,12030,12037,12059,12063,12076,12087,12105,12145,12160,12161,12165,12170,12204,12236,12254,12258,12259,12303,12305,12313,12327,12334,12339,12355,12360,12367,12391,12415,12427,12463,12464,12532,12554,12568,12572,12595,12631,12637,12672,12678,12679,12701,12702,12705,12723,12725,12735,12753,12756,12776,12781,12805,12811,12831,12849,12855,12863,12873,12880,12885,12892,12896,12898,12904,12916,12932,12944,12946,12952,12953,12955,12965,12990,13002,13007,13047,13071,13079,13090,13102,13144,13159,13161,13173,13174,13188,13208,13216,13227,13246,13249,13268,13293,13296,13319,13323,13340,13349,13356,13378,13379,13388,13398,13432,13433,13467,13519,13524,13533,13566,13572,13596,13619,13641,13647,13656,13659,13671,13685,13693,13703,13752,13787,13793,13798,13801,13805,13807,13808,13820,13830,13841,13845,13857,13862,13870,13898,13908,13910,13935,13939,13942,13949,13952,13958,13968,13972,14003,14007,14037,14046,14051,14066,14075,14125,14127,14144,14149,14151,14163,14196,14202,14223,14243,14247,14248,14252,14255,14290,14293,14299,14362,14382,14392,14411,14429,14459,14467,14485,14502,14509,14540,14562,14570,14605,14619,14631,14640,14655,14681,14684,14698,14703,14704,14722,14735,14739,14765,14774,14814,14836,14842,14866,14873,14880,14884,14892,14897,14948,14966,14978,14984,14989,14999,15016,15025,15031,15041,15066,15079,15120,15124,15144,15173,15183,15186,15196,15212,15218,15230,15234,15244,15245,15254,15272,15273,15283,15291,15303,15320,15355,15369,15378,15403,15407,15412,15413,15426,15444,15498,15505,15509,15526,15528,15559,15564,15615,15619,15621,15626,15629,15650,15651,15663,15667,15685,15702,15712,15726,15733,15734,15743,15762,15794,15809,15820,15828,15872,15887,15889,15896,15897,15964,15982,15992,16002,16008,16020,16022,16023,16042,16054,16071,16082,16099,16116,16132,16140,16142,16164,16181,16196,16201,16204,16214,16230,16234,16235,16238,16239,16257,16275,16309,16364,16367,16379,16398,16423,16451,16454,16468,16471,16543,16547,16548,16557,16565,16571,16573,16580,16606,16613,16629,16636,16655,16656,16660,16679,16680,16685,16729,16735,16738,16739,16745,16767,16800,16810,16812,16850,16866,16893,16904,16927,16958,16961,16967,16975,16983,16989,17000,17060,17066,17088,17097,17102,17109,17114,17124,17139,17140,17144,17148,17167,17174,17195,17204,17220,17224,17234,17246,17251,17273,17292,17294,17305,17308,17314,17320,17321,17382,17388,17417,17427,17432,17445,17449,17465,17468,17473,17490,17502,17507,17519,17523,17577,17597,17610,17612,17622,17634,17639,17645,17671,17677,17713,17719,17728,17743,17748,17780,17795,17807,17808,17810,17817,17819,17825,17834,17837,17854,17882,17888,17895,17898,17899,17902,17929,17931,17933,17937,17938,17942,17952,17958,17959,17980,17986,17997,18004,18024,18026,18041,18043,18050,18076,18117,18122,18140,18154,18157,18163,18169,18178,18181,18191,18211,18214,18218,18247,18263,18265,18271,18274,18278,18320,18350,18360,18381,18397,18412,18428,18470,18476,18478,18484,18507,18522,18536,18546,18551,18552,18567,18573,18580,18582,18593,18602,18609,18616,18631,18632,18652,18665,18680,18685,18710,18721,18735,18745,18748,18759,18783,18786,18787,18790,18796,18802,18805,18810,18846,18858,18872,18873,18888,18905,18910,18919,18933,18936,18941,18944,18953,18981,18989,18999,19039,19077,19122,19153,19154,19156,19163,19169,19197,19198,19199,19229,19244,19245,19304,19306,19322,19343,19346,19348,19350,19352,19372,19379,19397,19405,19417,19452,19461,19468,19477,19499,19551,19574,19586,19595,19614,19635,19673,19683,19706,19718,19722,19764,19807,19849,19851,19885,19911,19937,19963,19964,19984,19987,19995,19996,20005,20010,20021,20053,20057,20095,20100,20101,20138,20143,20149,20151,20155,20159,20176,20186,20193,20195,20211,20215,20258,20270,20297,20305,20311,20336,20351,20370,20380,20390,20407,20413,20417,20439,20442,20444,20453,20455,20468,20498,20510,20518,20530,20532,20539,20552,20553,20584,20588,20600,20602,20638,20656,20675,20677,20693,20698,20728,20735,20762,20807,20808,20832,20847,20862,20894,20897,20903,20924,20938,20952,20960]',
182 '7b227369676d61223a5b3133392c3135332c36382c3133352c3134382c3138302c3133352c35392c3136302c3135302c3133302c3233362c3139332c3138392c3131382c3232342c3137382c3235322c3133312c3138382c32372c37362c3138332c3134322c3230342c34332c34362c3130342c3230372c36332c3135382c3137392c3231382c3135332c3232312c3233392c3234312c37322c3235342c362c3136302c3234382c3232332c3132382c3138322c3234372c3135342c3235325d2c22696e6465786573223a5b31352c34392c35322c35362c38342c38352c3130392c3133382c3137312c3137342c3139342c3230392c3232312c3232322c3232342c3234372c3235372c3235382c3236312c3237322c3239392c3331372c3333362c3334362c3334372c3335312c3339342c3430382c3433312c3435332c3435372c3438302c3438312c3530342c3532352c3533352c3535332c3537312c3537322c3537332c3538382c3539312c3539342c3539382c3630332c3632382c3633352c3633372c3634352c3635322c3636332c3639342c3639362c3730302c3731302c3731342c3732372c3733312c3733382c3734352c3734372c3735372c3736332c3831312c3832352c3833312c3835332c3835352c3839312c3839362c3930312c3931372c3938302c3938362c3938392c313031302c313032352c313037372c313038322c313039322c313039362c313134302c313134362c313134372c313137312c313139322c313139372c313234362c313234382c313236312c313237302c313237372c313238302c313239302c313330342c313334392c313336302c313336332c313337342c313430392c313431362c313431382c313432352c313433322c313433372c313434302c313437362c313438312c313439312c313439392c313530352c313532372c313532382c313534342c313535322c313535392c313536312c313537312c313537342c313539362c313632382c313633382c313635392c313638302c313733332c313733362c313736312c313738322c313830372c313836382c313837332c313837372c313931352c313932332c313932362c313932372c313936382c313936392c313939392c323037382c323038342c323132352c323135342c323135362c323230302c323230372c323231342c323233312c323234352c323234372c323234382c323238302c323333372c323336342c323430342c323434322c323435322c323436312c323437322c323438342c323530302c323531312c323534342c323536352c323537342c323537382c323539372c323630302c323630372c323631312c323631322c323632302c323632362c323633382c323635312c323636382c323638392c323639382c323731372c323736342c323736372c323834332c323834372c323835352c323836372c323836392c323837332c323930362c323931312c323931382c323931392c323932312c323933332c323933362c323935302c323935332c323935382c323936302c323936372c323937332c323939342c333030322c333030342c333033302c333033312c333033372c333034392c333035362c333133322c333133362c333134302c333139342c333231382c333234302c333236312c333238332c333239342c333239382c333331382c333332302c333332342c333335382c333336312c333336382c333337332c333337382c333339382c333431352c333431372c333432382c333435302c333435382c333436322c333436372c333530312c333531322c333533392c333534352c333535382c333536382c333537332c333538312c333630302c333631382c333632382c333633342c333633352c333633382c333634362c333636372c333637372c333639382c333639392c333730312c333730362c333730382c333732382c333734312c333734342c333734382c333736322c333737312c333737392c333739322c333830362c333830372c333832312c333832332c333832372c333832382c333834322c333834392c333835302c333835342c333835362c333836312c333930372c333932352c333933382c333934322c333935302c333938352c333939382c343031352c343031382c343032312c343037372c343039322c343039342c343130332c343131352c343136352c343137342c343138382c343139302c343139392c343231362c343232302c343232332c343235322c343238302c343331342c343331352c343333382c343334302c343335332c343336332c343336372c343430302c343430332c343430372c343431392c343432332c343432372c343432392c343435302c343437322c343438362c343438392c343439372c343532352c343533372c343534322c343535302c343537382c343539382c343630312c343631332c343631382c343632312c343632332c343634302c343634382c343635362c343636302c343636312c343730322c343731302c343731352c343733372c343734382c343735332c343735342c343736362c343737362c343737392c343738342c343739342c343830312c343830332c343833342c343835342c343835352c343836312c343837312c343837332c343837382c343838372c343931352c343932302c343932332c343934352c343935302c343935312c343936302c343936322c343938302c343939332c343939392c353032382c353036372c353036382c353038312c353039312c353132352c353132392c353133322c353133332c353134322c353137362c353139342c353232332c353233392c353235362c353236372c353239322c353330302c353333372c353334332c353335342c353335372c353336362c353337352c353337362c353338362c353430352c353430392c353431362c353435342c353435372c353435382c353436352c353436372c353437312c353438332c353439302c353530342c353534302c353535322c353536352c353538322c353631372c353634362c353635392c353636302c353636362c353637382c353638352c353639362c353730362c353731362c353732322c353734362c353735322c353735332c353736302c353736322c353738322c353739382c353739392c353830342c353831302c353831362c353831372c353834342c353835372c353836342c353837332c353839342c353937302c353937342c353939342c363030322c363030362c363032352c363032362c363033312c363034372c363035322c363036352c363037372c363038342c363038352c363039382c363130382c363131352c363132332c363133372c363134362c363137312c363139352c363230362c363231392c363232392c363236312c363236332c363236362c363237342c363238312c363330312c363330382c363331322c363333392c363336302c363337382c363432322c363432352c363434392c363436322c363437372c363439392c363530382c363534352c363534362c363534392c363535312c363535342c363536332c363538372c363538392c363539332c363539392c363630392c363631302c363632352c363633362c363634322c363634342c363634392c363635332c363636392c363637332c363638332c363639372c363731302c363731322c363731342c363731372c363733322c363736362c363831332c363836342c363839362c363930382c363931392c363934332c363934372c363936352c363936382c363936392c363938372c373030302c373030312c373032322c373033352c373033372c373034362c373034372c373035392c373037342c373133362c373134362c373134372c373136312c373137342c373139312c373139332c373232312c373232322c373232352c373232372c373235352c373236332c373238312c373239342c373331332c373333302c373334392c373337352c373338372c373432372c373434322c373435322c373436362c373437322c373438322c373438332c373438382c373534302c373538362c373630322c373632342c373633362c373635372c373637352c373637382c373638332c373639312c373639362c373731332c373732362c373733372c373734302c373738312c373830302c373830392c373832362c373832372c373833332c373833362c373836332c373836382c373837382c373838362c373839352c373932332c373934322c373934352c373939332c383030372c383032332c383032392c383034302c383035312c383035362c383037392c383039322c383039342c383039392c383132302c383133372c383135322c383137352c383139312c383231332c383231392c383237312c383238302c383238312c383239332c383239362c383330302c383330312c383330342c383331322c383332362c383332392c383333362c383334362c383334372c383335322c383336332c383339352c383339372c383430332c383430352c383431332c383432362c383433372c383434312c383434322c383435382c383438382c383531392c383532372c383533342c383534332c383634332c383636332c383636392c383639312c383733302c383734382c383735362c383735372c383736302c383736332c383737322c383830302c383830362c383832352c383833372c383835302c383835332c383835372c383836342c383838372c383930332c383932342c383937302c383938382c393031352c393035312c393038342c393130322c393131312c393132312c393132322c393134372c393137312c393137372c393137382c393138332c393139342c393231302c393234362c393235332c393236362c393237392c393239322c393333382c393333392c393334342c393334382c393335392c393337342c393337382c393430342c393431302c393431382c393436342c393436382c393437322c393437392c393438392c393439342c393439372c393534392c393630342c393631332c393634342c393636332c393638342c393638362c393639312c393639362c393730372c393731372c393731382c393737332c393737392c393739342c393739352c393739362c393832342c393837312c393837362c393838312c393838332c393838362c393839392c393932302c393932312c393932322c393932392c393933302c393935352c393935362c393936312c393938322c393938382c393939312c31303030382c31303032352c31303033362c31303033382c31303036312c31303036342c31303036392c31303037302c31303038372c31303039302c31303039382c31303131392c31303132322c31303132342c31303132362c31303133392c31303135382c31303136342c31303138372c31303230332c31303230352c31303234322c31303235392c31303236392c31303237302c31303238352c31303331382c31303332342c31303336302c31303338312c31303338322c31303430372c31303432302c31303433382c31303436392c31303438312c31303530342c31303530382c31303531302c31303539302c31303539352c31303630382c31303631342c31303632362c31303633322c31303636322c31303637392c31303638352c31303639372c31303730352c31303731362c31303731392c31303734332c31303739302c31303830312c31303831352c31303833302c31303834342c31303834372c31303835362c31303836302c31303837372c31303931392c31303933302c31303933332c31303933382c31303934302c31303934322c31303934352c31303935302c31303936372c31303938352c31303939352c31313032312c31313032392c31313033322c31313033392c31313133312c31313135382c31313137302c31313139322c31313230352c31313230392c31313232302c31313237302c31313238332c31313239392c31313332382c31313335322c31313335382c31313337332c31313337362c31313339312c31313432312c31313432322c31313433312c31313433382c31313434392c31313435372c31313437342c31313439372c31313530362c31313531322c31313534322c31313534382c31313536332c31313538312c31313539312c31313539322c31313539332c31313630322c31313635372c31313635392c31313637332c31313639352c31313730362c31313731322c31313731372c31313732392c31313734342c31313736372c31313737372c31313737392c31313739332c31313830342c31313832342c31313832362c31313834332c31313838302c31313838342c31313838372c31313932342c31313933342c31313933362c31313934302c31313936362c31313937382c31313938392c31313939382c31323032362c31323033302c31323033372c31323035392c31323036332c31323037362c31323038372c31323130352c31323134352c31323136302c31323136312c31323136352c31323137302c31323230342c31323233362c31323235342c31323235382c31323235392c31323330332c31323330352c31323331332c31323332372c31323333342c31323333392c31323335352c31323336302c31323336372c31323339312c31323431352c31323432372c31323436332c31323436342c31323533322c31323535342c31323536382c31323537322c31323539352c31323633312c31323633372c31323637322c31323637382c31323637392c31323730312c31323730322c31323730352c31323732332c31323732352c31323733352c31323735332c31323735362c31323737362c31323738312c31323830352c31323831312c31323833312c31323834392c31323835352c31323836332c31323837332c31323838302c31323838352c31323839322c31323839362c31323839382c31323930342c31323931362c31323933322c31323934342c31323934362c31323935322c31323935332c31323935352c31323936352c31323939302c31333030322c31333030372c31333034372c31333037312c31333037392c31333039302c31333130322c31333134342c31333135392c31333136312c31333137332c31333137342c31333138382c31333230382c31333231362c31333232372c31333234362c31333234392c31333236382c31333239332c31333239362c31333331392c31333332332c31333334302c31333334392c31333335362c31333337382c31333337392c31333338382c31333339382c31333433322c31333433332c31333436372c31333531392c31333532342c31333533332c31333536362c31333537322c31333539362c31333631392c31333634312c31333634372c31333635362c31333635392c31333637312c31333638352c31333639332c31333730332c31333735322c31333738372c31333739332c31333739382c31333830312c31333830352c31333830372c31333830382c31333832302c31333833302c31333834312c31333834352c31333835372c31333836322c31333837302c31333839382c31333930382c31333931302c31333933352c31333933392c31333934322c31333934392c31333935322c31333935382c31333936382c31333937322c31343030332c31343030372c31343033372c31343034362c31343035312c31343036362c31343037352c31343132352c31343132372c31343134342c31343134392c31343135312c31343136332c31343139362c31343230322c31343232332c31343234332c31343234372c31343234382c31343235322c31343235352c31343239302c31343239332c31343239392c31343336322c31343338322c31343339322c31343431312c31343432392c31343435392c31343436372c31343438352c31343530322c31343530392c31343534302c31343536322c31343537302c31343630352c31343631392c31343633312c31343634302c31343635352c31343638312c31343638342c31343639382c31343730332c31343730342c31343732322c31343733352c31343733392c31343736352c31343737342c31343831342c31343833362c31343834322c31343836362c31343837332c31343838302c31343838342c31343839322c31343839372c31343934382c31343936362c31343937382c31343938342c31343938392c31343939392c31353031362c31353032352c31353033312c31353034312c31353036362c31353037392c31353132302c31353132342c31353134342c31353137332c31353138332c31353138362c31353139362c31353231322c31353231382c31353233302c31353233342c31353234342c31353234352c31353235342c31353237322c31353237332c31353238332c31353239312c31353330332c31353332302c31353335352c31353336392c31353337382c31353430332c31353430372c31353431322c31353431332c31353432362c31353434342c31353439382c31353530352c31353530392c31353532362c31353532382c31353535392c31353536342c31353631352c31353631392c31353632312c31353632362c31353632392c31353635302c31353635312c31353636332c31353636372c31353638352c31353730322c31353731322c31353732362c31353733332c31353733342c31353734332c31353736322c31353739342c31353830392c31353832302c31353832382c31353837322c31353838372c31353838392c31353839362c31353839372c31353936342c31353938322c31353939322c31363030322c31363030382c31363032302c31363032322c31363032332c31363034322c31363035342c31363037312c31363038322c31363039392c31363131362c31363133322c31363134302c31363134322c31363136342c31363138312c31363139362c31363230312c31363230342c31363231342c31363233302c31363233342c31363233352c31363233382c31363233392c31363235372c31363237352c31363330392c31363336342c31363336372c31363337392c31363339382c31363432332c31363435312c31363435342c31363436382c31363437312c31363534332c31363534372c31363534382c31363535372c31363536352c31363537312c31363537332c31363538302c31363630362c31363631332c31363632392c31363633362c31363635352c31363635362c31363636302c31363637392c31363638302c31363638352c31363732392c31363733352c31363733382c31363733392c31363734352c31363736372c31363830302c31363831302c31363831322c31363835302c31363836362c31363839332c31363930342c31363932372c31363935382c31363936312c31363936372c31363937352c31363938332c31363938392c31373030302c31373036302c31373036362c31373038382c31373039372c31373130322c31373130392c31373131342c31373132342c31373133392c31373134302c31373134342c31373134382c31373136372c31373137342c31373139352c31373230342c31373232302c31373232342c31373233342c31373234362c31373235312c31373237332c31373239322c31373239342c31373330352c31373330382c31373331342c31373332302c31373332312c31373338322c31373338382c31373431372c31373432372c31373433322c31373434352c31373434392c31373436352c31373436382c31373437332c31373439302c31373530322c31373530372c31373531392c31373532332c31373537372c31373539372c31373631302c31373631322c31373632322c31373633342c31373633392c31373634352c31373637312c31373637372c31373731332c31373731392c31373732382c31373734332c31373734382c31373738302c31373739352c31373830372c31373830382c31373831302c31373831372c31373831392c31373832352c31373833342c31373833372c31373835342c31373838322c31373838382c31373839352c31373839382c31373839392c31373930322c31373932392c31373933312c31373933332c31373933372c31373933382c31373934322c31373935322c31373935382c31373935392c31373938302c31373938362c31373939372c31383030342c31383032342c31383032362c31383034312c31383034332c31383035302c31383037362c31383131372c31383132322c31383134302c31383135342c31383135372c31383136332c31383136392c31383137382c31383138312c31383139312c31383231312c31383231342c31383231382c31383234372c31383236332c31383236352c31383237312c31383237342c31383237382c31383332302c31383335302c31383336302c31383338312c31383339372c31383431322c31383432382c31383437302c31383437362c31383437382c31383438342c31383530372c31383532322c31383533362c31383534362c31383535312c31383535322c31383536372c31383537332c31383538302c31383538322c31383539332c31383630322c31383630392c31383631362c31383633312c31383633322c31383635322c31383636352c31383638302c31383638352c31383731302c31383732312c31383733352c31383734352c31383734382c31383735392c31383738332c31383738362c31383738372c31383739302c31383739362c31383830322c31383830352c31383831302c31383834362c31383835382c31383837322c31383837332c31383838382c31383930352c31383931302c31383931392c31383933332c31383933362c31383934312c31383934342c31383935332c31383938312c31383938392c31383939392c31393033392c31393037372c31393132322c31393135332c31393135342c31393135362c31393136332c31393136392c31393139372c31393139382c31393139392c31393232392c31393234342c31393234352c31393330342c31393330362c31393332322c31393334332c31393334362c31393334382c31393335302c31393335322c31393337322c31393337392c31393339372c31393430352c31393431372c31393435322c31393436312c31393436382c31393437372c31393439392c31393535312c31393537342c31393538362c31393539352c31393631342c31393633352c31393637332c31393638332c31393730362c31393731382c31393732322c31393736342c31393830372c31393834392c31393835312c31393838352c31393931312c31393933372c31393936332c31393936342c31393938342c31393938372c31393939352c31393939362c32303030352c32303031302c32303032312c32303035332c32303035372c32303039352c32303130302c32303130312c32303133382c32303134332c32303134392c32303135312c32303135352c32303135392c32303137362c32303138362c32303139332c32303139352c32303231312c32303231352c32303235382c32303237302c32303239372c32303330352c32303331312c32303333362c32303335312c32303337302c32303338302c32303339302c32303430372c32303431332c32303431372c32303433392c32303434322c32303434342c32303435332c32303435352c32303436382c32303439382c32303531302c32303531382c32303533302c32303533322c32303533392c32303535322c32303535332c32303538342c32303538382c32303630302c32303630322c32303633382c32303635362c32303637352c32303637372c32303639332c32303639382c32303732382c32303733352c32303736322c32303830372c32303830382c32303833322c32303834372c32303836322c32303839342c32303839372c32303930332c32303932342c32303933382c32303935322c32303936305d2c227369676e65725f696e646578223a327d',
183 '2023-07-27T00:06:20.710956040+00:00'
184 );
185
186 "#,
187 )
188 .unwrap();
189 }
190
191 #[tokio::test]
192 async fn test_golden_master() {
193 let connection = main_db_connection().unwrap();
194 insert_golden_open_message_with_signature(&connection);
195
196 let repository = OpenMessageRepository::new(Arc::new(connection));
197 repository
198 .get_open_message(&SignedEntityType::MithrilStakeDistribution(Epoch(275)))
199 .await
200 .expect("Getting Golden open message should not fail")
201 .expect("An open message should exist for this signed entity type");
202
203 repository
204 .get_open_message_with_single_signatures(&SignedEntityType::MithrilStakeDistribution(
205 Epoch(275),
206 ))
207 .await
208 .expect("Getting Golden open message should not fail")
209 .expect(
210 "An open message with single signatures should exist for this signed entity type",
211 );
212 }
213
214 #[tokio::test]
215 async fn repository_get_open_message() {
216 let connection = get_connection().await;
217 let repository = OpenMessageRepository::new(connection.clone());
218 let epoch = Epoch(1);
219
220 for signed_entity_type in [
221 SignedEntityType::MithrilStakeDistribution(epoch),
222 SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::new(*epoch, 1)),
223 SignedEntityType::CardanoTransactions(epoch, BlockNumber(100)),
224 ] {
225 repository
226 .create_open_message(epoch, &signed_entity_type, &ProtocolMessage::new())
227 .await
228 .unwrap();
229 let open_message_result =
230 repository.get_open_message(&signed_entity_type).await.unwrap();
231 assert!(open_message_result.is_some());
232 }
233 }
234
235 #[tokio::test]
236 async fn repository_get_expired_open_message() {
237 let connection = get_connection().await;
238 let repository = OpenMessageRepository::new(connection.clone());
239 let epoch = Epoch(1);
240 let signed_entity_type = SignedEntityType::MithrilStakeDistribution(epoch);
241
242 let mut open_message = repository
243 .create_open_message(epoch, &signed_entity_type, &ProtocolMessage::new())
244 .await
245 .unwrap();
246
247 let open_message_result = repository
248 .get_expired_open_message(&signed_entity_type)
249 .await
250 .unwrap();
251 assert!(open_message_result.is_none());
252
253 open_message.expires_at = Some(Utc::now() - chrono::Days::new(100));
254 repository.update_open_message(&open_message).await.unwrap();
255
256 let open_message_result = repository
257 .get_expired_open_message(&signed_entity_type)
258 .await
259 .unwrap();
260 assert!(open_message_result.is_some());
261 }
262
263 #[tokio::test]
264 async fn repository_create_open_message() {
265 let connection = get_connection().await;
266 let repository = OpenMessageRepository::new(connection.clone());
267 let epoch = Epoch(1);
268 let open_message = repository
269 .create_open_message(
270 epoch,
271 &SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()),
272 &ProtocolMessage::new(),
273 )
274 .await
275 .unwrap();
276
277 assert_eq!(Epoch(1), open_message.epoch);
278 assert_eq!(
279 SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()),
280 open_message.signed_entity_type
281 );
282
283 let message = {
284 let message = connection
285 .fetch_first(GetOpenMessageQuery::by_id(&open_message.open_message_id))
286 .unwrap();
287
288 message.unwrap_or_else(|| {
289 panic!(
290 "OpenMessage ID='{}' should exist in the database.",
291 open_message.open_message_id
292 )
293 })
294 };
295
296 assert_eq!(open_message.protocol_message, message.protocol_message);
297 assert_eq!(open_message.epoch, message.epoch);
298 }
299
300 #[tokio::test]
301 async fn repository_create_or_replace_open_message() {
302 let connection = get_connection().await;
303 let repository = OpenMessageRepository::new(connection.clone());
304 let mut inserted_record = repository
305 .create_or_replace_open_message(OpenMessageRecord {
306 epoch: Epoch(5),
307 signed_entity_type: SignedEntityType::MithrilStakeDistribution(Epoch(6)),
308 ..OpenMessageRecord::dummy()
309 })
310 .await
311 .unwrap();
312 assert_eq!(Epoch(5), inserted_record.epoch);
313
314 inserted_record.epoch = Epoch(32);
315 let replaced_record = repository
316 .create_or_replace_open_message(inserted_record)
317 .await
318 .unwrap();
319 assert_eq!(Epoch(32), replaced_record.epoch);
320 }
321
322 #[tokio::test]
323 async fn repository_update_open_message() {
324 let connection = get_connection().await;
325 let repository = OpenMessageRepository::new(connection.clone());
326 let epoch = Epoch(1);
327 let open_message = repository
328 .create_open_message(
329 epoch,
330 &SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon::default()),
331 &ProtocolMessage::new(),
332 )
333 .await
334 .unwrap();
335
336 let mut open_message_updated = open_message;
337 open_message_updated.is_certified = true;
338 let open_message_saved =
339 repository.update_open_message(&open_message_updated).await.unwrap();
340
341 assert_eq!(open_message_updated, open_message_saved);
342 }
343
344 #[tokio::test]
345 async fn repository_clean_open_message() {
346 let connection = get_connection().await;
347 let repository = OpenMessageRepository::new(connection.clone());
348 let beacon = CardanoDbBeacon {
349 epoch: Epoch(1),
350 ..CardanoDbBeacon::default()
351 };
352 let _ = repository
353 .create_open_message(
354 beacon.epoch,
355 &SignedEntityType::CardanoImmutableFilesFull(beacon.clone()),
356 &ProtocolMessage::new(),
357 )
358 .await
359 .unwrap();
360 let _ = repository
361 .create_open_message(
362 beacon.epoch,
363 &SignedEntityType::CardanoImmutableFilesFull(CardanoDbBeacon {
364 epoch: Epoch(2),
365 ..beacon
366 }),
367 &ProtocolMessage::new(),
368 )
369 .await
370 .unwrap();
371 let count = repository.clean_epoch(Epoch(2)).await.unwrap();
372
373 assert_eq!(2, count);
374 }
375
376 #[tokio::test]
377 async fn repository_get_open_message_with_single_signatures_when_signatures_exist() {
378 let connection = Arc::new(main_db_connection().unwrap());
379 let repository = OpenMessageRepository::new(connection.clone());
380
381 let open_message = repository
382 .create_open_message(
383 Epoch(1),
384 &SignedEntityType::MithrilStakeDistribution(Epoch(1)),
385 &ProtocolMessage::default(),
386 )
387 .await
388 .unwrap();
389 let single_signature_records: Vec<SingleSignatureRecord> =
390 setup_single_signature_records(1, 1, 4)
391 .into_iter()
392 .map(|s| SingleSignatureRecord {
393 open_message_id: open_message.open_message_id,
394 ..s
395 })
396 .collect();
397 {
398 insert_single_signatures_in_db(&connection, single_signature_records).unwrap();
399 }
400
401 let open_message_with_single_signatures = repository
402 .get_open_message_with_single_signatures(&open_message.signed_entity_type)
403 .await
404 .unwrap()
405 .unwrap();
406 assert_eq!(
407 4,
408 open_message_with_single_signatures.single_signatures.len()
409 )
410 }
411
412 #[tokio::test]
413 async fn repository_get_open_message_with_single_signatures_when_signatures_not_exist() {
414 let connection = main_db_connection().unwrap();
415 let repository = OpenMessageRepository::new(Arc::new(connection));
416
417 let open_message = OpenMessageRecord::dummy();
418 repository
419 .create_open_message(
420 open_message.epoch,
421 &open_message.signed_entity_type,
422 &open_message.protocol_message,
423 )
424 .await
425 .unwrap();
426
427 let open_message_with_single_signatures = repository
428 .get_open_message_with_single_signatures(&open_message.signed_entity_type)
429 .await
430 .unwrap()
431 .unwrap();
432 assert!(open_message_with_single_signatures.single_signatures.is_empty())
433 }
434}