use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, ToSchema)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum LifecycleStatus {
InStudy,
InDesign,
InTest,
Active,
Launched,
Retired,
Obsolete,
Rejected,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct BaseEntity {
#[schema(value_type = String, format = "uuid")]
pub id: Uuid,
#[serde(skip_serializing_if = "Option::is_none")]
pub href: Option<String>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
pub lifecycle_status: LifecycleStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub valid_for: Option<TimePeriod>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub last_update: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct TimePeriod {
#[schema(value_type = String, format = "date-time")]
pub start_date_time: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(value_type = String, format = "date-time")]
pub end_date_time: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginationParams {
#[serde(default = "default_limit")]
pub limit: u32,
#[serde(default)]
pub offset: u32,
}
fn default_limit() -> u32 {
100
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginatedResponse<T> {
pub data: Vec<T>,
pub total: u64,
pub limit: u32,
pub offset: u32,
}