Skip to main content

koprogo_api/application/dto/
ticket_dto.rs

1use crate::domain::entities::{Ticket, TicketCategory, TicketPriority, TicketStatus};
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6#[derive(Debug, Serialize, Deserialize, Clone, utoipa::ToSchema)]
7pub struct TicketResponse {
8    pub id: Uuid,
9    pub organization_id: Uuid,
10    pub building_id: Uuid,
11    pub unit_id: Option<Uuid>,
12    pub created_by: Uuid,
13    pub assigned_to: Option<Uuid>,
14    pub title: String,
15    pub description: String,
16    pub category: TicketCategory,
17    pub priority: TicketPriority,
18    pub status: TicketStatus,
19    pub resolution_notes: Option<String>,
20    pub work_order_sent_at: Option<DateTime<Utc>>,
21    pub created_at: DateTime<Utc>,
22    pub updated_at: DateTime<Utc>,
23    pub resolved_at: Option<DateTime<Utc>>,
24    pub closed_at: Option<DateTime<Utc>>,
25    #[serde(default, skip_serializing_if = "Option::is_none")]
26    pub requester_name: Option<String>,
27    #[serde(default, skip_serializing_if = "Option::is_none")]
28    pub assigned_to_name: Option<String>,
29}
30
31impl From<Ticket> for TicketResponse {
32    fn from(ticket: Ticket) -> Self {
33        Self {
34            id: ticket.id,
35            organization_id: ticket.organization_id,
36            building_id: ticket.building_id,
37            unit_id: ticket.unit_id,
38            created_by: ticket.created_by,
39            assigned_to: ticket.assigned_to,
40            title: ticket.title,
41            description: ticket.description,
42            category: ticket.category,
43            priority: ticket.priority,
44            status: ticket.status,
45            resolution_notes: ticket.resolution_notes,
46            work_order_sent_at: ticket.work_order_sent_at,
47            created_at: ticket.created_at,
48            updated_at: ticket.updated_at,
49            resolved_at: ticket.resolved_at,
50            closed_at: ticket.closed_at,
51            requester_name: None,
52            assigned_to_name: None,
53        }
54    }
55}
56
57#[derive(Debug, Deserialize, utoipa::ToSchema)]
58pub struct CreateTicketRequest {
59    pub building_id: Uuid,
60    pub unit_id: Option<Uuid>,
61    pub title: String,
62    pub description: String,
63    pub category: TicketCategory,
64    pub priority: TicketPriority,
65}
66
67#[derive(Debug, Deserialize, utoipa::ToSchema)]
68pub struct AssignTicketRequest {
69    pub assigned_to: Uuid,
70}
71
72#[derive(Debug, Deserialize, utoipa::ToSchema)]
73pub struct ResolveTicketRequest {
74    pub resolution_notes: String,
75}
76
77#[derive(Debug, Deserialize, utoipa::ToSchema)]
78pub struct CancelTicketRequest {
79    pub reason: String,
80}
81
82#[derive(Debug, Deserialize, utoipa::ToSchema)]
83pub struct ReopenTicketRequest {
84    pub reason: String,
85}