use reqwest::Method;
use serde::{Deserialize, Serialize};
use crate::{
core::{
api_req::ApiRequest,
api_resp::{ApiResponseTrait, BaseResponse},
constants::AccessTokenType,
http::Transport,
req_option::RequestOption,
standard_response::StandardResponse,
validation::{self, ValidationResult},
SDKResult,
},
service::im::v1::message::{ListMessageIterator, Message},
};
use super::MessageService;
#[derive(Default, Clone)]
pub struct ListMessageRequest {
pub api_req: ApiRequest,
}
impl ListMessageRequest {
pub fn builder() -> ListMessageRequestBuilder {
ListMessageRequestBuilder::default()
}
}
#[derive(Default)]
pub struct ListMessageRequestBuilder {
request: ListMessageRequest,
}
impl ListMessageRequestBuilder {
pub fn container_id_type(mut self, container_id_type: impl ToString) -> Self {
self.request
.api_req
.query_params
.insert("container_id_type", container_id_type.to_string());
self
}
pub fn container_id(mut self, container_id: impl ToString) -> Self {
self.request
.api_req
.query_params
.insert("container_id", container_id.to_string());
self
}
pub fn start_time(mut self, start_time: i64) -> Self {
self.request
.api_req
.query_params
.insert("start_time", start_time.to_string());
self
}
pub fn end_time(mut self, end_time: i64) -> Self {
self.request
.api_req
.query_params
.insert("end_time", end_time.to_string());
self
}
pub fn sort_type(mut self, sort_type: impl ToString) -> Self {
self.request
.api_req
.query_params
.insert("sort_type", sort_type.to_string());
self
}
pub fn page_token(mut self, page_token: impl ToString) -> Self {
self.request
.api_req
.query_params
.insert("page_token", page_token.to_string());
self
}
pub fn page_size(mut self, page_size: i32) -> Self {
match validation::validate_page_size(page_size as u32, "page_size") {
ValidationResult::Valid => {}
ValidationResult::Warning(msg) => {
log::warn!("Page size validation warning: {}", msg);
}
ValidationResult::Invalid(msg) => {
log::error!("Invalid page size: {}", msg);
}
}
self.request
.api_req
.query_params
.insert("page_size", page_size.to_string());
self
}
pub fn build(self) -> ListMessageRequest {
if let Some(page_token) = self.request.api_req.query_params.get("page_token") {
match validation::validate_page_token(page_token, "page_token") {
ValidationResult::Valid => {}
ValidationResult::Warning(msg) => {
log::warn!("Page token validation warning: {}", msg);
}
ValidationResult::Invalid(msg) => {
log::error!("Invalid page token: {}", msg);
}
}
}
self.request
}
pub fn with_pagination(
mut self,
page_size: Option<u32>,
page_token: Option<String>,
) -> SDKResult<Self> {
let mut pagination_builder =
validation::pagination::PaginationRequestBuilder::<ListMessageRespData>::new();
if let Some(size) = page_size {
pagination_builder = pagination_builder.with_page_size(size);
}
if let Some(token) = page_token {
pagination_builder = pagination_builder.with_page_token(token);
}
let params = pagination_builder.build()?;
for (key, value) in params {
self.request.api_req.query_params.insert(key, value);
}
Ok(self)
}
}
crate::impl_executable_builder_owned!(
ListMessageRequestBuilder,
MessageService,
ListMessageRequest,
ListMessageRespData,
list
);
#[derive(Debug, Serialize, Deserialize)]
pub struct ListMessageRespData {
pub has_more: bool,
pub page_token: Option<String>,
pub items: Vec<Message>,
}
impl ApiResponseTrait for ListMessageRespData {
fn data_format() -> crate::core::api_resp::ResponseFormat {
crate::core::api_resp::ResponseFormat::Data
}
}
impl MessageService {
pub async fn list(
&self,
list_message_request: ListMessageRequest,
option: Option<RequestOption>,
) -> SDKResult<ListMessageRespData> {
let mut api_req = list_message_request.api_req;
api_req.http_method = Method::GET;
api_req.api_path = crate::core::endpoints::im::IM_V1_LIST_MESSAGE.to_string();
api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
let api_resp: BaseResponse<ListMessageRespData> =
Transport::request(api_req, &self.config, option).await?;
api_resp.into_result()
}
pub fn list_iter(
&self,
list_message_request: ListMessageRequest,
_option: Option<RequestOption>,
) -> ListMessageIterator<'_> {
ListMessageIterator::new(self, list_message_request)
}
pub async fn list_with_validated_pagination(
&self,
container_id: impl ToString,
container_id_type: impl ToString,
page_size: Option<u32>,
page_token: Option<String>,
option: Option<RequestOption>,
) -> SDKResult<ListMessageRespData> {
let builder = ListMessageRequest::builder()
.container_id(container_id)
.container_id_type(container_id_type)
.with_pagination(page_size, page_token)?;
self.list(builder.build(), option).await
}
}