koprogo_api/infrastructure/web/handlers/
individual_member_handlers.rs1use actix_web::{delete, post, put, web, HttpResponse};
2use uuid::Uuid;
3
4use crate::application::dto::{
5 GrantConsentDto, IndividualMemberResponseDto, JoinCampaignAsIndividualDto,
6 UnsubscribeConfirmationDto, UpdateConsumptionDto,
7};
8use crate::domain::entities::IndividualMember;
9use crate::infrastructure::web::AppState;
10
11#[post("/energy-campaigns/{campaign_id}/join-as-individual")]
15pub async fn join_campaign_as_individual(
16 _state: web::Data<AppState>,
17 campaign_id: web::Path<Uuid>,
18 request: web::Json<JoinCampaignAsIndividualDto>,
19) -> Result<HttpResponse, actix_web::Error> {
20 let campaign_id = campaign_id.into_inner();
21
22 let member = IndividualMember::new(
26 campaign_id,
27 request.email.clone(),
28 request.postal_code.clone(),
29 )
30 .map_err(actix_web::error::ErrorBadRequest)?;
31
32 let response = IndividualMemberResponseDto::from(member);
37 Ok(HttpResponse::Created().json(response))
38}
39
40#[post("/energy-campaigns/{campaign_id}/members/{member_id}/consent")]
43pub async fn grant_consent(
44 _state: web::Data<AppState>,
45 path: web::Path<(Uuid, Uuid)>,
46 _request: web::Json<GrantConsentDto>,
47) -> Result<HttpResponse, actix_web::Error> {
48 let (_campaign_id, _member_id) = path.into_inner();
49
50 Ok(HttpResponse::Ok().json(serde_json::json!({
56 "success": true,
57 "message": "Consent granted successfully"
58 })))
59}
60
61#[put("/energy-campaigns/{campaign_id}/members/{member_id}/consumption")]
64pub async fn update_consumption(
65 _state: web::Data<AppState>,
66 path: web::Path<(Uuid, Uuid)>,
67 _request: web::Json<UpdateConsumptionDto>,
68) -> Result<HttpResponse, actix_web::Error> {
69 let (_campaign_id, _member_id) = path.into_inner();
70
71 Ok(HttpResponse::Ok().json(serde_json::json!({
77 "success": true,
78 "message": "Consumption data updated"
79 })))
80}
81
82#[delete("/energy-campaigns/{campaign_id}/members/{member_id}/withdraw")]
86pub async fn withdraw_from_campaign(
87 _state: web::Data<AppState>,
88 path: web::Path<(Uuid, Uuid)>,
89) -> Result<HttpResponse, actix_web::Error> {
90 let (_campaign_id, _member_id) = path.into_inner();
91
92 let response = UnsubscribeConfirmationDto {
98 success: true,
99 message: "Successfully withdrawn from campaign".to_string(),
100 email: "user@example.com".to_string(), };
102
103 Ok(HttpResponse::Ok().json(response))
104}
105
106#[cfg(test)]
107mod tests {
108 #[test]
109 fn test_individual_member_handlers_compile() {
110 }
112}