backbone_activity/presentation/dto/
mod.rs1pub mod activity_dto;
9
10pub use activity_dto::{
12 CreateActivityDto,
13 UpdateActivityDto,
14 PatchActivityDto,
15 ActivityResponseDto,
16 ActivityListResponseDto,
17 ActivitySummaryDto,
18};
19
20use serde::Serialize;
22
23#[cfg(feature = "openapi")]
24#[cfg(feature = "openapi")]
25use utoipa::ToSchema;
26
27#[derive(Debug, Clone, Default, serde::Deserialize)]
29#[cfg_attr(feature = "openapi", derive(ToSchema))]
30pub struct PaginationParams {
31 #[serde(default = "default_page")]
33 pub page: u32,
34 #[serde(default = "default_per_page")]
36 pub per_page: u32,
37 pub sort_by: Option<String>,
39 pub sort_order: Option<String>,
41}
42
43fn default_page() -> u32 { 1 }
44fn default_per_page() -> u32 { 20 }
45
46#[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}