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_session(
78 &self,
79 body: crate::models::schemas::CreateFileUploadSessionRequest,
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_version_upload_session(
93 &self,
94 file_id: String,
95 body: crate::models::schemas::CreateFileVersionUploadSessionRequest,
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 req = runtime::with_stream_body(
144 req,
145 runtime::Stream::from_bytes(body),
146 "application/octet-stream",
147 );
148 let resp = self.session.fetch(req).await?;
149 let data = runtime::response_bytes(&resp)?;
150 Ok(serde_json::from_slice(&data)?)
151 }
152
153 pub async fn delete_file_upload_session(&self, upload_session_id: String) -> Result<(), Error> {
154 let mut url = self.session.base_url("upload_session");
155 url.push_str("/files");
156 url.push_str("/upload_sessions");
157 url.push('/');
158 let seg = path_escape(&upload_session_id);
159 url.push_str(&seg);
160 let req = self.session.new_request("DELETE", &url);
161 let _ = self.session.fetch(req).await?;
162 Ok(())
163 }
164
165 async fn list_file_upload_session_parts_page(
166 &self,
167 upload_session_id: String,
168 opts: Option<ChunkedUploadsListFileUploadSessionPartsOptions>,
169 ) -> Result<crate::models::schemas::UploadParts, Error> {
170 let mut url = self.session.base_url("upload_session");
171 url.push_str("/files");
172 url.push_str("/upload_sessions");
173 url.push('/');
174 let seg = path_escape(&upload_session_id);
175 url.push_str(&seg);
176 url.push_str("/parts");
177 let mut req = self.session.new_request("GET", &url);
178 let opts = opts.unwrap_or_default();
179 if let Some(value) = opts.offset {
180 req = runtime::with_query(req, "offset", &value.to_string());
181 }
182 if let Some(value) = opts.limit {
183 req = runtime::with_query(req, "limit", &value.to_string());
184 }
185 let resp = self.session.fetch(req).await?;
186 let data = runtime::response_bytes(&resp)?;
187 Ok(serde_json::from_slice(&data)?)
188 }
189
190 pub fn list_file_upload_session_parts(
192 &self,
193 upload_session_id: String,
194 opts: Option<ChunkedUploadsListFileUploadSessionPartsOptions>,
195 ) -> ChunkedUploadsListFileUploadSessionPartsPaginator {
196 ChunkedUploadsListFileUploadSessionPartsPaginator {
197 manager: ChunkedUploadsManager::new(self.session.clone()),
198 upload_session_id,
199 options: opts.unwrap_or_default(),
200 buffer: Vec::new().into_iter(),
201 done: false,
202 }
203 }
204
205 pub async fn commit_file_upload_session(
206 &self,
207 upload_session_id: String,
208 digest: String,
209 body: crate::models::schemas::CommitFileUploadSessionRequest,
210 opts: Option<ChunkedUploadsCommitFileUploadSessionOptions>,
211 ) -> Result<crate::models::schemas::Files, Error> {
212 let mut url = self.session.base_url("upload_session");
213 url.push_str("/files");
214 url.push_str("/upload_sessions");
215 url.push('/');
216 let seg = path_escape(&upload_session_id);
217 url.push_str(&seg);
218 url.push_str("/commit");
219 let mut req = self.session.new_request("POST", &url);
220 req = runtime::with_header(req, "digest", &digest);
221 let opts = opts.unwrap_or_default();
222 if let Some(value) = opts.if_match {
223 req = runtime::with_header(req, "if-match", &value);
224 }
225 if let Some(value) = opts.if_none_match {
226 req = runtime::with_header(req, "if-none-match", &value);
227 }
228 let payload = serde_json::to_vec(&body)?;
229 req = runtime::with_json_body(req, &payload);
230 let resp = self.session.fetch(req).await?;
231 let data = runtime::response_bytes(&resp)?;
232 Ok(serde_json::from_slice(&data)?)
233 }
234}