use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PageResponse<T> {
pub items: Vec<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_more: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PeriodStatus {
Draft,
Active,
Ended,
Paused,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OkrStatus {
Normal,
Deleted,
Draft,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ProgressRecordType {
Simple,
Detail,
Image,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum KeyResultType {
Numeric,
Percentage,
Milestone,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct I18nText {
#[serde(skip_serializing_if = "Option::is_none")]
pub zh_cn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub en_us: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ja_jp: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub user_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avatar: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Period {
pub period_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<PeriodStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub modify_time: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PeriodRule {
pub rule_id: String,
pub period_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub rule_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub config: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyResult {
pub kr_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub kr_type: Option<KeyResultType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_value: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub target_value: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub progress_rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Objective {
pub objective_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<I18nText>,
#[serde(skip_serializing_if = "Option::is_none")]
pub progress_rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub key_results: Option<Vec<KeyResult>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Okr {
pub okr_id: String,
pub user_id: String,
pub period_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<OkrStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub objectives: Option<Vec<Objective>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub modify_time: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProgressAttachment {
pub attachment_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProgressRecord {
pub progress_id: String,
pub okr_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub record_type: Option<ProgressRecordType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub progress_rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachments: Option<Vec<ProgressAttachment>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub creator: Option<User>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub modify_time: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Review {
pub review_id: String,
pub okr_id: String,
pub period_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reviewer: Option<User>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_time: Option<i64>,
}