Skip to main content

backbone_activity/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 OpenAPI schema support.
7
8pub mod activity_dto;
9
10// Re-exports
11pub use activity_dto::{
12    CreateActivityDto,
13    UpdateActivityDto,
14    PatchActivityDto,
15    ActivityResponseDto,
16    ActivityListResponseDto,
17    ActivitySummaryDto,
18};
19
20// Common pagination types
21use serde::Serialize;
22
23#[cfg(feature = "openapi")]
24#[cfg(feature = "openapi")]
25use utoipa::ToSchema;
26
27/// Pagination parameters for list requests
28#[derive(Debug, Clone, Default, serde::Deserialize)]
29#[cfg_attr(feature = "openapi", derive(ToSchema))]
30pub struct PaginationParams {
31    /// Page number (1-indexed)
32    #[serde(default = "default_page")]
33    pub page: u32,
34    /// Items per page
35    #[serde(default = "default_per_page")]
36    pub per_page: u32,
37    /// Field to sort by
38    pub sort_by: Option<String>,
39    /// Sort order (asc/desc)
40    pub sort_order: Option<String>,
41}
42
43fn default_page() -> u32 { 1 }
44fn default_per_page() -> u32 { 20 }
45
46/// API response wrapper
47#[derive(Debug, Clone, Serialize)]
48#[cfg_attr(feature = "openapi", derive(ToSchema))]
49#[serde(rename_all = "camelCase")]
50pub struct ApiResponse<T> {
51    pub success: bool,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub data: Option<T>,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub error: Option<ApiError>,
56}
57
58#[derive(Debug, Clone, Serialize)]
59#[cfg_attr(feature = "openapi", derive(ToSchema))]
60pub struct ApiError {
61    pub code: String,
62    pub message: String,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub details: Option<serde_json::Value>,
65}
66
67impl<T> ApiResponse<T> {
68    pub fn ok(data: T) -> Self {
69        Self { success: true, data: Some(data), error: None }
70    }
71
72    pub fn err(code: impl Into<String>, message: impl Into<String>) -> Self {
73        Self {
74            success: false,
75            data: None,
76            error: Some(ApiError {
77                code: code.into(),
78                message: message.into(),
79                details: None,
80            }),
81        }
82    }
83}