use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize)]
pub struct PageResponse<T> {
pub items: Vec<T>,
pub has_more: bool,
pub page_token: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct I18nText {
pub zh_cn: Option<String>,
pub en_us: Option<String>,
pub ja_jp: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserId {
pub id: String,
pub id_type: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DepartmentId {
pub id: String,
pub id_type: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Attachment {
pub id: String,
pub name: String,
pub file_type: Option<String>,
pub size: Option<u64>,
pub created_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Location {
pub id: String,
pub name: I18nText,
pub location_type: String,
pub parent_id: Option<String>,
pub code: Option<String>,
pub active_status: bool,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct LocationQueryRequest {
pub location_type: Option<String>,
pub parent_id: Option<String>,
pub page_size: Option<u32>,
pub page_token: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Role {
pub id: String,
pub name: I18nText,
pub description: Option<I18nText>,
pub permissions: Vec<String>,
pub created_time: Option<String>,
pub updated_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct RoleListRequest {
pub page_size: Option<u32>,
pub page_token: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserRole {
pub user_id: String,
pub role_ids: Vec<String>,
pub roles: Option<Vec<Role>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Job {
pub id: String,
pub title: String,
pub description: Option<String>,
pub requirement: Option<String>,
pub status: String,
pub job_type: Option<String>,
pub job_function_id: Option<String>,
pub job_category_id: Option<String>,
pub locations: Vec<Location>,
pub department_id: Option<String>,
pub recruiters: Vec<UserId>,
pub interviewers: Vec<UserId>,
pub created_time: Option<String>,
pub updated_time: Option<String>,
pub custom_fields: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct JobCreateRequest {
pub title: String,
pub description: Option<String>,
pub requirement: Option<String>,
pub job_type: Option<String>,
pub job_function_id: Option<String>,
pub job_category_id: Option<String>,
pub location_ids: Vec<String>,
pub department_id: Option<String>,
pub recruiter_ids: Vec<String>,
pub interviewer_ids: Vec<String>,
pub custom_fields: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct JobUpdateRequest {
pub job_id: String,
pub title: Option<String>,
pub description: Option<String>,
pub requirement: Option<String>,
pub job_type: Option<String>,
pub job_function_id: Option<String>,
pub job_category_id: Option<String>,
pub location_ids: Option<Vec<String>>,
pub department_id: Option<String>,
pub recruiter_ids: Option<Vec<String>>,
pub interviewer_ids: Option<Vec<String>>,
pub custom_fields: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct JobListRequest {
pub page_size: Option<u32>,
pub page_token: Option<String>,
pub status: Option<String>,
pub department_id: Option<String>,
pub job_type: Option<String>,
pub created_start_time: Option<String>,
pub created_end_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobRequirement {
pub id: String,
pub name: String,
pub description: Option<String>,
pub job_id: String,
pub headcount: u32,
pub status: String,
pub expected_entry_time: Option<String>,
pub creator: Option<UserId>,
pub created_time: Option<String>,
pub updated_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct JobRequirementCreateRequest {
pub name: String,
pub description: Option<String>,
pub job_id: String,
pub headcount: u32,
pub expected_entry_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Talent {
pub id: String,
pub name: String,
pub email: Option<String>,
pub phone: Option<String>,
pub gender: Option<String>,
pub birthday: Option<String>,
pub work_experience: Option<u32>,
pub education: Option<String>,
pub current_company: Option<String>,
pub current_position: Option<String>,
pub expected_salary: Option<String>,
pub resume_attachments: Vec<Attachment>,
pub tags: Vec<String>,
pub created_time: Option<String>,
pub updated_time: Option<String>,
pub custom_fields: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TalentCreateRequest {
pub name: String,
pub email: Option<String>,
pub phone: Option<String>,
pub gender: Option<String>,
pub birthday: Option<String>,
pub work_experience: Option<u32>,
pub education: Option<String>,
pub current_company: Option<String>,
pub current_position: Option<String>,
pub expected_salary: Option<String>,
pub resume_attachment_ids: Vec<String>,
pub tags: Vec<String>,
pub custom_fields: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Application {
pub id: String,
pub talent_id: String,
pub job_id: String,
pub stage_id: String,
pub status: String,
pub source: Option<String>,
pub apply_time: Option<String>,
pub talent: Option<Talent>,
pub job: Option<Job>,
pub created_time: Option<String>,
pub updated_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct ApplicationCreateRequest {
pub talent_id: String,
pub job_id: String,
pub stage_id: String,
pub source: Option<String>,
pub apply_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct ApplicationListRequest {
pub page_size: Option<u32>,
pub page_token: Option<String>,
pub job_id: Option<String>,
pub status: Option<String>,
pub stage_id: Option<String>,
pub source: Option<String>,
pub created_start_time: Option<String>,
pub created_end_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Interview {
pub id: String,
pub application_id: String,
pub round: u32,
pub interview_type: String,
pub status: String,
pub start_time: Option<String>,
pub end_time: Option<String>,
pub interviewers: Vec<UserId>,
pub location: Option<String>,
pub remark: Option<String>,
pub result: Option<String>,
pub created_time: Option<String>,
pub updated_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Offer {
pub id: String,
pub application_id: String,
pub status: String,
pub job_level: Option<String>,
pub basic_salary: Option<String>,
pub performance_bonus: Option<String>,
pub stock_option: Option<String>,
pub onboard_date: Option<String>,
pub expire_time: Option<String>,
pub remark: Option<String>,
pub created_time: Option<String>,
pub updated_time: Option<String>,
pub custom_fields: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct OfferCreateRequest {
pub application_id: String,
pub job_level: Option<String>,
pub basic_salary: Option<String>,
pub performance_bonus: Option<String>,
pub stock_option: Option<String>,
pub onboard_date: Option<String>,
pub expire_time: Option<String>,
pub remark: Option<String>,
pub custom_fields: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ReferralAccount {
pub id: String,
pub user_id: String,
pub status: String,
pub balance: String,
pub total_income: String,
pub withdrawn_amount: String,
pub created_time: Option<String>,
pub updated_time: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct ReferralAccountCreateRequest {
pub user_id: String,
pub id_card: Option<String>,
pub bank_card: Option<String>,
pub bank_name: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct AttachmentCreateRequest {
pub name: String,
pub content: String,
pub file_type: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CommonResponse {
pub success: bool,
pub message: Option<String>,
pub timestamp: Option<String>,
}
#[cfg(test)]
#[allow(unused_variables, unused_unsafe)]
mod tests {
use super::*;
use serde_json;
#[test]
fn test_page_response_serialization() {
let response = PageResponse {
items: vec!["item1".to_string(), "item2".to_string()],
has_more: true,
page_token: Some("token123".to_string()),
};
let json = serde_json::to_string(&response).unwrap();
assert!(json.contains("item1"));
assert!(json.contains("has_more"));
assert!(json.contains("token123"));
}
#[test]
fn test_i18n_text_complete() {
let text = I18nText {
zh_cn: Some("中文".to_string()),
en_us: Some("English".to_string()),
ja_jp: Some("日本語".to_string()),
};
let json = serde_json::to_string(&text).unwrap();
let deserialized: I18nText = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized.zh_cn, Some("中文".to_string()));
assert_eq!(deserialized.en_us, Some("English".to_string()));
assert_eq!(deserialized.ja_jp, Some("日本語".to_string()));
}
#[test]
fn test_i18n_text_default() {
let text = I18nText::default();
assert_eq!(text.zh_cn, None);
assert_eq!(text.en_us, None);
assert_eq!(text.ja_jp, None);
}
#[test]
fn test_user_id_serialization() {
let user_id = UserId {
id: "user123".to_string(),
id_type: "open_id".to_string(),
};
let json = serde_json::to_string(&user_id).unwrap();
assert!(json.contains("user123"));
assert!(json.contains("open_id"));
}
#[test]
fn test_department_id_serialization() {
let dept_id = DepartmentId {
id: "dept456".to_string(),
id_type: "department_id".to_string(),
};
let json = serde_json::to_string(&dept_id).unwrap();
assert!(json.contains("dept456"));
assert!(json.contains("department_id"));
}
#[test]
fn test_attachment_complete() {
let attachment = Attachment {
id: "att789".to_string(),
name: "resume.pdf".to_string(),
file_type: Some("application/pdf".to_string()),
size: Some(1024000),
created_time: Some("2024-01-01T00:00:00Z".to_string()),
};
let json = serde_json::to_string(&attachment).unwrap();
assert!(json.contains("att789"));
assert!(json.contains("resume.pdf"));
assert!(json.contains("application/pdf"));
}
#[test]
fn test_location_active() {
let location = Location {
id: "loc001".to_string(),
name: I18nText {
zh_cn: Some("北京".to_string()),
en_us: Some("Beijing".to_string()),
ja_jp: None,
},
location_type: "city".to_string(),
parent_id: Some("china".to_string()),
code: Some("BJ".to_string()),
active_status: true,
};
let json = serde_json::to_string(&location).unwrap();
assert!(json.contains("loc001"));
assert!(json.contains("北京"));
assert!(json.contains("Beijing"));
assert!(json.contains("true"));
}
#[test]
fn test_location_query_request_default() {
let request = LocationQueryRequest::default();
assert_eq!(request.location_type, None);
assert_eq!(request.parent_id, None);
assert_eq!(request.page_size, None);
assert_eq!(request.page_token, None);
}
#[test]
fn test_common_response_success() {
let response = CommonResponse {
success: true,
message: Some("Operation completed".to_string()),
timestamp: Some("2024-01-01T00:00:00Z".to_string()),
};
let json = serde_json::to_string(&response).unwrap();
assert!(json.contains("true"));
assert!(json.contains("Operation completed"));
}
#[test]
fn test_common_response_error() {
let response = CommonResponse {
success: false,
message: Some("Operation failed".to_string()),
timestamp: None,
};
let json = serde_json::to_string(&response).unwrap();
assert!(json.contains("false"));
assert!(json.contains("Operation failed"));
}
#[test]
fn test_attachment_create_request() {
let request = AttachmentCreateRequest {
name: "document.pdf".to_string(),
content: "base64encodedcontent".to_string(),
file_type: Some("application/pdf".to_string()),
};
let json = serde_json::to_string(&request).unwrap();
assert!(json.contains("document.pdf"));
assert!(json.contains("base64encodedcontent"));
assert!(json.contains("application/pdf"));
}
}