cat_gateway/service/
poem_service.rs1use poem::{
6 listener::TcpListener,
7 middleware::{CatchPanic, Compression, Cors, SensitiveHeader},
8 web::CompressionLevel,
9 Endpoint, EndpointExt, Route,
10};
11
12use super::{
13 common::auth::{api_key::API_KEY_HEADER, rbac::scheme::AUTHORIZATION_HEADER},
14 utilities::middleware::{db_check::DatabaseConnectionCheck, node_info::CatGatewayInfo},
15};
16use crate::{
17 service::{
18 api::mk_api,
19 docs::{docs, favicon},
20 utilities::{
21 catch_panic::{set_panic_hook, ServicePanicHandler},
22 middleware::{metrics_updater::MetricsUpdaterMiddleware, tracing_mw::Tracing},
23 },
24 },
25 settings::Settings,
26};
27
28fn mk_app(base_route: Option<Route>) -> impl Endpoint {
30 let base_route = match base_route {
32 Some(route) => route,
33 None => Route::new(),
34 };
35
36 let api_service = mk_api();
37 let docs = docs(&api_service);
38
39 base_route
40 .nest(Settings::api_url_prefix(), api_service)
41 .nest("/docs", docs)
42 .nest("/metrics", MetricsUpdaterMiddleware::new())
43 .nest("/favicon.ico", favicon())
44 .with(Cors::new())
45 .with(Compression::new().with_quality(CompressionLevel::Fastest))
46 .with(CatchPanic::new().with_handler(ServicePanicHandler))
47 .with(Tracing)
48 .with(DatabaseConnectionCheck)
49 .with(CatGatewayInfo)
50 .with(
51 SensitiveHeader::new()
52 .header(API_KEY_HEADER)
53 .header(AUTHORIZATION_HEADER)
54 .request_only(),
55 )
56}
57
58pub(crate) fn get_app_docs() -> String {
60 let api_service = mk_api();
61 api_service.spec()
62}
63
64pub(crate) async fn run() -> anyhow::Result<()> {
78 tracing::info!(
80 ServiceAddr = Settings::bound_address().to_string(),
81 "Starting Cat-Gateway API Service ..."
82 );
83
84 set_panic_hook();
89
90 let app = mk_app(None);
91
92 Ok(
93 poem::Server::new(TcpListener::bind(Settings::bound_address()))
94 .run(app)
95 .await?,
96 )
97}
98
99#[cfg(test)]
100pub(crate) mod tests {
101 }