use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::{
core::{
api_req::ApiRequest,
api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
config::Config,
constants::AccessTokenType,
endpoints::performance::*,
http::Transport,
req_option::RequestOption,
trait_system::Service,
SDKResult,
},
service::performance::models::{
Activity, AdditionalInformation, Metric, MetricField, MetricTag, MetricTemplate,
PageResponse, ReviewItem, ReviewTemplate, Reviewee, Semester, TagQuestionConfig, UserGroup,
},
};
pub struct ReviewConfigService {
pub config: Config,
}
impl ReviewConfigService {
pub fn new(config: Config) -> Self {
Self { config }
}
pub async fn list_semesters(
&self,
request: SemesterListRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<SemesterListResponse>> {
let mut api_req = ApiRequest {
http_method: Method::GET,
api_path: PERFORMANCE_SEMESTER_LIST.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: vec![],
..Default::default()
};
if let Some(page_token) = request.page_token {
api_req.query_params.insert("page_token", page_token);
}
if let Some(page_size) = request.page_size {
api_req
.query_params
.insert("page_size", page_size.to_string());
}
Transport::request(api_req, &self.config, option).await
}
pub async fn query_activities(
&self,
request: ActivityQueryRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ActivityQueryResponse>> {
let mut api_req = ApiRequest {
http_method: Method::GET,
api_path: PERFORMANCE_ACTIVITIES_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: vec![],
..Default::default()
};
if let Some(semester_id) = request.semester_id {
api_req.query_params.insert("semester_id", semester_id);
}
if let Some(page_token) = request.page_token {
api_req.query_params.insert("page_token", page_token);
}
if let Some(page_size) = request.page_size {
api_req
.query_params
.insert("page_size", page_size.to_string());
}
Transport::request(api_req, &self.config, option).await
}
pub async fn query_additional_information(
&self,
request: AdditionalInfoQueryRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<AdditionalInfoQueryResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_ADDITIONAL_INFO_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn import_additional_information(
&self,
request: AdditionalInfoImportRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<AdditionalInfoImportResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_ADDITIONAL_INFO_IMPORT.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn delete_additional_information(
&self,
request: AdditionalInfoDeleteRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<AdditionalInfoDeleteResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_ADDITIONAL_INFO_DELETE.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn write_user_group_members(
&self,
request: UserGroupWriteRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<UserGroupWriteResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_USER_GROUP_WRITE.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn query_reviewees(
&self,
request: RevieweeQueryRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<RevieweeQueryResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_REVIEWEES_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn query_review_templates(
&self,
request: ReviewTemplateQueryRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ReviewTemplateQueryResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_REVIEW_TEMPLATES_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn query_review_items(
&self,
request: ReviewItemQueryRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<ReviewItemQueryResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_REVIEW_ITEMS_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn query_tag_question_configs(
&self,
request: TagQuestionConfigQueryRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<TagQuestionConfigQueryResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_TAG_QUESTIONS_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn query_metrics(
&self,
request: MetricQueryRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<MetricQueryResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_METRICS_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn query_metric_templates(
&self,
request: MetricTemplateQueryRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<MetricTemplateQueryResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_METRIC_TEMPLATES_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn query_metric_fields(
&self,
request: MetricFieldQueryRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<MetricFieldQueryResponse>> {
let api_req = ApiRequest {
http_method: Method::POST,
api_path: PERFORMANCE_METRIC_FIELDS_QUERY.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: serde_json::to_vec(&request)?,
..Default::default()
};
Transport::request(api_req, &self.config, option).await
}
pub async fn list_metric_tags(
&self,
request: MetricTagListRequest,
option: Option<RequestOption>,
) -> SDKResult<BaseResponse<MetricTagListResponse>> {
let mut api_req = ApiRequest {
http_method: Method::GET,
api_path: PERFORMANCE_METRIC_TAGS.to_string(),
supported_access_token_types: vec![AccessTokenType::Tenant, AccessTokenType::User],
body: vec![],
..Default::default()
};
if let Some(page_token) = request.page_token {
api_req.query_params.insert("page_token", page_token);
}
if let Some(page_size) = request.page_size {
api_req
.query_params
.insert("page_size", page_size.to_string());
}
Transport::request(api_req, &self.config, option).await
}
}
impl Service for ReviewConfigService {
fn config(&self) -> &Config {
&self.config
}
fn service_name() -> &'static str {
"review_config"
}
fn service_version() -> &'static str {
"v1"
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SemesterListRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SemesterListResponse {
#[serde(flatten)]
pub semesters: PageResponse<Semester>,
}
impl ApiResponseTrait for SemesterListResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ActivityQueryRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub semester_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ActivityQueryResponse {
#[serde(flatten)]
pub activities: PageResponse<Activity>,
}
impl ApiResponseTrait for ActivityQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdditionalInfoQueryRequest {
pub activity_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_ids: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct AdditionalInfoQueryResponse {
pub additional_information: Vec<AdditionalInformation>,
}
impl ApiResponseTrait for AdditionalInfoQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdditionalInfoImportRequest {
pub activity_id: String,
pub additional_information: Vec<AdditionalInformation>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct AdditionalInfoImportResponse {
pub success: bool,
pub imported_count: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub failed_items: Option<Vec<String>>,
}
impl ApiResponseTrait for AdditionalInfoImportResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdditionalInfoDeleteRequest {
pub activity_id: String,
pub info_ids: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct AdditionalInfoDeleteResponse {
pub success: bool,
pub deleted_count: i32,
}
impl ApiResponseTrait for AdditionalInfoDeleteResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserGroupWriteRequest {
pub group_id: String,
pub member_user_ids: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub operation: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserGroupWriteResponse {
pub success: bool,
pub user_group: UserGroup,
}
impl ApiResponseTrait for UserGroupWriteResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RevieweeQueryRequest {
pub activity_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_ids: Option<Vec<String>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct RevieweeQueryResponse {
pub reviewees: Vec<Reviewee>,
}
impl ApiResponseTrait for RevieweeQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReviewTemplateQueryRequest {
pub activity_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub template_type: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ReviewTemplateQueryResponse {
pub review_templates: Vec<ReviewTemplate>,
}
impl ApiResponseTrait for ReviewTemplateQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReviewItemQueryRequest {
pub template_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ReviewItemQueryResponse {
pub review_items: Vec<ReviewItem>,
}
impl ApiResponseTrait for ReviewItemQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TagQuestionConfigQueryRequest {
pub item_ids: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct TagQuestionConfigQueryResponse {
pub tag_question_configs: Vec<TagQuestionConfig>,
}
impl ApiResponseTrait for TagQuestionConfigQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MetricQueryRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub activity_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub key_only: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MetricQueryResponse {
pub metrics: Vec<Metric>,
}
impl ApiResponseTrait for MetricQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricTemplateQueryRequest {
pub activity_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MetricTemplateQueryResponse {
pub metric_templates: Vec<MetricTemplate>,
}
impl ApiResponseTrait for MetricTemplateQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricFieldQueryRequest {
pub metric_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MetricFieldQueryResponse {
pub metric_fields: Vec<MetricField>,
}
impl ApiResponseTrait for MetricFieldQueryResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MetricTagListRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_size: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MetricTagListResponse {
#[serde(flatten)]
pub metric_tags: PageResponse<MetricTag>,
}
impl ApiResponseTrait for MetricTagListResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}