PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::web::rest_server Class Reference

REST API server for PACS administration and monitoring. More...

#include <rest_server.h>

Collaboration diagram for kcenon::pacs::web::rest_server:
Collaboration graph

Classes

struct  impl
 Implementation details for rest_server. More...
 

Public Member Functions

 rest_server ()
 Construct REST server with default configuration.
 
 rest_server (const rest_server_config &config)
 Construct REST server with custom configuration.
 
 ~rest_server ()
 Destructor - stops server if running.
 
 rest_server (const rest_server &)=delete
 Non-copyable.
 
rest_serveroperator= (const rest_server &)=delete
 
 rest_server (rest_server &&other) noexcept
 Movable.
 
rest_serveroperator= (rest_server &&other) noexcept
 
const rest_server_configconfig () const noexcept
 Get current configuration.
 
void set_config (const rest_server_config &config)
 Update configuration (requires restart to apply)
 
void set_health_checker (std::shared_ptr< monitoring::health_checker > checker)
 Set health checker for /api/v1/system/status endpoint.
 
void set_metrics_provider (std::shared_ptr< monitoring::pacs_metrics > metrics)
 Set metrics provider for /api/v1/system/metrics endpoint.
 
void set_access_control_manager (std::shared_ptr< security::access_control_manager > manager)
 Set access control manager for security.
 
void set_database (std::shared_ptr< storage::index_database > database)
 Set index database for patient/study/series endpoints.
 
void set_file_storage (std::shared_ptr< storage::file_storage > storage)
 Set file storage for DICOM instance persistence (STOW-RS)
 
void set_node_manager (std::shared_ptr< client::remote_node_manager > manager)
 Set remote node manager for remote PACS node management.
 
void set_job_manager (std::shared_ptr< client::job_manager > manager)
 Set job manager for async DICOM operations.
 
void set_routing_manager (std::shared_ptr< client::routing_manager > manager)
 Set routing manager for auto-forwarding rules.
 
void set_dicom_server (std::shared_ptr< network::dicom_server > server)
 Set DICOM server for live association management.
 
void set_oauth2_middleware (std::shared_ptr< auth::oauth2_middleware > middleware)
 Set OAuth 2.0 middleware for DICOMweb endpoint authorization.
 
void start ()
 Start the server (blocking)
 
void start_async ()
 Start the server (non-blocking)
 
void stop ()
 Stop the server.
 
bool is_running () const noexcept
 Check if server is currently running.
 
void wait ()
 Wait for server to stop.
 
std::uint16_t port () const noexcept
 Get the actual port the server is listening on.
 

Private Attributes

std::unique_ptr< implimpl_
 

Detailed Description

REST API server for PACS administration and monitoring.

The rest_server class provides a REST API for:

  • System health status and metrics
  • Configuration management
  • Future: Patient/Study browsing, Worklist management
Example
config.port = 8080;
server.set_health_checker(health_checker_instance);
server.set_metrics_provider(metrics_instance);
server.start_async(); // Non-blocking
// ... do other work ...
server.stop();
REST API server for PACS administration and monitoring.
Definition rest_server.h:85
const rest_server_config & config() const noexcept
Get current configuration.
REST API server for PACS administration.
Configuration options for the REST server.
Definition rest_config.h:29
std::uint16_t port
Port to listen on.
Definition rest_config.h:34
std::size_t concurrency
Number of worker threads for handling requests.
Definition rest_config.h:37

Definition at line 85 of file rest_server.h.

Constructor & Destructor Documentation

◆ rest_server() [1/4]

kcenon::pacs::web::rest_server::rest_server ( )

Construct REST server with default configuration.

Definition at line 120 of file rest_server.cpp.

120: impl_(std::make_unique<impl>()) {}
std::unique_ptr< impl > impl_

◆ rest_server() [2/4]

kcenon::pacs::web::rest_server::rest_server ( const rest_server_config & config)
explicit

Construct REST server with custom configuration.

Parameters
configServer configuration

Definition at line 122 of file rest_server.cpp.

123 : impl_(std::make_unique<impl>(config)) {}

◆ ~rest_server()

kcenon::pacs::web::rest_server::~rest_server ( )

Destructor - stops server if running.

Definition at line 125 of file rest_server.cpp.

125{ stop(); }
void stop()
Stop the server.

References stop().

Here is the call graph for this function:

◆ rest_server() [3/4]

kcenon::pacs::web::rest_server::rest_server ( const rest_server & )
delete

Non-copyable.

◆ rest_server() [4/4]

kcenon::pacs::web::rest_server::rest_server ( rest_server && other)
defaultnoexcept

Movable.

Member Function Documentation

◆ config()

const rest_server_config & kcenon::pacs::web::rest_server::config ( ) const
nodiscardnoexcept

