box_open_sdk/managers/
chunked_uploads.rs1use crate::internal::path_escape;
4use crate::runtime::{self, Error};
5
6#[derive(Clone, Debug, Default)]
8pub struct ChunkedUploadsListFileUploadSessionPartsOptions {
9 pub offset: Option<i64>,
10 pub limit: Option<i64>,
11}
12
13#[derive(Clone, Debug, Default)]
15pub struct ChunkedUploadsCommitFileUploadSessionOptions {
16 pub if_match: Option<String>,
17 pub if_none_match: Option<String>,
18}
19
20pub struct ChunkedUploadsListFileUploadSessionPartsPaginator {
23 manager: ChunkedUploadsManager,
24 upload_session_id: String,
25 options: ChunkedUploadsListFileUploadSessionPartsOptions,
26 buffer: std::vec::IntoIter<crate::models::schemas::UploadPart>,
27 done: bool,
28}
29
30impl ChunkedUploadsListFileUploadSessionPartsPaginator {
31 pub async fn next(&mut self) -> Option<Result<crate::models::schemas::UploadPart, Error>> {
34 loop {
35 if let Some(item) = self.buffer.next() {
36 return Some(Ok(item));
37 }
38 if self.done {
39 return None;
40 }
41 let page = match self
42 .manager
43 .list_file_upload_session_parts_page(
44 self.upload_session_id.clone(),
45 Some(self.options.clone()),
46 )
47 .await
48 {
49 Ok(page) => page,
50 Err(err) => {
51 self.done = true;
52 return Some(Err(err));
53 }
54 };
55 let items = page.entries.unwrap_or_default();
56 if items.is_empty() {
57 self.done = true;
58 } else {
59 let next = self.options.offset.unwrap_or(0) + items.len() as i64;
60 self.options.offset = Some(next);
61 }
62 self.buffer = items.into_iter();
63 }
64 }
65}
66
67pub struct ChunkedUploadsManager {
69 session: std::sync::Arc<runtime::Client>,
70}
71
72impl ChunkedUploadsManager {
73 pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
74 Self { session }
75 }
76
77 pub async fn create_file_upload_sessions(
78 &self,
79 body: crate::models::schemas::FileUploadSessionsCreateRequest,
80 ) -> Result<crate::models::schemas::UploadSession, Error> {
81 let mut url = self.session.base_url("upload");
82 url.push_str("/files");
83 url.push_str("/upload_sessions");
84 let mut req = self.session.new_request("POST", &url);
85 let payload = serde_json::to_vec(&body)?;
86 req = runtime::with_json_body(req, &payload);
87 let resp = self.session.fetch(req).await?;
88 let data = runtime::response_bytes(&resp)?;
89 Ok(serde_json::from_slice(&data)?)
90 }
91
92 pub async fn create_file_by_id_upload_sessions(
93 &self,
94 file_id: String,
95 body: crate::models::schemas::FileIdUploadSessionsCreateRequest,
96 ) -> Result<crate::models::schemas::UploadSession, Error> {
97 let mut url = self.session.base_url("upload");
98 url.push_str("/files");
99 url.push('/');
100 let seg = path_escape(&file_id);
101 url.push_str(&seg);
102 url.push_str("/upload_sessions");
103 let mut req = self.session.new_request("POST", &url);
104 let payload = serde_json::to_vec(&body)?;
105 req = runtime::with_json_body(req, &payload);
106 let resp = self.session.fetch(req).await?;
107 let data = runtime::response_bytes(&resp)?;
108 Ok(serde_json::from_slice(&data)?)
109 }
110
111 pub async fn get_file_upload_session(
112 &self,
113 upload_session_id: String,
114 ) -> Result<crate::models::schemas::UploadSession, Error> {
115 let mut url = self.session.base_url("upload_session");
116 url.push_str("/files");
117 url.push_str("/upload_sessions");
118 url.push('/');
119 let seg = path_escape(&upload_session_id);
120 url.push_str(&seg);
121 let req = self.session.new_request("GET", &url);
122 let resp = self.session.fetch(req).await?;
123 let data = runtime::response_bytes(&resp)?;
124 Ok(serde_json::from_slice(&data)?)
125 }
126
127 pub async fn update_file_upload_session(
128 &self,
129 upload_session_id: String,
130 digest: String,
131 content_range: String,
132 body: Vec<u8>,
133 ) -> Result<crate::models::schemas::UploadedPart, Error> {
134 let mut url = self.session.base_url("upload_session");
135 url.push_str("/files");
136 url.push_str("/upload_sessions");
137 url.push('/');
138 let seg = path_escape(&upload_session_id);
139 url.push_str(&seg);
140 let mut req = self.session.new_request("PUT", &url);
141 req = runtime::with_header(req, "digest", &digest);
142 req = runtime::with_header(req, "content-range", &content_range);
143 let _ = &body;
144 req = runtime::with_stream_body(req, runtime::Stream::empty(), "application/octet-stream");
145 let resp = self.session.fetch(req).await?;
146 let data = runtime::response_bytes(&resp)?;
147 Ok(serde_json::from_slice(&data)?)
148 }
149
150 pub async fn delete_file_upload_session(&self, upload_session_id: String) -> Result<(), Error> {
151 let mut url = self.session.base_url("upload_session");
152 url.push_str("/files");
153 url.push_str("/upload_sessions");
154 url.push('/');
155 let seg = path_escape(&upload_session_id);
156 url.push_str(&seg);
157 let req = self.session.new_request("DELETE", &url);
158 let _ = self.session.fetch(req).await?;
159 Ok(())
160 }
161
162 async fn list_file_upload_session_parts_page(
163 &self,
164 upload_session_id: String,
165 opts: Option<ChunkedUploadsListFileUploadSessionPartsOptions>,
166 ) -> Result<crate::models::schemas::UploadParts, Error> {
167 let mut url = self.session.base_url("upload_session");
168 url.push_str("/files");
169 url.push_str("/upload_sessions");
170 url.push('/');
171 let seg = path_escape(&upload_session_id);
172 url.push_str(&seg);
173 url.push_str("/parts");
174 let mut req = self.session.new_request("GET", &url);
175 let opts = opts.unwrap_or_default();
176 if let Some(value) = opts.offset {
177 req = runtime::with_query(req, "offset", &value.to_string());
178 }
179 if let Some(value) = opts.limit {
180 req = runtime::with_query(req, "limit", &value.to_string());
181 }
182 let resp = self.session.fetch(req).await?;
183 let data = runtime::response_bytes(&resp)?;
184 Ok(serde_json::from_slice(&data)?)
185 }
186
187 pub fn list_file_upload_session_parts(
189 &self,
190 upload_session_id: String,
191 opts: Option<ChunkedUploadsListFileUploadSessionPartsOptions>,
192 ) -> ChunkedUploadsListFileUploadSessionPartsPaginator {
193 ChunkedUploadsListFileUploadSessionPartsPaginator {
194 manager: ChunkedUploadsManager::new(self.session.clone()),
195 upload_session_id,
196 options: opts.unwrap_or_default(),
197 buffer: Vec::new().into_iter(),
198 done: false,
199 }
200 }
201
202 pub async fn commit_file_upload_session(
203 &self,
204 upload_session_id: String,
205 digest: String,
206 body: crate::models::schemas::FileUploadSessionCommitRequest,
207 opts: Option<ChunkedUploadsCommitFileUploadSessionOptions>,
208 ) -> Result<crate::models::schemas::Files, Error> {
209 let mut url = self.session.base_url("upload_session");
210 url.push_str("/files");
211 url.push_str("/upload_sessions");
212 url.push('/');
213 let seg = path_escape(&upload_session_id);
214 url.push_str(&seg);
215 url.push_str("/commit");
216 let mut req = self.session.new_request("POST", &url);
217 req = runtime::with_header(req, "digest", &digest);
218 let opts = opts.unwrap_or_default();
219 if let Some(value) = opts.if_match {
220 req = runtime::with_header(req, "if-match", &value);
221 }
222 if let Some(value) = opts.if_none_match {
223 req = runtime::with_header(req, "if-none-match", &value);
224 }
225 let payload = serde_json::to_vec(&body)?;
226 req = runtime::with_json_body(req, &payload);
227 let resp = self.session.fetch(req).await?;
228 let data = runtime::response_bytes(&resp)?;
229 Ok(serde_json::from_slice(&data)?)
230 }
231}