koprogo_api/application/dto/
resolution_dto.rs

1use crate::domain::entities::{MajorityType, Resolution, ResolutionStatus, ResolutionType};
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6/// Response DTO for Resolution
7#[derive(Debug, Serialize, Deserialize, Clone)]
8pub struct ResolutionResponse {
9    pub id: Uuid,
10    pub meeting_id: Uuid,
11    pub title: String,
12    pub description: String,
13    pub resolution_type: ResolutionType,
14    pub majority_required: MajorityType,
15    pub vote_count_pour: i32,
16    pub vote_count_contre: i32,
17    pub vote_count_abstention: i32,
18    pub total_voting_power_pour: f64,
19    pub total_voting_power_contre: f64,
20    pub total_voting_power_abstention: f64,
21    pub status: ResolutionStatus,
22    pub created_at: DateTime<Utc>,
23    pub voted_at: Option<DateTime<Utc>>,
24    // Calculated fields
25    pub total_votes: i32,
26    pub pour_percentage: f64,
27    pub contre_percentage: f64,
28    pub abstention_percentage: f64,
29}
30
31impl From<Resolution> for ResolutionResponse {
32    fn from(resolution: Resolution) -> Self {
33        Self {
34            id: resolution.id,
35            meeting_id: resolution.meeting_id,
36            title: resolution.title.clone(),
37            description: resolution.description.clone(),
38            resolution_type: resolution.resolution_type.clone(),
39            majority_required: resolution.majority_required.clone(),
40            vote_count_pour: resolution.vote_count_pour,
41            vote_count_contre: resolution.vote_count_contre,
42            vote_count_abstention: resolution.vote_count_abstention,
43            total_voting_power_pour: resolution.total_voting_power_pour,
44            total_voting_power_contre: resolution.total_voting_power_contre,
45            total_voting_power_abstention: resolution.total_voting_power_abstention,
46            status: resolution.status.clone(),
47            created_at: resolution.created_at,
48            voted_at: resolution.voted_at,
49            // Calculated
50            total_votes: resolution.total_votes(),
51            pour_percentage: resolution.pour_percentage(),
52            contre_percentage: resolution.contre_percentage(),
53            abstention_percentage: resolution.abstention_percentage(),
54        }
55    }
56}
57
58/// Request DTO for creating a resolution
59#[derive(Debug, Deserialize)]
60pub struct CreateResolutionRequest {
61    pub meeting_id: Uuid,
62    pub title: String,
63    pub description: String,
64    pub resolution_type: ResolutionType,
65    pub majority_required: MajorityType,
66}
67
68/// Request DTO for updating a resolution
69#[derive(Debug, Deserialize)]
70pub struct UpdateResolutionRequest {
71    pub title: Option<String>,
72    pub description: Option<String>,
73    pub resolution_type: Option<ResolutionType>,
74    pub majority_required: Option<MajorityType>,
75}
76
77/// Request DTO for closing voting on a resolution
78#[derive(Debug, Deserialize)]
79pub struct CloseVotingRequest {
80    pub total_voting_power: f64,
81}