Get current configuration.

Returns
Current server configuration

Definition at line 130 of file rest_server.cpp.

130 {
131 return impl_->config;
132}

References kcenon::pacs::web::rest_server::impl::config, and impl_.

Referenced by set_config().

Here is the caller graph for this function:

◆ is_running()

bool kcenon::pacs::web::rest_server::is_running ( ) const
nodiscardnoexcept

Check if server is currently running.

Returns
true if server is running

Definition at line 317 of file rest_server.cpp.

317{ return impl_->running; }

References impl_, and kcenon::pacs::web::rest_server::impl::running.

◆ operator=() [1/2]

rest_server & kcenon::pacs::web::rest_server::operator= ( const rest_server & )
delete

◆ operator=() [2/2]

rest_server & kcenon::pacs::web::rest_server::operator= ( rest_server && other)
defaultnoexcept

◆ port()

std::uint16_t kcenon::pacs::web::rest_server::port ( ) const
nodiscardnoexcept

Get the actual port the server is listening on.

Returns
Port number, or 0 if not running

Definition at line 325 of file rest_server.cpp.

325 {
326 return impl_->running ? impl_->config.port : 0;
327}

References kcenon::pacs::web::rest_server::impl::config, impl_, kcenon::pacs::web::rest_server_config::port, and kcenon::pacs::web::rest_server::impl::running.

◆ set_access_control_manager()

void kcenon::pacs::web::rest_server::set_access_control_manager ( std::shared_ptr< security::access_control_manager > manager)

Set access control manager for security.

Parameters
managerAccess control manager instance

Definition at line 152 of file rest_server.cpp.

153 {
154 std::lock_guard<std::mutex> lock(impl_->mutex);
155 impl_->context->security_manager = std::move(manager);
156}
std::shared_ptr< rest_server_context > context

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ set_config()

void kcenon::pacs::web::rest_server::set_config ( const rest_server_config & config)

Update configuration (requires restart to apply)

Parameters
configNew configuration

Definition at line 134 of file rest_server.cpp.

134 {
135 std::lock_guard<std::mutex> lock(impl_->mutex);
137 impl_->context->config = &impl_->config;
138}

References config(), kcenon::pacs::web::rest_server::impl::config, kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

Here is the call graph for this function:

◆ set_database()

void kcenon::pacs::web::rest_server::set_database ( std::shared_ptr< storage::index_database > database)

Set index database for patient/study/series endpoints.

Parameters
databaseIndex database instance

Definition at line 158 of file rest_server.cpp.

159 {
160 std::lock_guard<std::mutex> lock(impl_->mutex);
161 impl_->context->database = std::move(database);
162}

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ set_dicom_server()

void kcenon::pacs::web::rest_server::set_dicom_server ( std::shared_ptr< network::dicom_server > server)

Set DICOM server for live association management.

Parameters
serverDICOM server instance

Definition at line 188 of file rest_server.cpp.

189 {
190 std::lock_guard<std::mutex> lock(impl_->mutex);
191 impl_->context->dicom_server = std::move(server);
192}

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ set_file_storage()

void kcenon::pacs::web::rest_server::set_file_storage ( std::shared_ptr< storage::file_storage > storage)

Set file storage for DICOM instance persistence (STOW-RS)

Parameters
storageFile storage instance

Definition at line 164 of file rest_server.cpp.

165 {
166 std::lock_guard<std::mutex> lock(impl_->mutex);
167 impl_->context->file_storage = std::move(storage);
168}

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ set_health_checker()

void kcenon::pacs::web::rest_server::set_health_checker ( std::shared_ptr< monitoring::health_checker > checker)

Set health checker for /api/v1/system/status endpoint.

Parameters
checkerHealth checker instance

Definition at line 140 of file rest_server.cpp.

141 {
142 std::lock_guard<std::mutex> lock(impl_->mutex);
143 impl_->context->health_checker = std::move(checker);
144}

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ set_job_manager()

void kcenon::pacs::web::rest_server::set_job_manager ( std::shared_ptr< client::job_manager > manager)

Set job manager for async DICOM operations.

Parameters
managerJob manager instance

Definition at line 176 of file rest_server.cpp.

177 {
178 std::lock_guard<std::mutex> lock(impl_->mutex);
179 impl_->context->job_manager = std::move(manager);
180}

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ set_metrics_provider()

void kcenon::pacs::web::rest_server::set_metrics_provider ( std::shared_ptr< monitoring::pacs_metrics > metrics)

Set metrics provider for /api/v1/system/metrics endpoint.

Parameters
metricsMetrics instance

Set metrics provider for /api/v1/system/metrics endpoint

Parameters
metricsMetrics instance

Definition at line 146 of file rest_server.cpp.

