use log::error;
use serde::{Deserialize, Serialize};
use crate::{
core::{
api_req::ApiRequest,
validation::{
message_limits, uuid_limits, validate_content_size, validate_required,
validate_string_length,
},
},
service::im::v1::message::{Message, SendMessageTrait},
};
use super::MessageService;
#[derive(Debug, Clone, Default)]
pub struct CreateMessageRequest {
pub api_req: ApiRequest,
}
impl CreateMessageRequest {
pub fn builder() -> CreateMessageRequestBuilder {
CreateMessageRequestBuilder::default()
}
}
#[derive(Default)]
pub struct CreateMessageRequestBuilder {
request: CreateMessageRequest,
}
impl CreateMessageRequestBuilder {
pub fn receive_id(mut self, receive_id: impl ToString) -> Self {
self.request
.api_req
.query_params
.insert("receive_id", receive_id.to_string());
self
}
pub fn msg_type(mut self, msg_type: impl ToString) -> Self {
self.request
.api_req
.query_params
.insert("msg_type", msg_type.to_string());
self
}
pub fn content(mut self, content: impl ToString) -> Self {
self.request
.api_req
.query_params
.insert("content", content.to_string());
self
}
pub fn receive_id_type(mut self, receive_id_type: impl ToString) -> Self {
self.request
.api_req
.query_params
.insert("receive_id_type", receive_id_type.to_string());
self
}
pub fn request_body(mut self, body: CreateMessageRequestBody) -> Self {
match serde_json::to_vec(&body) {
Ok(bytes) => {
self.request.api_req.body = bytes;
}
Err(e) => {
error!("Failed to serialize request body: {}", e);
self.request.api_req.body = Vec::new();
}
}
self
}
pub fn build(self) -> CreateMessageRequest {
self.request
}
}
crate::impl_executable_builder_owned!(
CreateMessageRequestBuilder,
MessageService,
CreateMessageRequest,
Message,
create
);
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct CreateMessageRequestBody {
pub receive_id: String,
pub msg_type: String,
pub content: String,
pub uuid: Option<String>,
}
impl CreateMessageRequestBody {
pub fn builder() -> CreateMessageRequestBodyBuilder {
CreateMessageRequestBodyBuilder::default()
}
}
#[derive(Default)]
pub struct CreateMessageRequestBodyBuilder {
request: CreateMessageRequestBody,
}
impl CreateMessageRequestBodyBuilder {
pub fn receive_id(mut self, receive_id: impl ToString) -> Self {
self.request.receive_id = receive_id.to_string();
self
}
pub fn msg_type(mut self, msg_type: impl ToString) -> Self {
self.request.msg_type = msg_type.to_string();
self
}
pub fn content(mut self, content: impl ToString) -> Self {
self.request.content = content.to_string();
self
}
pub fn uuid(mut self, uuid: impl ToString) -> Self {
let uuid_str = uuid.to_string();
let validated_uuid = validate_string_length(uuid_str, uuid_limits::MAX_LENGTH, "UUID");
self.request.uuid = Some(validated_uuid);
self
}
pub fn build(self) -> CreateMessageRequestBody {
validate_required(&self.request.receive_id, "receive_id");
validate_required(&self.request.msg_type, "msg_type");
validate_required(&self.request.content, "content");
match self.request.msg_type.as_str() {
"text" => {
validate_content_size(
&self.request.content,
message_limits::TEXT_MESSAGE_MAX_SIZE,
"Text message",
);
}
"post" | "interactive" => {
validate_content_size(
&self.request.content,
message_limits::RICH_MESSAGE_MAX_SIZE,
"Post/interactive message",
);
}
_ => {
}
}
self.request
}
}
#[derive(Debug, Clone, Default)]
pub struct UpdateMessageRequest {
pub api_req: ApiRequest,
}
impl UpdateMessageRequest {
pub fn builder() -> UpdateMessageRequestBuilder {
UpdateMessageRequestBuilder::default()
}
}
#[derive(Default)]
pub struct UpdateMessageRequestBuilder {
request: UpdateMessageRequest,
}
impl UpdateMessageRequestBuilder {
pub fn content(mut self, content: impl ToString) -> Self {
self.request
.api_req
.query_params
.insert("content", content.to_string());
self
}
pub fn build(self) -> UpdateMessageRequest {
self.request
}
}
impl CreateMessageRequest {
pub fn with_msg<T: SendMessageTrait>(receive_id: &str, msg: T, receive_id_type: &str) -> Self {
let mut api_req = ApiRequest::default();
api_req
.query_params
.insert("receive_id", receive_id.to_string());
api_req.query_params.insert("msg_type", msg.msg_type());
api_req.query_params.insert("content", msg.content());
api_req
.query_params
.insert("receive_id_type", receive_id_type.to_string());
Self { api_req }
}
}