use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::{
core::{
api_req::ApiRequest,
api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
config::Config,
constants::AccessTokenType,
endpoints::corehr::*,
http::Transport,
req_option::RequestOption,
SDKResult,
},
service::corehr::models::{
Job, JobCreateRequest, JobFamily, JobFamilyCreateRequest, JobGrade, JobGradeCreateRequest,
JobLevel, JobLevelCreateRequest, PageResponse,
},
};
pub struct JobManagementService {
pub config: Config,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobFamilyCreateResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_family: Option<JobFamily>,
}
impl ApiResponseTrait for JobFamilyCreateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobFamilyListResponse {
#[serde(flatten)]
pub job_families: PageResponse<JobFamily>,
}
impl ApiResponseTrait for JobFamilyListResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobLevelCreateResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_level: Option<JobLevel>,
}
impl ApiResponseTrait for JobLevelCreateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobLevelListResponse {
#[serde(flatten)]
pub job_levels: PageResponse<JobLevel>,
}
impl ApiResponseTrait for JobLevelListResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobGradeCreateResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_grade: Option<JobGrade>,
}
impl ApiResponseTrait for JobGradeCreateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobGradeQueryResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Vec<JobGrade>>,
}
impl ApiResponseTrait for JobGradeQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobCreateResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub job: Option<Job>,
}
impl ApiResponseTrait for JobCreateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobListResponse {
#[serde(flatten)]
pub jobs: PageResponse<Job>,
}
impl ApiResponseTrait for JobListResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl JobManagementService {
pub fn new(config: Config) -> Self {
Self { config }
}
pub async fn create_job_family(
&self,
request: JobFamilyCreateRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobFamilyCreateResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_JOB_FAMILIES.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant],
body: serde_json::to_vec(&request).unwrap_or_default(),
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn list_job_families(
&self,
page_size: Option<i32>,
page_token: Option<String>,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobFamilyListResponse>> {
let mut api_req = ApiRequest {
http_method: Method::GET,
api_path: COREHR_JOB_FAMILIES.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant],
body: vec![],
..Default::default()
};
if let Some(size) = page_size {
api_req.query_params.insert("page_size", size.to_string());
}
if let Some(token) = page_token {
api_req.query_params.insert("page_token", token);
}
Transport::request(api_req, &self.config, option).await
}
pub async fn create_job_level(
&self,
request: JobLevelCreateRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobLevelCreateResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_JOB_LEVELS.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant],
body: serde_json::to_vec(&request).unwrap_or_default(),
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn list_job_levels(
&self,
page_size: Option<i32>,
page_token: Option<String>,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobLevelListResponse>> {
let mut api_req = ApiRequest {
http_method: Method::GET,
api_path: COREHR_JOB_LEVELS.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant],
body: vec![],
..Default::default()
};
if let Some(size) = page_size {
api_req.query_params.insert("page_size", size.to_string());
}
if let Some(token) = page_token {
api_req.query_params.insert("page_token", token);
}
Transport::request(api_req, &self.config, option).await
}
pub async fn create_job_grade(
&self,
request: JobGradeCreateRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobGradeCreateResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_JOB_GRADES.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant],
body: serde_json::to_vec(&request).unwrap_or_default(),
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn query_job_grades(
&self,
job_family_id: Option<String>,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobGradeQueryResponse>> {
let mut api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_JOB_GRADES_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant],
body: vec![],
..Default::default()
};
if let Some(family_id) = job_family_id {
api_req.query_params.insert("job_family_id", family_id);
}
Transport::request(api_req, &self.config, option).await
}
pub async fn create_job(
&self,
request: JobCreateRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobCreateResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_JOBS.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant],
body: serde_json::to_vec(&request).unwrap_or_default(),
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn list_jobs(
&self,
page_size: Option<i32>,
page_token: Option<String>,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobListResponse>> {
let mut api_req = ApiRequest {
http_method: Method::GET,
api_path: COREHR_JOBS.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant],
body: vec![],
..Default::default()
};
if let Some(size) = page_size {
api_req.query_params.insert("page_size", size.to_string());
}
if let Some(token) = page_token {
api_req.query_params.insert("page_token", token);
}
Transport::request(api_req, &self.config, option).await
}
}