koprogo_api/infrastructure/web/handlers/
seed_handlers.rs

1use crate::infrastructure::database::DatabaseSeeder;
2use crate::infrastructure::web::AppState;
3use actix_web::{post, web, HttpRequest, HttpResponse, Responder};
4
5/// Seed demo data (SuperAdmin only)
6#[post("/seed/demo")]
7pub async fn seed_demo_data(data: web::Data<AppState>, req: HttpRequest) -> impl Responder {
8    // Extract and verify token
9    let auth_header = match req.headers().get("Authorization") {
10        Some(header) => match header.to_str() {
11            Ok(s) => s,
12            Err(_) => {
13                return HttpResponse::BadRequest().json(serde_json::json!({
14                    "error": "Invalid authorization header"
15                }))
16            }
17        },
18        None => {
19            return HttpResponse::Unauthorized().json(serde_json::json!({
20                "error": "Missing authorization header"
21            }))
22        }
23    };
24
25    let token = auth_header.trim_start_matches("Bearer ").trim();
26
27    // Verify token and check role
28    match data.auth_use_cases.verify_token(token) {
29        Ok(claims) => {
30            // Only SuperAdmin can seed data
31            if claims.role != "superadmin" {
32                return HttpResponse::Forbidden().json(serde_json::json!({
33                    "error": "Only SuperAdmin can seed demo data"
34                }));
35            }
36
37            // Create seeder
38            let seeder = DatabaseSeeder::new(data.pool.clone());
39
40            // Seed demo data
41            match seeder.seed_demo_data().await {
42                Ok(message) => HttpResponse::Ok().json(serde_json::json!({
43                    "success": true,
44                    "message": message
45                })),
46                Err(e) => HttpResponse::BadRequest().json(serde_json::json!({
47                    "error": e
48                })),
49            }
50        }
51        Err(e) => HttpResponse::Unauthorized().json(serde_json::json!({
52            "error": e
53        })),
54    }
55}
56
57/// Clear demo data (SuperAdmin only)
58#[post("/seed/clear")]
59pub async fn clear_demo_data(data: web::Data<AppState>, req: HttpRequest) -> impl Responder {
60    let auth_header = match req.headers().get("Authorization") {
61        Some(header) => match header.to_str() {
62            Ok(s) => s,
63            Err(_) => {
64                return HttpResponse::BadRequest().json(serde_json::json!({
65                    "error": "Invalid authorization header"
66                }))
67            }
68        },
69        None => {
70            return HttpResponse::Unauthorized().json(serde_json::json!({
71                "error": "Missing authorization header"
72            }))
73        }
74    };
75
76    let token = auth_header.trim_start_matches("Bearer ").trim();
77
78    match data.auth_use_cases.verify_token(token) {
79        Ok(claims) => {
80            if claims.role != "superadmin" {
81                return HttpResponse::Forbidden().json(serde_json::json!({
82                    "error": "Only SuperAdmin can clear demo data"
83                }));
84            }
85
86            let seeder = DatabaseSeeder::new(data.pool.clone());
87
88            match seeder.clear_demo_data().await {
89                Ok(message) => HttpResponse::Ok().json(serde_json::json!({
90                    "success": true,
91                    "message": message
92                })),
93                Err(e) => HttpResponse::BadRequest().json(serde_json::json!({
94                    "error": e
95                })),
96            }
97        }
98        Err(e) => HttpResponse::Unauthorized().json(serde_json::json!({
99            "error": e
100        })),
101    }
102}
103
104// NOTE: Realistic seed disabled - we only use ONE seed (demo)
105// The demo seed is comprehensive enough for all testing purposes
106// Kept commented for reference if needed in the future
107
108// /// Seed realistic data for load testing (SuperAdmin only)
109// #[post("/seed/realistic")]
110// pub async fn seed_realistic_data(data: web::Data<AppState>, req: HttpRequest) -> impl Responder {
111//     let auth_header = match req.headers().get("Authorization") {
112//         Some(header) => match header.to_str() {
113//             Ok(s) => s,
114//             Err(_) => {
115//                 return HttpResponse::BadRequest().json(serde_json::json!({
116//                     "error": "Invalid authorization header"
117//                 }))
118//             }
119//         },
120//         None => {
121//             return HttpResponse::Unauthorized().json(serde_json::json!({
122//                 "error": "Missing authorization header"
123//             }))
124//         }
125//     };
126//
127//     let token = auth_header.trim_start_matches("Bearer ").trim();
128//
129//     match data.auth_use_cases.verify_token(token) {
130//         Ok(claims) => {
131//             if claims.role != "superadmin" {
132//                 return HttpResponse::Forbidden().json(serde_json::json!({
133//                     "error": "Only SuperAdmin can seed realistic data"
134//                 }));
135//             }
136//
137//             let seeder = DatabaseSeeder::new(data.pool.clone());
138//
139//             match seeder.seed_realistic_data().await {
140//                 Ok(message) => HttpResponse::Ok().json(serde_json::json!({
141//                     "success": true,
142//                     "message": message
143//                 })),
144//                 Err(e) => HttpResponse::BadRequest().json(serde_json::json!({
145//                     "error": e
146//                 })),
147//             }
148//         }
149//         Err(e) => HttpResponse::Unauthorized().json(serde_json::json!({
150//             "error": e
151//         })),
152//     }
153// }