backbone_catalog/presentation/dto/
mod.rs1pub 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
17pub 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
83use serde::Serialize;
85
86#[cfg(feature = "openapi")]
87#[cfg(feature = "openapi")]
88use utoipa::ToSchema;
89
90#[derive(Debug, Clone, Default, serde::Deserialize)]
92#[cfg_attr(feature = "openapi", derive(ToSchema))]
93pub struct PaginationParams {
94 #[serde(default = "default_page")]
96 pub page: u32,
97 #[serde(default = "default_per_page")]
99 pub per_page: u32,
100 pub sort_by: Option<String>,
102 pub sort_order: Option<String>,
104}
105
106fn default_page() -> u32 { 1 }
107fn default_per_page() -> u32 { 20 }
108
109#[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}