1use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use utoipa::ToSchema;
6use uuid::Uuid;
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, ToSchema)]
10#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
11pub enum LifecycleStatus {
12 InStudy,
13 InDesign,
14 InTest,
15 Active,
16 Launched,
17 Retired,
18 Obsolete,
19 Rejected,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
24pub struct BaseEntity {
25 #[schema(value_type = String, format = "uuid")]
27 pub id: Uuid,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub href: Option<String>,
31 pub name: String,
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub description: Option<String>,
36 #[serde(skip_serializing_if = "Option::is_none")]
38 pub version: Option<String>,
39 pub lifecycle_status: LifecycleStatus,
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub valid_for: Option<TimePeriod>,
44 #[serde(skip_serializing_if = "Option::is_none")]
46 #[schema(value_type = String, format = "date-time")]
47 pub last_update: Option<DateTime<Utc>>,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
52pub struct TimePeriod {
53 #[schema(value_type = String, format = "date-time")]
54 pub start_date_time: DateTime<Utc>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 #[schema(value_type = String, format = "date-time")]
57 pub end_date_time: Option<DateTime<Utc>>,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct PaginationParams {
63 #[serde(default = "default_limit")]
64 pub limit: u32,
65 #[serde(default)]
66 pub offset: u32,
67}
68
69fn default_limit() -> u32 {
70 100
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct PaginatedResponse<T> {
76 pub data: Vec<T>,
77 pub total: u64,
78 pub limit: u32,
79 pub offset: u32,
80}