koprogo_api/infrastructure/web/handlers/
seed_handlers.rs1use crate::infrastructure::database::DatabaseSeeder;
2use crate::infrastructure::web::AppState;
3use actix_web::{post, web, HttpRequest, HttpResponse, Responder};
4
5#[post("/seed/demo")]
7pub async fn seed_demo_data(data: web::Data<AppState>, req: HttpRequest) -> impl Responder {
8 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 match data.auth_use_cases.verify_token(token) {
29 Ok(claims) => {
30 if claims.role != "superadmin" {
32 return HttpResponse::Forbidden().json(serde_json::json!({
33 "error": "Only SuperAdmin can seed demo data"
34 }));
35 }
36
37 let seeder = DatabaseSeeder::new(data.pool.clone());
39
40 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#[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#[post("/seed/realistic")]
106pub async fn seed_realistic_data(data: web::Data<AppState>, req: HttpRequest) -> impl Responder {
107 let auth_header = match req.headers().get("Authorization") {
108 Some(header) => match header.to_str() {
109 Ok(s) => s,
110 Err(_) => {
111 return HttpResponse::BadRequest().json(serde_json::json!({
112 "error": "Invalid authorization header"
113 }))
114 }
115 },
116 None => {
117 return HttpResponse::Unauthorized().json(serde_json::json!({
118 "error": "Missing authorization header"
119 }))
120 }
121 };
122
123 let token = auth_header.trim_start_matches("Bearer ").trim();
124
125 match data.auth_use_cases.verify_token(token) {
126 Ok(claims) => {
127 if claims.role != "superadmin" {
128 return HttpResponse::Forbidden().json(serde_json::json!({
129 "error": "Only SuperAdmin can seed realistic data"
130 }));
131 }
132
133 let seeder = DatabaseSeeder::new(data.pool.clone());
134
135 match seeder.seed_realistic_data().await {
136 Ok(message) => HttpResponse::Ok().json(serde_json::json!({
137 "success": true,
138 "message": message
139 })),
140 Err(e) => HttpResponse::BadRequest().json(serde_json::json!({
141 "error": e
142 })),
143 }
144 }
145 Err(e) => HttpResponse::Unauthorized().json(serde_json::json!({
146 "error": e
147 })),
148 }
149}