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