147 {
148 std::lock_guard<std::mutex> lock(impl_->mutex);
149 impl_->context->metrics = std::move(metrics);
150}

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ set_node_manager()

void kcenon::pacs::web::rest_server::set_node_manager ( std::shared_ptr< client::remote_node_manager > manager)

Set remote node manager for remote PACS node management.

Parameters
managerRemote node manager instance

Definition at line 170 of file rest_server.cpp.

171 {
172 std::lock_guard<std::mutex> lock(impl_->mutex);
173 impl_->context->node_manager = std::move(manager);
174}

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ set_oauth2_middleware()

void kcenon::pacs::web::rest_server::set_oauth2_middleware ( std::shared_ptr< auth::oauth2_middleware > middleware)

Set OAuth 2.0 middleware for DICOMweb endpoint authorization.

Parameters
middlewareOAuth 2.0 middleware instance

Definition at line 194 of file rest_server.cpp.

195 {
196 std::lock_guard<std::mutex> lock(impl_->mutex);
197 impl_->context->oauth2 = std::move(middleware);
198}

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ set_routing_manager()

void kcenon::pacs::web::rest_server::set_routing_manager ( std::shared_ptr< client::routing_manager > manager)

Set routing manager for auto-forwarding rules.

Parameters
managerRouting manager instance

Definition at line 182 of file rest_server.cpp.

183 {
184 std::lock_guard<std::mutex> lock(impl_->mutex);
185 impl_->context->routing_manager = std::move(manager);
186}

References kcenon::pacs::web::rest_server::impl::context, impl_, and kcenon::pacs::web::rest_server::impl::mutex.

◆ start()

void kcenon::pacs::web::rest_server::start ( )

Start the server (blocking)

This method blocks until stop() is called from another thread.

Definition at line 200 of file rest_server.cpp.

