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, JoinCampaignAsIndividualDto, UnsubscribeConfirmationDto, UpdateConsumptionDto,
6};
7use crate::infrastructure::web::AppState;
8
9#[post("/energy-campaigns/{campaign_id}/join-as-individual")]
10pub async fn join_campaign_as_individual(
11 state: web::Data<AppState>,
12 campaign_id: web::Path<Uuid>,
13 request: web::Json<JoinCampaignAsIndividualDto>,
14) -> Result<HttpResponse, actix_web::Error> {
15 let campaign_id = campaign_id.into_inner();
16 let response = state
17 .individual_member_use_cases
18 .join_campaign(
19 campaign_id,
20 request.email.clone(),
21 request.postal_code.clone(),
22 )
23 .await
24 .map_err(actix_web::error::ErrorBadRequest)?;
25 Ok(HttpResponse::Created().json(response))
26}
27
28#[post("/energy-campaigns/{campaign_id}/members/{member_id}/consent")]
29pub async fn grant_consent(
30 state: web::Data<AppState>,
31 path: web::Path<(Uuid, Uuid)>,
32 _request: web::Json<GrantConsentDto>,
33) -> Result<HttpResponse, actix_web::Error> {
34 let (campaign_id, member_id) = path.into_inner();
35 let response = state
36 .individual_member_use_cases
37 .grant_consent(campaign_id, member_id)
38 .await
39 .map_err(actix_web::error::ErrorBadRequest)?;
40 Ok(HttpResponse::Ok().json(response))
41}
42
43#[put("/energy-campaigns/{campaign_id}/members/{member_id}/consumption")]
44pub async fn update_consumption(
45 state: web::Data<AppState>,
46 path: web::Path<(Uuid, Uuid)>,
47 request: web::Json<UpdateConsumptionDto>,
48) -> Result<HttpResponse, actix_web::Error> {
49 let (campaign_id, member_id) = path.into_inner();
50 let response = state
51 .individual_member_use_cases
52 .update_consumption(
53 campaign_id,
54 member_id,
55 Some(request.annual_consumption_kwh),
56 request.current_provider.clone(),
57 request.ean_code.clone(),
58 )
59 .await
60 .map_err(actix_web::error::ErrorBadRequest)?;
61 Ok(HttpResponse::Ok().json(response))
62}
63
64#[delete("/energy-campaigns/{campaign_id}/members/{member_id}/withdraw")]
65pub async fn withdraw_from_campaign(
66 state: web::Data<AppState>,
67 path: web::Path<(Uuid, Uuid)>,
68) -> Result<HttpResponse, actix_web::Error> {
69 let (campaign_id, member_id) = path.into_inner();
70 let email = state
71 .individual_member_use_cases
72 .withdraw(campaign_id, member_id)
73 .await
74 .map_err(actix_web::error::ErrorBadRequest)?;
75 let response = UnsubscribeConfirmationDto {
76 success: true,
77 message: "Successfully withdrawn from campaign".to_string(),
78 email,
79 };
80 Ok(HttpResponse::Ok().json(response))
81}