openlark_workflow/v2/task/
create.rs1use crate::common::{api_endpoints::TaskApiV2, api_utils::*};
6use crate::v2::task::models::{CreateTaskBody, CreateTaskResponse};
7use openlark_core::{
8 SDKResult,
9 api::{ApiRequest, ApiResponseTrait, ResponseFormat},
10 config::Config,
11 validate_required,
12};
13use std::sync::Arc;
14
15#[derive(Debug, Clone)]
17pub struct CreateTaskRequest {
18 config: Arc<Config>,
20 body: CreateTaskBody,
22}
23
24impl CreateTaskRequest {
25 pub fn new(config: Arc<Config>) -> Self {
27 Self {
28 config,
29 body: CreateTaskBody::default(),
30 }
31 }
32
33 pub fn summary(mut self, summary: impl Into<String>) -> Self {
35 self.body.summary = summary.into();
36 self
37 }
38
39 pub fn description(mut self, description: impl Into<String>) -> Self {
41 self.body.description = Some(description.into());
42 self
43 }
44
45 pub fn start(mut self, start: impl Into<String>) -> Self {
47 self.body.start = Some(start.into());
48 self
49 }
50
51 pub fn due(mut self, due: impl Into<String>) -> Self {
53 self.body.due = Some(due.into());
54 self
55 }
56
57 pub fn tasklist_guid(mut self, tasklist_guid: impl Into<String>) -> Self {
59 self.body.tasklist_guid = Some(tasklist_guid.into());
60 self
61 }
62
63 pub fn section_guid(mut self, section_guid: impl Into<String>) -> Self {
65 self.body.section_guid = Some(section_guid.into());
66 self
67 }
68
69 pub fn priority(mut self, priority: i32) -> Self {
71 self.body.priority = Some(priority);
72 self
73 }
74
75 pub fn custom_fields(mut self, custom_fields: serde_json::Value) -> Self {
77 self.body.custom_fields = Some(custom_fields);
78 self
79 }
80
81 pub fn followers(mut self, followers: Vec<String>) -> Self {
83 self.body.followers = Some(followers);
84 self
85 }
86
87 pub fn subtasks(mut self, subtasks: Vec<serde_json::Value>) -> Self {
89 self.body.subtasks = Some(subtasks);
90 self
91 }
92
93 pub fn assignee(mut self, assignee: impl Into<String>) -> Self {
95 self.body.assignee = Some(assignee.into());
96 self
97 }
98
99 pub fn remind_time(mut self, remind_time: impl Into<String>) -> Self {
101 self.body.remind_time = Some(remind_time.into());
102 self
103 }
104
105 pub fn repeat_rule(mut self, repeat_rule: serde_json::Value) -> Self {
107 self.body.repeat_rule = Some(repeat_rule);
108 self
109 }
110
111 pub async fn execute(self) -> SDKResult<CreateTaskResponse> {
113 self.execute_with_options(openlark_core::req_option::RequestOption::default())
114 .await
115 }
116
117 pub async fn execute_with_options(
119 self,
120 option: openlark_core::req_option::RequestOption,
121 ) -> SDKResult<CreateTaskResponse> {
122 validate_required!(self.body.summary.trim(), "任务标题不能为空");
124
125 let api_endpoint = TaskApiV2::TaskCreate;
126 let mut request = ApiRequest::<CreateTaskResponse>::post(api_endpoint.to_url());
127
128 let request_body = &self.body;
129 request = request.body(serialize_params(request_body, "创建任务")?);
130
131 let response =
132 openlark_core::http::Transport::request(request, &self.config, Some(option)).await?;
133 extract_response_data(response, "创建任务")
134 }
135}
136
137impl ApiResponseTrait for CreateTaskResponse {
138 fn data_format() -> ResponseFormat {
139 ResponseFormat::Data
140 }
141}
142
143#[cfg(test)]
144#[allow(unused_imports)]
145mod tests {
146 use std::sync::Arc;
147
148 use super::*;
149
150 #[test]
151 fn test_create_task_builder() {
152 let config = Arc::new(
153 openlark_core::config::Config::builder()
154 .app_id("test")
155 .app_secret("test")
156 .build(),
157 );
158
159 let request = CreateTaskRequest::new(config)
160 .summary("测试任务")
161 .description("任务描述")
162 .priority(3);
163
164 assert_eq!(request.body.summary, "测试任务");
165 assert_eq!(request.body.description, Some("任务描述".to_string()));
166 assert_eq!(request.body.priority, Some(3));
167 }
168
169 #[test]
170 fn test_task_api_v2_url() {
171 let endpoint = TaskApiV2::TaskCreate;
172 assert_eq!(endpoint.to_url(), "/open-apis/task/v2/tasks");
173
174 let endpoint = TaskApiV2::TaskGet("task_123".to_string());
175 assert!(endpoint.to_url().contains("task_123"));
176 }
177}