Skip to main content

backbone_catalog/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 attribute_dto;
9pub mod attribute_value_dto;
10pub mod brand_dto;
11pub mod item_dto;
12pub mod item_group_dto;
13pub mod item_variant_dto;
14pub mod uom_dto;
15pub mod uom_conversion_dto;
16
17// Re-exports
18pub use attribute_dto::{
19    CreateAttributeDto,
20    UpdateAttributeDto,
21    PatchAttributeDto,
22    AttributeResponseDto,
23    AttributeListResponseDto,
24    AttributeSummaryDto,
25};
26pub use attribute_value_dto::{
27    CreateAttributeValueDto,
28    UpdateAttributeValueDto,
29    PatchAttributeValueDto,
30    AttributeValueResponseDto,
31    AttributeValueListResponseDto,
32    AttributeValueSummaryDto,
33};
34pub use brand_dto::{
35    CreateBrandDto,
36    UpdateBrandDto,
37    PatchBrandDto,
38    BrandResponseDto,
39    BrandListResponseDto,
40    BrandSummaryDto,
41};
42pub use item_dto::{
43    CreateItemDto,
44    UpdateItemDto,
45    PatchItemDto,
46    ItemResponseDto,
47    ItemListResponseDto,
48    ItemSummaryDto,
49};
50pub use item_group_dto::{
51    CreateItemGroupDto,
52    UpdateItemGroupDto,
53    PatchItemGroupDto,
54    ItemGroupResponseDto,
55    ItemGroupListResponseDto,
56    ItemGroupSummaryDto,
57};
58pub use item_variant_dto::{
59    CreateItemVariantDto,
60    UpdateItemVariantDto,
61    PatchItemVariantDto,
62    ItemVariantResponseDto,
63    ItemVariantListResponseDto,
64    ItemVariantSummaryDto,
65};
66pub use uom_dto::{
67    CreateUomDto,
68    UpdateUomDto,
69    PatchUomDto,
70    UomResponseDto,
71    UomListResponseDto,
72    UomSummaryDto,
73};
74pub use uom_conversion_dto::{
75    CreateUomConversionDto,
76    UpdateUomConversionDto,
77    PatchUomConversionDto,
78    UomConversionResponseDto,
79    UomConversionListResponseDto,
80    UomConversionSummaryDto,
81};
82
83// Common pagination types
84use serde::Serialize;
85
86#[cfg(feature = "openapi")]
87#[cfg(feature = "openapi")]
88use utoipa::ToSchema;
89
90/// Pagination parameters for list requests
91#[derive(Debug, Clone, Default, serde::Deserialize)]
92#[cfg_attr(feature = "openapi", derive(ToSchema))]
93pub struct PaginationParams {
94    /// Page number (1-indexed)
95    #[serde(default = "default_page")]
96    pub page: u32,
97    /// Items per page
98    #[serde(default = "default_per_page")]
99    pub per_page: u32,
100    /// Field to sort by
101    pub sort_by: Option<String>,
102    /// Sort order (asc/desc)
103    pub sort_order: Option<String>,
104}
105
106fn default_page() -> u32 { 1 }
107fn default_per_page() -> u32 { 20 }
108
109/// API response wrapper
110#[derive(Debug, Clone, Serialize)]
111#[cfg_attr(feature = "openapi", derive(ToSchema))]
112#[serde(rename_all = "camelCase")]
113pub struct ApiResponse<T> {
114    pub success: bool,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub data: Option<T>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub error: Option<ApiError>,
119}
120
121#[derive(Debug, Clone, Serialize)]
122#[cfg_attr(feature = "openapi", derive(ToSchema))]
123pub struct ApiError {
124    pub code: String,
125    pub message: String,
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub details: Option<serde_json::Value>,
128}
129
130impl<T> ApiResponse<T> {
131    pub fn ok(data: T) -> Self {
132        Self { success: true, data: Some(data), error: None }
133    }
134
135    pub fn err(code: impl Into<String>, message: impl Into<String>) -> Self {
136        Self {
137            success: false,
138            data: None,
139            error: Some(ApiError {
140                code: code.into(),
141                message: message.into(),
142                details: None,
143            }),
144        }
145    }
146}