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// }