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::{
JobChange, JobChangeCreateRequest, JobChangeSearchRequest, Offboarding,
OffboardingCreateRequest, OffboardingSearchRequest, PageResponse, PreHire,
PreHireCreateRequest, PreHireSearchRequest,
},
};
pub struct LifecycleService {
pub config: Config,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PreHireCreateResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub pre_hire: Option<PreHire>,
}
impl ApiResponseTrait for PreHireCreateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PreHireSearchResponse {
#[serde(flatten)]
pub pre_hires: PageResponse<PreHire>,
}
impl ApiResponseTrait for PreHireSearchResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobChangeCreateResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub job_change: Option<JobChange>,
}
impl ApiResponseTrait for JobChangeCreateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JobChangeSearchResponse {
#[serde(flatten)]
pub job_changes: PageResponse<JobChange>,
}
impl ApiResponseTrait for JobChangeSearchResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct OffboardingCreateResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub offboarding: Option<Offboarding>,
}
impl ApiResponseTrait for OffboardingCreateResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct OffboardingSearchResponse {
#[serde(flatten)]
pub offboardings: PageResponse<Offboarding>,
}
impl ApiResponseTrait for OffboardingSearchResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
impl LifecycleService {
pub fn new(config: Config) -> Self {
Self { config }
}
pub async fn create_pre_hire(
&self,
request: PreHireCreateRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<PreHireCreateResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_PRE_HIRES.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 search_pre_hire(
&self,
request: PreHireSearchRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<PreHireSearchResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_PRE_HIRES_SEARCH.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 create_job_change(
&self,
request: JobChangeCreateRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobChangeCreateResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_JOB_CHANGES.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 search_job_change(
&self,
request: JobChangeSearchRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<JobChangeSearchResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_JOB_CHANGES_SEARCH.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 create_offboarding(
&self,
request: OffboardingCreateRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<OffboardingCreateResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_OFFBOARDINGS.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 search_offboarding(
&self,
request: OffboardingSearchRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<OffboardingSearchResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: COREHR_OFFBOARDINGS_SEARCH.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
}
}