backbone_banking/presentation/dto/
mod.rs1pub 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
17pub 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
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}