koprogo_api/infrastructure/web/handlers/
individual_member_handlers.rs

1use 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}