use actix_web::web; use actix_session::{SessionMiddleware, storage::CookieSessionStore}; use crate::controllers::home::HomeController; use crate::controllers::auth::AuthController; use crate::controllers::ticket::TicketController; use crate::controllers::calendar::CalendarController; use crate::controllers::governance::GovernanceController; use crate::controllers::flow::FlowController; use crate::controllers::contract::ContractController; use crate::middleware::JwtAuth; use crate::SESSION_KEY; /// Configures all application routes pub fn configure_routes(cfg: &mut web::ServiceConfig) { // Configure session middleware with the consistent key let session_middleware = SessionMiddleware::builder( CookieSessionStore::default(), SESSION_KEY.clone() ) .cookie_secure(false) // Set to true in production with HTTPS .build(); // Public routes that don't require authentication cfg.service( web::scope("") .wrap(session_middleware) // Home routes .route("/", web::get().to(HomeController::index)) .route("/about", web::get().to(HomeController::about)) .route("/contact", web::get().to(HomeController::contact)) .route("/contact", web::post().to(HomeController::submit_contact)) // Auth routes .route("/login", web::get().to(AuthController::login_page)) .route("/login", web::post().to(AuthController::login)) .route("/register", web::get().to(AuthController::register_page)) .route("/register", web::post().to(AuthController::register)) .route("/logout", web::get().to(AuthController::logout)) // Protected routes that require authentication // These routes will be protected by the JwtAuth middleware in the main.rs file .route("/editor", web::get().to(HomeController::editor)) // Ticket routes .route("/tickets", web::get().to(TicketController::list_tickets)) .route("/tickets/new", web::get().to(TicketController::new_ticket)) .route("/tickets", web::post().to(TicketController::create_ticket)) .route("/tickets/{id}", web::get().to(TicketController::show_ticket)) .route("/tickets/{id}/comment", web::post().to(TicketController::add_comment)) .route("/tickets/{id}/status/{status}", web::post().to(TicketController::update_status)) .route("/my-tickets", web::get().to(TicketController::my_tickets)) // Calendar routes .route("/calendar", web::get().to(CalendarController::calendar)) .route("/calendar/events/new", web::get().to(CalendarController::new_event)) .route("/calendar/events", web::post().to(CalendarController::create_event)) .route("/calendar/events/{id}/delete", web::post().to(CalendarController::delete_event)) // Governance routes .route("/governance", web::get().to(GovernanceController::index)) .route("/governance/proposals", web::get().to(GovernanceController::proposals)) .route("/governance/proposals/{id}", web::get().to(GovernanceController::proposal_detail)) .route("/governance/proposals/{id}/vote", web::post().to(GovernanceController::submit_vote)) .route("/governance/create-proposal", web::get().to(GovernanceController::create_proposal_form)) .route("/governance/create-proposal", web::post().to(GovernanceController::submit_proposal)) .route("/governance/my-votes", web::get().to(GovernanceController::my_votes)) // Flow routes .service( web::scope("/flows") .route("", web::get().to(FlowController::index)) .route("/list", web::get().to(FlowController::list_flows)) .route("/{id}", web::get().to(FlowController::flow_detail)) .route("/{id}/advance", web::post().to(FlowController::advance_flow_step)) .route("/{id}/stuck", web::post().to(FlowController::mark_flow_step_stuck)) .route("/{id}/step/{step_id}/log", web::post().to(FlowController::add_log_to_flow_step)) .route("/create", web::get().to(FlowController::create_flow_form)) .route("/create", web::post().to(FlowController::create_flow)) .route("/my-flows", web::get().to(FlowController::my_flows)) ) // Contract routes .service( web::scope("/contracts") .route("", web::get().to(ContractController::index)) .route("/list", web::get().to(ContractController::list)) .route("/my", web::get().to(ContractController::my_contracts)) .route("/{id}", web::get().to(ContractController::detail)) .route("/create", web::get().to(ContractController::create_form)) .route("/create", web::post().to(ContractController::create)) ) ); // Keep the /protected scope for any future routes that should be under that path cfg.service( web::scope("/protected") .wrap(JwtAuth) // Apply JWT authentication middleware ); }