Skip to content

Commit

Permalink
feat(cat-data-service): More wip initial poem integration work
Browse files Browse the repository at this point in the history
  • Loading branch information
stevenj committed Aug 30, 2023
1 parent ba21941 commit 643ac1b
Show file tree
Hide file tree
Showing 20 changed files with 526 additions and 52 deletions.
55 changes: 46 additions & 9 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 7 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,10 @@ warp-reverse-proxy = { version = "0.3", default-features = false, features = ["r
once_cell = "1"

# Use this for Blake2
cryptoxide = "0.4.4"
cryptoxide = "0.4.4"

lazy_static = "1.4"

url = "2.4.1"

dotenvy = "0.15"
24 changes: 20 additions & 4 deletions src/cat-data-service/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ event-db = { path = "../event-db" }

clap = { workspace = true }
tracing = { workspace = true }
tracing-subscriber = { workspace = true, features = ["fmt", "json"]}
tracing-subscriber = { workspace = true, features = ["fmt", "json"] }

serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0" }
Expand All @@ -24,18 +24,26 @@ metrics-exporter-prometheus = { version = "0.12.1" }

tower-http = { version = "0.4", features = ["cors"] }

rust_decimal = { workspace = true }
rust_decimal = { workspace = true }

chrono = { workspace = true }

jormungandr-lib = { workspace = true, optional = true }
chain-impl-mockchain = { workspace = true, optional = true }

poem = { version = "1.3.57", features = ["opentelemetry", "prometheus"] }
poem-openapi = { version = "3.0.3", features = ["openapi-explorer", "rapidoc", "redoc", "swagger-ui"] }
poem-openapi = { version = "3.0.3", features = [
"openapi-explorer",
"rapidoc",
"redoc",
"swagger-ui",
"uuid",
"url",
] }
poem-extensions = { version = "0.7.2" }

# Metrics - Poem
opentelemetry-prometheus = { version = "0.13"}
opentelemetry-prometheus = { version = "0.13" }
opentelemetry = { workspace = true }

once_cell = { workspace = true }
Expand All @@ -44,6 +52,14 @@ cryptoxide = { workspace = true }

uuid = { workspace = true }

lazy_static = { workspace = true }

url = { workspace = true }

dotenvy = { workspace = true }

panic-message = "0.3"

[dev-dependencies]
tower = { version = "0.4", features = ["util"] }
quickcheck = { version = "0.9" }
Expand Down
Empty file.
41 changes: 41 additions & 0 deletions src/cat-data-service/src/service/api/health/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//mod live_get;
//mod ready_get;

use crate::service::generic::responses::resp_5xx::ServiceUnavailable;
use crate::service::generic::responses::{resp_2xx::NoContent, resp_5xx::ServerError};

use poem_openapi::OpenApi;

use poem_extensions::{
response,
UniResponse::{T204, T503},
};

pub(crate) struct HealthApi;

#[OpenApi]
impl HealthApi {
#[oai(path = "/health/ready", method = "get")]
async fn health_get(
&self,
) -> response! {
204: NoContent,
500: ServerError,
503: ServiceUnavailable,
} {
T204(NoContent)
}

#[oai(path = "/health/live", method = "get")]
async fn live_get(
&self,
) -> response! {
204: NoContent,
500: ServerError,
503: ServiceUnavailable,
} {
// Return No Content unless any endpoint panics.
// If there are x panics in a time frame, say the service is unavailable to force a restart.
T503(ServiceUnavailable)
}
}
1 change: 1 addition & 0 deletions src/cat-data-service/src/service/api/health/ready_get.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
//pub fn endpoint() ->
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@
//!
//! This defines all endpoints for the Catalyst Data Service API.
//! It however does NOT contain any processing for them, that is defined elsewhere.
use poem::Route;
use health::HealthApi;
use poem_openapi::{param::Query, payload::PlainText, OpenApi, OpenApiService};
use std::net::SocketAddr;

pub struct Api;
mod health;

pub(crate) type OpenApiServiceT = OpenApiService<(Api, HealthApi), ()>;

pub(crate) struct Api;

#[OpenApi]
impl Api {
Expand All @@ -22,9 +26,9 @@ impl Api {
}
}

pub(crate) fn mk_api(addr: &SocketAddr) -> OpenApiService<Api, ()> {
pub(crate) fn mk_api(addr: &SocketAddr) -> OpenApiServiceT {
// This should be the actual hostname of the service. But in the absence of that, the IP address/port will do.
let server_host = format!("http://{}:{}/api", addr.ip(), addr.port());

OpenApiService::new(Api, "Hello World 2", "1.0").server(server_host)
OpenApiService::new((Api, HealthApi), "Catalyst Data Service", "1.2").server(server_host)
}
5 changes: 2 additions & 3 deletions src/cat-data-service/src/service/docs/mod.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
mod stoplight_elements;
use poem::{get, Route};
use poem_openapi::OpenApiService;

use super::api::Api;
use super::api::OpenApiServiceT;

pub(crate) fn docs(api_service: &OpenApiService<Api,()>) -> Route {
pub(crate) fn docs(api_service: &OpenApiServiceT) -> Route {
let spec = api_service.spec();

let swagger_ui = api_service.swagger_ui();
Expand Down
4 changes: 4 additions & 0 deletions src/cat-data-service/src/service/generic/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
//! Define generic reusable api components here.
//! these components should be structured into their own sub modules.
//!
pub(crate) mod responses;
1 change: 1 addition & 0 deletions src/cat-data-service/src/service/generic/objects/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
//! This module contains generic re-usable objects.
6 changes: 6 additions & 0 deletions src/cat-data-service/src/service/generic/responses/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
//! Generic Responses are all contained in their own modules, grouped by response codes.
//!

pub(crate) mod resp_2xx;
pub(crate) mod resp_4xx;
pub(crate) mod resp_5xx;
12 changes: 12 additions & 0 deletions src/cat-data-service/src/service/generic/responses/resp_2xx.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//! This module contains generic re-usable responses with a 2xx response code.
//!

use poem_extensions::OneResponse;

#[derive(OneResponse)]
#[oai(status = 200)]
pub(crate) struct EmptyOK;

#[derive(OneResponse)]
#[oai(status = 204)]
pub(crate) struct NoContent;
37 changes: 37 additions & 0 deletions src/cat-data-service/src/service/generic/responses/resp_4xx.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//! This module contains generic re-usable responses with a 4xx response code.
//!

use poem::IntoResponse;
use poem_extensions::OneResponse;
use poem_openapi::payload::Payload;

#[derive(OneResponse)]
#[oai(status = 400)]
pub(crate) struct BadRequest<T: IntoResponse + Payload>(T);

#[derive(OneResponse)]
#[oai(status = 401)]
pub(crate) struct Unauthorized;

#[derive(OneResponse)]
#[oai(status = 403)]
pub(crate) struct Forbidden;

#[derive(OneResponse)]
#[oai(status = 404)]
pub(crate) struct NotFound;

#[derive(OneResponse)]
#[oai(status = 405)]
pub(crate) struct MethodNotAllowed;

#[derive(OneResponse)]
#[oai(status = 406)]
pub(crate) struct NotAcceptable;

#[derive(OneResponse)]
#[oai(status = 422)]
/// Common automatically produced validation error for every endpoint.
/// Is generated automatically when any of the OpenAPI validation rules fail.
/// Can also be generated manually.
pub(crate) struct ValidationError;
Loading

0 comments on commit 643ac1b

Please sign in to comment.