use crate::api::rest::export::export_simulation;
use crate::api::rest::get_favicon;
use crate::api::rest::handlers::{
advance_step, create_session, delete_session, get_current_step, replace_session, update_session,
};
use crate::api::rest::handlers_v2::{
advance_simulation, create_simulation, delete_simulation, get_simulation, json_error_handler,
peek_snapshot,
};
use crate::api::rest::middleware::metrics_endpoint;
use crate::api::rest::swagger::ApiDoc;
use crate::infrastructure::{MetricsCollector, MongoDBRepository, SimulationSnapshotRepository};
use crate::session::{SessionManager, SimulationManager};
use actix_web::web;
use std::sync::Arc;
use utoipa::OpenApi;
use utoipa_swagger_ui::SwaggerUi;
pub fn configure_routes(
cfg: &mut web::ServiceConfig,
session_manager: Arc<SessionManager>,
simulation_manager: Arc<SimulationManager>,
metrics_collector: Arc<MetricsCollector>,
mongodb_repo: Arc<MongoDBRepository>,
) {
let snapshots = simulation_manager.warehouse();
configure_v2_routes(cfg, simulation_manager, snapshots);
cfg.app_data(web::Data::new(session_manager))
.app_data(web::Data::new(metrics_collector.clone()))
.app_data(web::Data::new(mongodb_repo))
.service(
web::resource("/api/v1/chain")
.route(web::post().to(create_session))
.route(web::get().to(get_current_step))
.route(web::put().to(replace_session))
.route(web::patch().to(update_session))
.route(web::delete().to(delete_session)),
)
.service(web::resource("/api/v1/chain/step").route(web::post().to(advance_step)))
.route("/metrics", web::get().to(metrics_endpoint))
.route("/favicon.ico", web::get().to(get_favicon))
.service(
SwaggerUi::new("/swagger-ui/{_:.*}").url("/api-docs/openapi.json", ApiDoc::openapi()),
);
}
pub(crate) fn configure_v2_routes(
cfg: &mut web::ServiceConfig,
simulation_manager: Arc<SimulationManager>,
snapshots: Option<Arc<dyn SimulationSnapshotRepository>>,
) {
if let Some(snapshots) = snapshots {
cfg.app_data(web::Data::new(snapshots));
}
cfg.app_data(web::Data::new(simulation_manager))
.app_data(web::JsonConfig::default().error_handler(json_error_handler))
.service(web::resource("/api/v2/simulations").route(web::post().to(create_simulation)))
.service(
web::resource("/api/v2/simulations/{id}")
.route(web::get().to(get_simulation))
.route(web::delete().to(delete_simulation)),
)
.service(
web::resource("/api/v2/simulations/{id}/snapshot").route(web::get().to(peek_snapshot)),
)
.service(
web::resource("/api/v2/simulations/{id}/step")
.route(web::post().to(advance_simulation)),
)
.service(
web::resource("/api/v2/simulations/{id}/export")
.route(web::get().to(export_simulation)),
);
}