200 {
201 if (impl_->running.exchange(true)) {
202 return; // Already running
203 }
204
205 impl_->app = std::make_unique<crow::SimpleApp>();
206 auto &app = *impl_->app;
207
208 // Register system endpoints
210
211 // Add CORS preflight handler
212 if (impl_->config.enable_cors) {
213 CROW_ROUTE(app, "/api/<path>")
214 .methods(crow::HTTPMethod::OPTIONS)(
215 [this](const crow::request & /*req*/,
216 const std::string & /*path*/) {
217 crow::response res(204);
218 res.add_header("Access-Control-Allow-Origin",
220 res.add_header("Access-Control-Allow-Methods",
221 "GET, POST, PUT, DELETE, OPTIONS");
222 res.add_header("Access-Control-Allow-Headers",
223 "Content-Type, Authorization");
224 res.add_header("Access-Control-Max-Age", "86400");
225 return res;
226 });
227 }
228
229 // Start server
230 app.bindaddr(impl_->config.bind_address)
231 .port(impl_->config.port)
232 .concurrency(static_cast<uint16_t>(impl_->config.concurrency))
233 .run();
234
235 impl_->running = false;
236}
void register_system_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
std::unique_ptr< crow::SimpleApp > app
std::string cors_allowed_origins
CORS allowed origins (empty = allow all)
Definition rest_config.h:43
std::string bind_address
Address to bind the server to.
Definition rest_config.h:31
bool enable_cors
Enable CORS (Cross-Origin Resource Sharing) headers.
Definition rest_config.h:40

References kcenon::pacs::web::rest_server::impl::app, kcenon::pacs::web::rest_server_config::bind_address, kcenon::pacs::web::rest_server_config::concurrency, kcenon::pacs::web::rest_server::impl::config, kcenon::pacs::web::rest_server::impl::context, kcenon::pacs::web::rest_server_config::cors_allowed_origins, kcenon::pacs::web::rest_server_config::enable_cors, impl_, kcenon::pacs::web::rest_server_config::port, kcenon::pacs::web::endpoints::register_system_endpoints_impl(), and kcenon::pacs::web::rest_server::impl::running.

Here is the call graph for this function:

◆ start_async()

void kcenon::pacs::web::rest_server::start_async ( )

Start the server (non-blocking)

Starts the server in a background thread and returns immediately.

Definition at line 238 of file rest_server.cpp.

238 {
239 if (impl_->running.exchange(true)) {
240 return; // Already running
241 }
242
243 impl_->server_thread = std::thread([this]() {
244 impl_->app = std::make_unique<crow::SimpleApp>();
245 auto &app = *impl_->app;
246
247 // Register endpoints
268
269#ifdef PACS_WITH_DATABASE_SYSTEM
270 endpoints::register_metrics_endpoints_impl(app, impl_->context);
271#endif
272
273 // Add CORS preflight handler
274 if (impl_->config.enable_cors) {
275 CROW_ROUTE(app, "/api/<path>")
276 .methods(crow::HTTPMethod::OPTIONS)(
277 [this](const crow::request & /*req*/,
278 const std::string & /*path*/) {
279 crow::response res(204);
280 res.add_header("Access-Control-Allow-Origin",
282 res.add_header("Access-Control-Allow-Methods",
283 "GET, POST, PUT, DELETE, OPTIONS");
284 res.add_header("Access-Control-Allow-Headers",
285 "Content-Type, Authorization");
286 res.add_header("Access-Control-Max-Age", "86400");
287 return res;
288 });
289 }
290
291 // Start server
292 app.bindaddr(impl_->config.bind_address)
293 .port(impl_->config.port)
294 .concurrency(static_cast<uint16_t>(impl_->config.concurrency))
295 .run();
296
297 impl_->running = false;
298 });
299}
void register_storage_commitment_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_measurement_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_security_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
Register security endpoints with the Crow app.
void register_metadata_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_key_image_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_audit_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_worklist_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_series_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_remote_nodes_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_viewer_state_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_wado_uri_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_routing_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_patient_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_dicomweb_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_association_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_study_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_jobs_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_annotation_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)
void register_thumbnail_endpoints_impl(crow::SimpleApp &app, std::shared_ptr< rest_server_context > ctx)

References kcenon::pacs::web::rest_server::impl::app, kcenon::pacs::web::rest_server_config::bind_address, kcenon::pacs::web::rest_server_config::concurrency, kcenon::pacs::web::rest_server::impl::config, kcenon::pacs::web::rest_server::impl::context, kcenon::pacs::web::rest_server_config::cors_allowed_origins, kcenon::pacs::web::rest_server_config::enable_cors, impl_, kcenon::pacs::web::rest_server_config::port, kcenon::pacs::web::endpoints::register_annotation_endpoints_impl(), kcenon::pacs::web::endpoints::register_association_endpoints_impl(), kcenon::pacs::web::endpoints::register_audit_endpoints_impl(), kcenon::pacs::web::endpoints::register_dicomweb_endpoints_impl(), kcenon::pacs::web::endpoints::register_jobs_endpoints_impl(), kcenon::pacs::web::endpoints::register_key_image_endpoints_impl(), kcenon::pacs::web::endpoints::register_measurement_endpoints_impl(), kcenon::pacs::web::endpoints::register_metadata_endpoints_impl(), kcenon::pacs::web::endpoints::register_patient_endpoints_impl(), kcenon::pacs::web::endpoints::register_remote_nodes_endpoints_impl(), kcenon::pacs::web::endpoints::register_routing_endpoints_impl(), kcenon::pacs::web::endpoints::register_security_endpoints_impl(), kcenon::pacs::web::endpoints::register_series_endpoints_impl(), kcenon::pacs::web::endpoints::register_storage_commitment_endpoints_impl(), kcenon::pacs::web::endpoints::register_study_endpoints_impl(), kcenon::pacs::web::endpoints::register_system_endpoints_impl(), kcenon::pacs::web::endpoints::register_thumbnail_endpoints_impl(), kcenon::pacs::web::endpoints::register_viewer_state_endpoints_impl(), kcenon::pacs::web::endpoints::register_wado_uri_endpoints_impl(), kcenon::pacs::web::endpoints::register_worklist_endpoints_impl(), kcenon::pacs::web::rest_server::impl::running, and kcenon::pacs::web::rest_server::impl::server_thread.

Here is the call graph for this function:

◆ stop()

void kcenon::pacs::web::rest_server::stop ( )

Stop the server.

Gracefully shuts down the server. Safe to call multiple times.

Definition at line 301 of file rest_server.cpp.

301 {
302 if (!impl_->running) {
303 return;
304 }
305
306 if (impl_->app) {
307 impl_->app->stop();
308 }
309
310 if (impl_->server_thread.joinable()) {
311 impl_->server_thread.join();
312 }
313
314 impl_->running = false;
315}

References kcenon::pacs::web::rest_server::impl::app, impl_, kcenon::pacs::web::rest_server::impl::running, and kcenon::pacs::web::rest_server::impl::server_thread.

Referenced by ~rest_server().

Here is the caller graph for this function:

◆ wait()

void kcenon::pacs::web::rest_server::wait ( )

Wait for server to stop.

Blocks until the server has completely stopped. Only valid after start_async() was called.

Definition at line 319 of file rest_server.cpp.

319 {
320 if (impl_->server_thread.joinable()) {
321 impl_->server_thread.join();
322 }
323}

References impl_, and kcenon::pacs::web::rest_server::impl::server_thread.

Member Data Documentation

◆ impl_


The documentation for this class was generated from the following files: