Skip to main content

backbone_integrations/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 integration_connector_dto;
9pub mod integration_account_dto;
10pub mod integration_event_dto;
11
12// Re-exports
13pub use integration_connector_dto::{
14    CreateIntegrationConnectorDto,
15    UpdateIntegrationConnectorDto,
16    PatchIntegrationConnectorDto,
17    IntegrationConnectorResponseDto,
18    IntegrationConnectorListResponseDto,
19    IntegrationConnectorSummaryDto,
20};
21pub use integration_account_dto::{
22    CreateIntegrationAccountDto,
23    UpdateIntegrationAccountDto,
24    PatchIntegrationAccountDto,
25    IntegrationAccountResponseDto,
26    IntegrationAccountListResponseDto,
27    IntegrationAccountSummaryDto,
28};
29pub use integration_event_dto::{
30    CreateIntegrationEventDto,
31    UpdateIntegrationEventDto,
32    PatchIntegrationEventDto,
33    IntegrationEventResponseDto,
34    IntegrationEventListResponseDto,
35    IntegrationEventSummaryDto,
36};
37
38// Common pagination types
39use serde::Serialize;
40
41#[cfg(feature = "openapi")]
42#[cfg(feature = "openapi")]
43use utoipa::ToSchema;
44
45/// Pagination parameters for list requests
46#[derive(Debug, Clone, Default, serde::Deserialize)]
47#[cfg_attr(feature = "openapi", derive(ToSchema))]
48pub struct PaginationParams {
49    /// Page number (1-indexed)
50    #[serde(default = "default_page")]
51    pub page: u32,
52    /// Items per page
53    #[serde(default = "default_per_page")]
54    pub per_page: u32,
55    /// Field to sort by
56    pub sort_by: Option<String>,
57    /// Sort order (asc/desc)
58    pub sort_order: Option<String>,
59}
60
61fn default_page() -> u32 { 1 }
62fn default_per_page() -> u32 { 20 }
63
64/// API response wrapper
65#[derive(Debug, Clone, Serialize)]
66#[cfg_attr(feature = "openapi", derive(ToSchema))]
67#[serde(rename_all = "camelCase")]
68pub struct ApiResponse<T> {
69    pub success: bool,
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub data: Option<T>,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub error: Option<ApiError>,
74}
75
76#[derive(Debug, Clone, Serialize)]
77#[cfg_attr(feature = "openapi", derive(ToSchema))]
78pub struct ApiError {
79    pub code: String,
80    pub message: String,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub details: Option<serde_json::Value>,
83}
84
85impl<T> ApiResponse<T> {
86    pub fn ok(data: T) -> Self {
87        Self { success: true, data: Some(data), error: None }
88    }
89
90    pub fn err(code: impl Into<String>, message: impl Into<String>) -> Self {
91        Self {
92            success: false,
93            data: None,
94            error: Some(ApiError {
95                code: code.into(),
96                message: message.into(),
97                details: None,
98            }),
99        }
100    }
101}