pub mod bank_dto;
pub mod bank_account_dto;
pub mod bank_clearance_dto;
pub mod bank_reconciliation_dto;
pub mod bank_statement_import_dto;
pub mod bank_transaction_dto;
pub mod fx_gain_loss_dto;
pub mod reconcile_preset_dto;
pub use bank_dto::{
CreateBankDto,
UpdateBankDto,
PatchBankDto,
BankResponseDto,
BankListResponseDto,
BankSummaryDto,
};
pub use bank_account_dto::{
CreateBankAccountDto,
UpdateBankAccountDto,
PatchBankAccountDto,
BankAccountResponseDto,
BankAccountListResponseDto,
BankAccountSummaryDto,
};
pub use bank_clearance_dto::{
CreateBankClearanceDto,
UpdateBankClearanceDto,
PatchBankClearanceDto,
BankClearanceResponseDto,
BankClearanceListResponseDto,
BankClearanceSummaryDto,
};
pub use bank_reconciliation_dto::{
CreateBankReconciliationDto,
UpdateBankReconciliationDto,
PatchBankReconciliationDto,
BankReconciliationResponseDto,
BankReconciliationListResponseDto,
BankReconciliationSummaryDto,
};
pub use bank_statement_import_dto::{
CreateBankStatementImportDto,
UpdateBankStatementImportDto,
PatchBankStatementImportDto,
BankStatementImportResponseDto,
BankStatementImportListResponseDto,
BankStatementImportSummaryDto,
};
pub use bank_transaction_dto::{
CreateBankTransactionDto,
UpdateBankTransactionDto,
PatchBankTransactionDto,
BankTransactionResponseDto,
BankTransactionListResponseDto,
BankTransactionSummaryDto,
};
pub use fx_gain_loss_dto::{
CreateFxGainLossDto,
UpdateFxGainLossDto,
PatchFxGainLossDto,
FxGainLossResponseDto,
FxGainLossListResponseDto,
FxGainLossSummaryDto,
};
pub use reconcile_preset_dto::{
CreateReconcilePresetDto,
UpdateReconcilePresetDto,
PatchReconcilePresetDto,
ReconcilePresetResponseDto,
ReconcilePresetListResponseDto,
ReconcilePresetSummaryDto,
};
use serde::Serialize;
#[cfg(feature = "openapi")]
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Debug, Clone, Default, serde::Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct PaginationParams {
#[serde(default = "default_page")]
pub page: u32,
#[serde(default = "default_per_page")]
pub per_page: u32,
pub sort_by: Option<String>,
pub sort_order: Option<String>,
}
fn default_page() -> u32 { 1 }
fn default_per_page() -> u32 { 20 }
#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "camelCase")]
pub struct ApiResponse<T> {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<ApiError>,
}
#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct ApiError {
pub code: String,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<serde_json::Value>,
}
impl<T> ApiResponse<T> {
pub fn ok(data: T) -> Self {
Self { success: true, data: Some(data), error: None }
}
pub fn err(code: impl Into<String>, message: impl Into<String>) -> Self {
Self {
success: false,
data: None,
error: Some(ApiError {
code: code.into(),
message: message.into(),
details: None,
}),
}
}
}