use super::handlers::{ get_mentor_availability, get_mentor_sessions, get_mentor_stats, get_my_sessions, post_book_session, post_submit_feedback, put_update_session_status, }; use crate::sessions::application::SessionServiceImpl; use crate::sessions::domain::SessionService; use crate::sessions::infrastructure::persistence::PostgresSessionRepository; use axum::{ Extension, Router, routing::{get, post, put}, }; use imphnen_libs::AppState; use sea_orm::DatabaseConnection; use std::sync::Arc; fn build_service(db: DatabaseConnection) -> Arc { let db_arc = Arc::new(db); let repo = Arc::new(PostgresSessionRepository::new(Arc::clone(&db_arc))); Arc::new(SessionServiceImpl::new(repo, db_arc)) } pub fn sessions_public_routes(db: DatabaseConnection) -> Router { let service = build_service(db); Router::new() .route("/mentors/{id}/availability", get(get_mentor_availability)) .route("/mentors/{id}/stats", get(get_mentor_stats)) .layer(Extension(service)) } pub fn sessions_protected_routes( db: DatabaseConnection, state: Arc, ) -> Router { let service = build_service(db); Router::new() .route("/mentors/{id}/sessions/create", post(post_book_session)) .route("/mentors/{id}/sessions", get(get_mentor_sessions)) .route( "/sessions/update/{id}/status", put(put_update_session_status), ) .route("/sessions/{id}/feedback/create", post(post_submit_feedback)) .route("/sessions/me", get(get_my_sessions)) .layer(Extension(service)) .layer(Extension((*state).clone())) }