Skip to main content

tmf_apis_core/
models.rs

1//! Common models and types for TMF APIs
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use utoipa::ToSchema;
6use uuid::Uuid;
7
8/// Lifecycle status of a resource
9#[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/// Base entity with common fields
23#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
24pub struct BaseEntity {
25    /// Unique identifier
26    #[schema(value_type = String, format = "uuid")]
27    pub id: Uuid,
28    /// Resource URI
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub href: Option<String>,
31    /// Name
32    pub name: String,
33    /// Description
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub description: Option<String>,
36    /// Version
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub version: Option<String>,
39    /// Lifecycle status
40    pub lifecycle_status: LifecycleStatus,
41    /// Creation date
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub valid_for: Option<TimePeriod>,
44    /// Last update date
45    #[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/// Time period for validity
51#[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/// Pagination parameters
61#[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/// Paginated response
74#[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}