Skip to main content

backbone_maintenance/presentation/dto/
mod.rs

1//! DTOs (Data Transfer Objects)
2//!
3//! Generated by metaphor-schema. Do not edit manually.
4//!
5//! This module provides DTOs for the presentation layer,
6//! with validation and OpenAPI schema support.
7
8pub mod maintenance_request_dto;
9pub mod maintenance_schedule_dto;
10pub mod maintenance_stage_dto;
11pub mod maintenance_visit_dto;
12pub mod maintenance_visit_part_dto;
13
14// Re-exports
15pub use maintenance_request_dto::{
16    CreateMaintenanceRequestDto,
17    UpdateMaintenanceRequestDto,
18    PatchMaintenanceRequestDto,
19    MaintenanceRequestResponseDto,
20    MaintenanceRequestListResponseDto,
21    MaintenanceRequestSummaryDto,
22};
23pub use maintenance_schedule_dto::{
24    CreateMaintenanceScheduleDto,
25    UpdateMaintenanceScheduleDto,
26    PatchMaintenanceScheduleDto,
27    MaintenanceScheduleResponseDto,
28    MaintenanceScheduleListResponseDto,
29    MaintenanceScheduleSummaryDto,
30};
31pub use maintenance_stage_dto::{
32    CreateMaintenanceStageDto,
33    UpdateMaintenanceStageDto,
34    PatchMaintenanceStageDto,
35    MaintenanceStageResponseDto,
36    MaintenanceStageListResponseDto,
37    MaintenanceStageSummaryDto,
38};
39pub use maintenance_visit_dto::{
40    CreateMaintenanceVisitDto,
41    UpdateMaintenanceVisitDto,
42    PatchMaintenanceVisitDto,
43    MaintenanceVisitResponseDto,
44    MaintenanceVisitListResponseDto,
45    MaintenanceVisitSummaryDto,
46};
47pub use maintenance_visit_part_dto::{
48    CreateMaintenanceVisitPartDto,
49    UpdateMaintenanceVisitPartDto,
50    PatchMaintenanceVisitPartDto,
51    MaintenanceVisitPartResponseDto,
52    MaintenanceVisitPartListResponseDto,
53    MaintenanceVisitPartSummaryDto,
54};
55
56// Common pagination types
57use serde::Serialize;
58
59#[cfg(feature = "openapi")]
60#[cfg(feature = "openapi")]
61use utoipa::ToSchema;
62
63/// Pagination parameters for list requests
64#[derive(Debug, Clone, Default, serde::Deserialize)]
65#[cfg_attr(feature = "openapi", derive(ToSchema))]
66pub struct PaginationParams {
67    /// Page number (1-indexed)
68    #[serde(default = "default_page")]
69    pub page: u32,
70    /// Items per page
71    #[serde(default = "default_per_page")]
72    pub per_page: u32,
73    /// Field to sort by
74    pub sort_by: Option<String>,
75    /// Sort order (asc/desc)
76    pub sort_order: Option<String>,
77}
78
79fn default_page() -> u32 { 1 }
80fn default_per_page() -> u32 { 20 }
81
82/// API response wrapper
83#[derive(Debug, Clone, Serialize)]
84#[cfg_attr(feature = "openapi", derive(ToSchema))]
85#[serde(rename_all = "camelCase")]
86pub struct ApiResponse<T> {
87    pub success: bool,
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub data: Option<T>,
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub error: Option<ApiError>,
92}
93
94#[derive(Debug, Clone, Serialize)]
95#[cfg_attr(feature = "openapi", derive(ToSchema))]
96pub struct ApiError {
97    pub code: String,
98    pub message: String,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub details: Option<serde_json::Value>,
101}
102
103impl<T> ApiResponse<T> {
104    pub fn ok(data: T) -> Self {
105        Self { success: true, data: Some(data), error: None }
106    }
107
108    pub fn err(code: impl Into<String>, message: impl Into<String>) -> Self {
109        Self {
110            success: false,
111            data: None,
112            error: Some(ApiError {
113                code: code.into(),
114                message: message.into(),
115                details: None,
116            }),
117        }
118    }
119}