1pub mod access;
9pub mod config;
10pub mod directory;
11pub mod error;
12pub mod handlers;
13pub mod models;
14pub mod protocol;
15pub mod renderer_ws;
16pub mod store;
17
18use std::sync::Arc;
19
20use access::AccessControl;
21use config::Config;
22use directory::{NoDirectory, RendererDirectory};
23use store::renderers::RendererRegistry;
24
25#[derive(Clone)]
26#[non_exhaustive]
27pub struct AppState {
28 pub config: Arc<Config>,
29 pub renderers: Arc<RendererRegistry>,
30 pub access: Arc<dyn AccessControl>,
31 pub directory: Arc<dyn RendererDirectory>,
32}
33
34impl AppState {
35 pub fn new(
38 config: Arc<Config>,
39 renderers: Arc<RendererRegistry>,
40 access: Arc<dyn AccessControl>,
41 ) -> Self {
42 Self { config, renderers, access, directory: Arc::new(NoDirectory) }
43 }
44
45 pub fn with_directory(mut self, directory: Arc<dyn RendererDirectory>) -> Self {
46 self.directory = directory;
47 self
48 }
49}
50
51pub use axum::Router;
52
53pub const RENDERER_CONNECT_PATH: &str = "/rendererApi/v1/connect";
56
57pub fn build_router(state: AppState) -> Router {
63 use axum::routing::{get, post, put};
64
65 let api = Router::new()
66 .route("/", get(handlers::server_info))
67 .route("/health", get(handlers::health))
68 .route("/graphics", get(handlers::graphics::list_graphics))
69 .route(
70 "/graphics/:id",
71 get(handlers::graphics::get_graphic).delete(handlers::graphics::delete_graphic),
72 )
73 .route(
74 "/graphics/:id/assets/*path",
75 get(handlers::graphics::serve_graphic_asset),
76 )
77 .route(
78 "/graphics/:id/thumbnail",
79 get(handlers::graphics::get_thumbnail),
80 )
81 .route("/renderers", get(handlers::renderers::list_renderers))
82 .route("/renderers/:id", get(handlers::renderers::get_renderer))
83 .route(
84 "/renderers/:id/target",
85 get(handlers::renderers::get_target),
86 )
87 .route(
88 "/renderers/:id/customActions/:action_id",
89 post(handlers::actions::renderer_custom_action),
90 )
91 .route(
92 "/renderers/:id/target/graphicInstance/clear",
93 put(handlers::actions::clear),
94 )
95 .route(
96 "/renderers/:id/target/graphicInstance/load",
97 post(handlers::actions::load),
98 )
99 .route(
100 "/renderers/:id/target/graphicInstance/playAction",
101 post(handlers::actions::play_action),
102 )
103 .route(
104 "/renderers/:id/target/graphicInstance/stopAction",
105 post(handlers::actions::stop_action),
106 )
107 .route(
108 "/renderers/:id/target/graphicInstance/updateAction",
109 post(handlers::actions::update_action),
110 )
111 .route(
112 "/renderers/:id/target/graphicInstance/customActions/:action_id",
113 post(handlers::actions::custom_action),
114 );
115
116 Router::new()
117 .nest("/ograf/v1", api)
118 .route("/ograf/v1/", get(handlers::server_info))
121 .route(
127 RENDERER_CONNECT_PATH,
128 get(handlers::renderers::connect_renderer),
129 )
130 .route(
131 "/serverApi/internal/graphics/:graphic_id/*path",
132 get(handlers::graphics::serve_graphic_asset),
133 )
134 .with_state(state)
135}