Skip to main content

backbone_banking/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 bank_dto;
9pub mod bank_account_dto;
10pub mod bank_clearance_dto;
11pub mod bank_reconciliation_dto;
12pub mod bank_statement_import_dto;
13pub mod bank_transaction_dto;
14pub mod fx_gain_loss_dto;
15pub mod reconcile_preset_dto;
16
17// Re-exports
18pub use bank_dto::{
19    CreateBankDto,
20    UpdateBankDto,
21    PatchBankDto,
22    BankResponseDto,
23    BankListResponseDto,
24    BankSummaryDto,
25};
26pub use bank_account_dto::{
27    CreateBankAccountDto,
28    UpdateBankAccountDto,
29    PatchBankAccountDto,
30    BankAccountResponseDto,
31    BankAccountListResponseDto,
32    BankAccountSummaryDto,
33};
34pub use bank_clearance_dto::{
35    CreateBankClearanceDto,
36    UpdateBankClearanceDto,
37    PatchBankClearanceDto,
38    BankClearanceResponseDto,
39    BankClearanceListResponseDto,
40    BankClearanceSummaryDto,
41};
42pub use bank_reconciliation_dto::{
43    CreateBankReconciliationDto,
44    UpdateBankReconciliationDto,
45    PatchBankReconciliationDto,
46    BankReconciliationResponseDto,
47    BankReconciliationListResponseDto,
48    BankReconciliationSummaryDto,
49};
50pub use bank_statement_import_dto::{
51    CreateBankStatementImportDto,
52    UpdateBankStatementImportDto,
53    PatchBankStatementImportDto,
54    BankStatementImportResponseDto,
55    BankStatementImportListResponseDto,
56    BankStatementImportSummaryDto,
57};
58pub use bank_transaction_dto::{
59    CreateBankTransactionDto,
60    UpdateBankTransactionDto,
61    PatchBankTransactionDto,
62    BankTransactionResponseDto,
63    BankTransactionListResponseDto,
64    BankTransactionSummaryDto,
65};
66pub use fx_gain_loss_dto::{
67    CreateFxGainLossDto,
68    UpdateFxGainLossDto,
69    PatchFxGainLossDto,
70    FxGainLossResponseDto,
71    FxGainLossListResponseDto,
72    FxGainLossSummaryDto,
73};
74pub use reconcile_preset_dto::{
75    CreateReconcilePresetDto,
76    UpdateReconcilePresetDto,
77    PatchReconcilePresetDto,
78    ReconcilePresetResponseDto,
79    ReconcilePresetListResponseDto,
80    ReconcilePresetSummaryDto,
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}