Skip to content

Commit de33dc0

Browse files
committed
http message service
1 parent 3e17cbe commit de33dc0

File tree

6 files changed

+45
-40
lines changed

6 files changed

+45
-40
lines changed

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ use sqlite::ConnectionWithFullMutex;
1111

1212
use super::{CertificateRecord, CertificateRecordProvider};
1313

14+
/// Repository that turn inner Record entities into Message entities.
1415
pub struct CertificateMessageRepository {
1516
connection: Arc<ConnectionWithFullMutex>,
1617
}
1718

1819
impl CertificateMessageRepository {
20+
/// Constructor
1921
pub fn new(connection: Arc<ConnectionWithFullMutex>) -> Self {
2022
Self { connection }
2123
}
@@ -38,7 +40,7 @@ impl From<CertificateRecord> for CertificateMessage {
3840

3941
CertificateMessage {
4042
hash: value.certificate_id,
41-
previous_hash: value.parent_certificate_id.unwrap_or_else(|| String::new()),
43+
previous_hash: value.parent_certificate_id.unwrap_or_default(),
4244
beacon: value.beacon,
4345
metadata,
4446
protocol_message: value.protocol_message,
@@ -59,15 +61,10 @@ impl From<CertificateRecord> for CertificateListItemMessage {
5961
sealed_at: value.sealed_at,
6062
total_signers: value.signers.len(),
6163
};
62-
let (multi_signature, genesis_signature) = if value.parent_certificate_id.is_none() {
63-
(String::new(), value.signature)
64-
} else {
65-
(value.signature, String::new())
66-
};
6764

6865
CertificateListItemMessage {
6966
hash: value.certificate_id,
70-
previous_hash: value.parent_certificate_id.unwrap_or_else(|| String::new()),
67+
previous_hash: value.parent_certificate_id.unwrap_or_default(),
7168
beacon: value.beacon,
7269
metadata,
7370
protocol_message: value.protocol_message,
@@ -78,13 +75,15 @@ impl From<CertificateRecord> for CertificateListItemMessage {
7875
}
7976

8077
impl CertificateMessageRepository {
78+
/// Return the certificate matching the given hash.
8179
pub async fn get_certificate(&self, hash: &str) -> StdResult<Option<CertificateMessage>> {
8280
let provider = CertificateRecordProvider::new(&self.connection);
8381
let mut cursor = provider.get_by_certificate_id(hash)?;
8482

8583
Ok(cursor.next().map(|v| v.into()))
8684
}
8785

86+
/// Return the last N certificates
8887
pub async fn get_last(&self, limit: usize) -> StdResult<Vec<CertificateListItemMessage>> {
8988
let provider = CertificateRecordProvider::new(&self.connection);
9089
let cursor = provider.get_all()?;

mithril-aggregator/src/dependency_injection/builder.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,7 @@ impl DependenciesBuilder {
10271027
ticker_service: self.get_ticker_service().await?,
10281028
signed_entity_storer: self.get_signed_entity_storer().await?,
10291029
signer_getter: self.get_signer_store().await?,
1030+
http_message_service: self.get_http_message_service().await?,
10301031
};
10311032

10321033
Ok(dependency_manager)

mithril-aggregator/src/dependency_injection/containers.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use mithril_common::{
1616
BeaconProvider,
1717
};
1818

19-
use crate::services::EpochService;
19+
use crate::services::{EpochService, HttpMessageService};
2020
use crate::{
2121
configuration::*,
2222
database::provider::{CertificateRepository, SignedEntityStorer, SignerGetter, StakePoolStore},
@@ -132,6 +132,9 @@ pub struct DependencyContainer {
132132

133133
/// Signer getter service
134134
pub signer_getter: Arc<dyn SignerGetter>,
135+
136+
/// HTTP message service
137+
pub http_message_service: Arc<dyn HttpMessageService>,
135138
}
136139

137140
#[doc(hidden)]

mithril-aggregator/src/http_server/routes/certificate_routes.rs

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ fn certificate_certificates(
2929
) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone {
3030
warp::path!("certificates")
3131
.and(warp::get())
32-
.and(middlewares::with_certifier_service(dependency_manager))
32+
.and(middlewares::with_http_message_service(dependency_manager))
3333
.and_then(handlers::certificate_certificates)
3434
}
3535

@@ -39,16 +39,14 @@ fn certificate_certificate_hash(
3939
) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone {
4040
warp::path!("certificate" / String)
4141
.and(warp::get())
42-
.and(middlewares::with_certifier_service(dependency_manager))
42+
.and(middlewares::with_http_message_service(dependency_manager))
4343
.and_then(handlers::certificate_certificate_hash)
4444
}
4545

4646
mod handlers {
4747
use crate::{
48-
http_server::routes::reply,
49-
message_adapters::{ToCertificateListMessageAdapter, ToCertificateMessageAdapter},
50-
services::CertifierService,
51-
CertificatePendingStore, ToCertificatePendingMessageAdapter,
48+
http_server::routes::reply, services::HttpMessageService, CertificatePendingStore,
49+
ToCertificatePendingMessageAdapter,
5250
};
5351

5452
use mithril_common::messages::ToMessageAdapter;
@@ -80,18 +78,15 @@ mod handlers {
8078

8179
/// List all Certificates
8280
pub async fn certificate_certificates(
83-
certifier_service: Arc<dyn CertifierService>,
81+
http_message_service: Arc<dyn HttpMessageService>,
8482
) -> Result<impl warp::Reply, Infallible> {
8583
debug!("⇄ HTTP SERVER: certificate_certificates",);
8684

87-
match certifier_service
88-
.get_latest_certificates(LIST_MAX_ITEMS)
85+
match http_message_service
86+
.get_last_certificates(LIST_MAX_ITEMS)
8987
.await
9088
{
91-
Ok(certificates) => Ok(reply::json(
92-
&ToCertificateListMessageAdapter::adapt(certificates),
93-
StatusCode::OK,
94-
)),
89+
Ok(certificates) => Ok(reply::json(&certificates, StatusCode::OK)),
9590
Err(err) => {
9691
warn!("certificate_certificates::error"; "error" => ?err);
9792
Ok(reply::internal_server_error(err))
@@ -102,21 +97,18 @@ mod handlers {
10297
/// Certificate by certificate hash
10398
pub async fn certificate_certificate_hash(
10499
certificate_hash: String,
105-
certifier_service: Arc<dyn CertifierService>,
100+
http_message_service: Arc<dyn HttpMessageService>,
106101
) -> Result<impl warp::Reply, Infallible> {
107102
debug!(
108103
"⇄ HTTP SERVER: certificate_certificate_hash/{}",
109104
certificate_hash
110105
);
111106

112-
match certifier_service
113-
.get_certificate_by_hash(&certificate_hash)
107+
match http_message_service
108+
.get_certificate(&certificate_hash)
114109
.await
115110
{
116-
Ok(Some(certificate)) => Ok(reply::json(
117-
&ToCertificateMessageAdapter::adapt(certificate),
118-
StatusCode::OK,
119-
)),
111+
Ok(Some(certificate)) => Ok(reply::json(&certificate, StatusCode::OK)),
120112
Ok(None) => Ok(reply::empty(StatusCode::NOT_FOUND)),
121113
Err(err) => {
122114
warn!("certificate_certificate_hash::error"; "error" => ?err);

mithril-aggregator/src/http_server/routes/middlewares.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::{
22
database::provider::SignerGetter,
33
dependency_injection::EpochServiceWrapper,
44
event_store::{EventMessage, TransmitterService},
5-
services::{CertifierService, SignedEntityService, TickerService},
5+
services::{CertifierService, HttpMessageService, SignedEntityService, TickerService},
66
CertificatePendingStore, Configuration, DependencyContainer, SignerRegisterer,
77
VerificationKeyStorer,
88
};
@@ -95,3 +95,10 @@ pub fn with_api_version_provider(
9595
) -> impl Filter<Extract = (Arc<APIVersionProvider>,), Error = Infallible> + Clone {
9696
warp::any().map(move || dependency_manager.api_version_provider.clone())
9797
}
98+
99+
/// With Message service
100+
pub fn with_http_message_service(
101+
dependency_manager: Arc<DependencyContainer>,
102+
) -> impl Filter<Extract = (Arc<dyn HttpMessageService>,), Error = Infallible> + Clone {
103+
warp::any().map(move || dependency_manager.http_message_service.clone())
104+
}

mithril-aggregator/src/services/http_message.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use async_trait::async_trait;
66
use thiserror::Error;
77

88
use mithril_common::{
9-
messages::{CertificateListMessage, CertificateMessage, CertificatePendingMessage},
9+
messages::{CertificateListMessage, CertificateMessage},
1010
StdResult,
1111
};
1212

@@ -21,7 +21,7 @@ pub enum HttpMessageServiceError {
2121
}
2222
/// HTTP Message service trait.
2323
#[async_trait]
24-
pub trait HttpMessageService {
24+
pub trait HttpMessageService: Sync + Send {
2525
/// Return the message representation of a certificate if it exists.
2626
async fn get_certificate(
2727
&self,
@@ -30,16 +30,15 @@ pub trait HttpMessageService {
3030

3131
/// Return the message representation of the last N certificates
3232
async fn get_last_certificates(&self, limit: usize) -> StdResult<CertificateListMessage>;
33-
34-
/// Return the message representation of the current pending certificate
35-
async fn get_pending_certificate(&self) -> StdResult<CertificatePendingMessage>;
3633
}
3734

35+
/// Implementation of the [HttpMessageService]
3836
pub struct MithrilHttpMessageService {
3937
certificate_message_repository: Arc<CertificateMessageRepository>,
4038
}
4139

4240
impl MithrilHttpMessageService {
41+
/// Constructor
4342
pub fn new(certificate_message_repository: Arc<CertificateMessageRepository>) -> Self {
4443
Self {
4544
certificate_message_repository,
@@ -61,10 +60,6 @@ impl HttpMessageService for MithrilHttpMessageService {
6160
async fn get_last_certificates(&self, limit: usize) -> StdResult<CertificateListMessage> {
6261
self.certificate_message_repository.get_last(limit).await
6362
}
64-
65-
async fn get_pending_certificate(&self) -> StdResult<CertificatePendingMessage> {
66-
todo!()
67-
}
6863
}
6964

7065
#[cfg(test)]
@@ -73,8 +68,6 @@ mod tests {
7368

7469
use crate::{dependency_injection::DependenciesBuilder, Configuration};
7570

76-
use super::*;
77-
7871
#[tokio::test]
7972
async fn get_no_certificate() {
8073
// setup
@@ -130,6 +123,14 @@ mod tests {
130123
..beacon.clone()
131124
};
132125
let genesis_certificate = fixture.create_genesis_certificate(&genesis_beacon);
126+
dep_builder
127+
.get_certificate_repository()
128+
.await
129+
.unwrap()
130+
.create_certificate(genesis_certificate.clone())
131+
.await
132+
.unwrap();
133+
let genesis_certificate = fixture.create_genesis_certificate(&beacon);
133134
dep_builder
134135
.get_certificate_repository()
135136
.await
@@ -140,6 +141,8 @@ mod tests {
140141

141142
// test
142143
let certficate_messages = service.get_last_certificates(5).await.unwrap();
144+
145+
assert_eq!(2, certficate_messages.len());
143146
assert_eq!(genesis_certificate.hash, certficate_messages[0].hash);
144147
}
145148
}

0 commit comments

Comments
 (0)