Skip to main content

nominal_api/conjure/clients/upload/api/
upload_service.rs

1use conjure_http::endpoint;
2/// The Upload Service manages file uploads to object storage.
3#[conjure_http::conjure_client(name = "UploadService")]
4pub trait UploadService<
5    #[request_writer]
6    O,
7    #[response_body]
8    I: Iterator<
9            Item = Result<conjure_http::private::Bytes, conjure_http::private::Error>,
10        >,
11> {
12    /// Initiates a multipart upload to object storage.
13    /// Returns an uploadId that should be used with listParts, signPart, and completeMultipartUpload.
14    #[endpoint(
15        method = POST,
16        path = "/upload/v1/multipart-upload",
17        name = "initiateMultipartUpload",
18        accept = conjure_http::client::StdResponseDeserializer
19    )]
20    fn initiate_multipart_upload(
21        &self,
22        #[auth]
23        auth_: &conjure_object::BearerToken,
24        #[body(serializer = conjure_http::client::StdRequestSerializer)]
25        upload_request: &super::super::super::super::objects::ingest::api::InitiateMultipartUploadRequest,
26    ) -> Result<
27        super::super::super::super::objects::ingest::api::InitiateMultipartUploadResponse,
28        conjure_http::private::Error,
29    >;
30    /// Lists the parts that have been uploaded for a given uploadId.
31    #[endpoint(
32        method = GET,
33        path = "/upload/v1/multipart-upload/{uploadId}",
34        name = "listParts",
35        accept = conjure_http::client::conjure::CollectionResponseDeserializer
36    )]
37    fn list_parts(
38        &self,
39        #[auth]
40        auth_: &conjure_object::BearerToken,
41        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
42        upload_id: &str,
43        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
44        key: &str,
45    ) -> Result<
46        Vec<super::super::super::super::objects::ingest::api::PartWithSize>,
47        conjure_http::private::Error,
48    >;
49    /// Signs an upload request for a single part.
50    /// Returns a URL that will execute the upload without further authentication.
51    #[endpoint(
52        method = POST,
53        path = "/upload/v1/multipart-upload/{uploadId}",
54        name = "signPart",
55        accept = conjure_http::client::StdResponseDeserializer
56    )]
57    fn sign_part(
58        &self,
59        #[auth]
60        auth_: &conjure_object::BearerToken,
61        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
62        upload_id: &str,
63        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
64        key: &str,
65        #[query(
66            name = "partNumber",
67            encoder = conjure_http::client::conjure::PlainEncoder
68        )]
69        part_number: i32,
70    ) -> Result<
71        super::super::super::super::objects::ingest::api::SignPartResponse,
72        conjure_http::private::Error,
73    >;
74    /// Completes a multipart upload to object storage.
75    /// This should be called after all parts have been uploaded.
76    /// Will throw EmptyMultipartUpload if there are 0 parts.
77    #[endpoint(
78        method = POST,
79        path = "/upload/v1/multipart-upload/{uploadId}/complete",
80        name = "completeMultipartUpload",
81        accept = conjure_http::client::StdResponseDeserializer
82    )]
83    fn complete_multipart_upload(
84        &self,
85        #[auth]
86        auth_: &conjure_object::BearerToken,
87        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
88        upload_id: &str,
89        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
90        key: &str,
91        #[body(serializer = conjure_http::client::StdRequestSerializer)]
92        parts: &[super::super::super::super::objects::ingest::api::Part],
93    ) -> Result<
94        super::super::super::super::objects::ingest::api::CompleteMultipartUploadResponse,
95        conjure_http::private::Error,
96    >;
97    /// Aborts a multipart upload to S3.
98    /// Frees storage used by previously uploaded parts and prevents further uploads to the same uploadId.
99    #[endpoint(
100        method = POST,
101        path = "/upload/v1/multipart-upload/{uploadId}/abort",
102        name = "abortMultipartUpload",
103        accept = conjure_http::client::conjure::EmptyResponseDeserializer
104    )]
105    fn abort_multipart_upload(
106        &self,
107        #[auth]
108        auth_: &conjure_object::BearerToken,
109        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
110        upload_id: &str,
111        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
112        key: &str,
113    ) -> Result<(), conjure_http::private::Error>;
114    /// Returns a short-lived signed GET URL for an object already in the uploads bucket.
115    /// Use this to hand a freshly-uploaded object's path to an external service (e.g. Dagger)
116    /// without giving that service any Scout credentials. The caller must be authorized to
117    /// read the workspace that owns the path (encoded as the first segment of the object key).
118    #[endpoint(
119        method = POST,
120        path = "/upload/v1/sign-download",
121        name = "signDownload",
122        accept = conjure_http::client::StdResponseDeserializer
123    )]
124    fn sign_download(
125        &self,
126        #[auth]
127        auth_: &conjure_object::BearerToken,
128        #[body(serializer = conjure_http::client::StdRequestSerializer)]
129        request: &super::super::super::super::objects::ingest::api::SignDownloadRequest,
130    ) -> Result<
131        super::super::super::super::objects::ingest::api::SignDownloadResponse,
132        conjure_http::private::Error,
133    >;
134    /// Uploads a file to S3. Intended for smaller files.
135    #[endpoint(
136        method = POST,
137        path = "/upload/v1/upload-file",
138        name = "uploadFile",
139        accept = conjure_http::client::StdResponseDeserializer
140    )]
141    fn upload_file(
142        &self,
143        #[auth]
144        auth_: &conjure_object::BearerToken,
145        #[query(
146            name = "fileName",
147            encoder = conjure_http::client::conjure::PlainEncoder
148        )]
149        file_name: &str,
150        #[query(
151            name = "sizeBytes",
152            encoder = conjure_http::client::conjure::PlainSeqEncoder
153        )]
154        size_bytes: Option<conjure_object::SafeLong>,
155        #[query(
156            name = "workspace",
157            encoder = conjure_http::client::conjure::PlainSeqEncoder
158        )]
159        workspace: Option<&conjure_object::ResourceIdentifier>,
160        #[body(serializer = conjure_http::client::conjure::BinaryRequestSerializer)]
161        body: impl conjure_http::client::WriteBody<O>,
162    ) -> Result<String, conjure_http::private::Error>;
163}
164/// The Upload Service manages file uploads to object storage.
165#[conjure_http::conjure_client(name = "UploadService")]
166pub trait AsyncUploadService<
167    #[request_writer]
168    O,
169    #[response_body]
170    I: conjure_http::private::Stream<
171            Item = Result<conjure_http::private::Bytes, conjure_http::private::Error>,
172        >,
173> {
174    /// Initiates a multipart upload to object storage.
175    /// Returns an uploadId that should be used with listParts, signPart, and completeMultipartUpload.
176    #[endpoint(
177        method = POST,
178        path = "/upload/v1/multipart-upload",
179        name = "initiateMultipartUpload",
180        accept = conjure_http::client::StdResponseDeserializer
181    )]
182    async fn initiate_multipart_upload(
183        &self,
184        #[auth]
185        auth_: &conjure_object::BearerToken,
186        #[body(serializer = conjure_http::client::StdRequestSerializer)]
187        upload_request: &super::super::super::super::objects::ingest::api::InitiateMultipartUploadRequest,
188    ) -> Result<
189        super::super::super::super::objects::ingest::api::InitiateMultipartUploadResponse,
190        conjure_http::private::Error,
191    >;
192    /// Lists the parts that have been uploaded for a given uploadId.
193    #[endpoint(
194        method = GET,
195        path = "/upload/v1/multipart-upload/{uploadId}",
196        name = "listParts",
197        accept = conjure_http::client::conjure::CollectionResponseDeserializer
198    )]
199    async fn list_parts(
200        &self,
201        #[auth]
202        auth_: &conjure_object::BearerToken,
203        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
204        upload_id: &str,
205        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
206        key: &str,
207    ) -> Result<
208        Vec<super::super::super::super::objects::ingest::api::PartWithSize>,
209        conjure_http::private::Error,
210    >;
211    /// Signs an upload request for a single part.
212    /// Returns a URL that will execute the upload without further authentication.
213    #[endpoint(
214        method = POST,
215        path = "/upload/v1/multipart-upload/{uploadId}",
216        name = "signPart",
217        accept = conjure_http::client::StdResponseDeserializer
218    )]
219    async fn sign_part(
220        &self,
221        #[auth]
222        auth_: &conjure_object::BearerToken,
223        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
224        upload_id: &str,
225        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
226        key: &str,
227        #[query(
228            name = "partNumber",
229            encoder = conjure_http::client::conjure::PlainEncoder
230        )]
231        part_number: i32,
232    ) -> Result<
233        super::super::super::super::objects::ingest::api::SignPartResponse,
234        conjure_http::private::Error,
235    >;
236    /// Completes a multipart upload to object storage.
237    /// This should be called after all parts have been uploaded.
238    /// Will throw EmptyMultipartUpload if there are 0 parts.
239    #[endpoint(
240        method = POST,
241        path = "/upload/v1/multipart-upload/{uploadId}/complete",
242        name = "completeMultipartUpload",
243        accept = conjure_http::client::StdResponseDeserializer
244    )]
245    async fn complete_multipart_upload(
246        &self,
247        #[auth]
248        auth_: &conjure_object::BearerToken,
249        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
250        upload_id: &str,
251        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
252        key: &str,
253        #[body(serializer = conjure_http::client::StdRequestSerializer)]
254        parts: &[super::super::super::super::objects::ingest::api::Part],
255    ) -> Result<
256        super::super::super::super::objects::ingest::api::CompleteMultipartUploadResponse,
257        conjure_http::private::Error,
258    >;
259    /// Aborts a multipart upload to S3.
260    /// Frees storage used by previously uploaded parts and prevents further uploads to the same uploadId.
261    #[endpoint(
262        method = POST,
263        path = "/upload/v1/multipart-upload/{uploadId}/abort",
264        name = "abortMultipartUpload",
265        accept = conjure_http::client::conjure::EmptyResponseDeserializer
266    )]
267    async fn abort_multipart_upload(
268        &self,
269        #[auth]
270        auth_: &conjure_object::BearerToken,
271        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
272        upload_id: &str,
273        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
274        key: &str,
275    ) -> Result<(), conjure_http::private::Error>;
276    /// Returns a short-lived signed GET URL for an object already in the uploads bucket.
277    /// Use this to hand a freshly-uploaded object's path to an external service (e.g. Dagger)
278    /// without giving that service any Scout credentials. The caller must be authorized to
279    /// read the workspace that owns the path (encoded as the first segment of the object key).
280    #[endpoint(
281        method = POST,
282        path = "/upload/v1/sign-download",
283        name = "signDownload",
284        accept = conjure_http::client::StdResponseDeserializer
285    )]
286    async fn sign_download(
287        &self,
288        #[auth]
289        auth_: &conjure_object::BearerToken,
290        #[body(serializer = conjure_http::client::StdRequestSerializer)]
291        request: &super::super::super::super::objects::ingest::api::SignDownloadRequest,
292    ) -> Result<
293        super::super::super::super::objects::ingest::api::SignDownloadResponse,
294        conjure_http::private::Error,
295    >;
296    /// Uploads a file to S3. Intended for smaller files.
297    #[endpoint(
298        method = POST,
299        path = "/upload/v1/upload-file",
300        name = "uploadFile",
301        accept = conjure_http::client::StdResponseDeserializer
302    )]
303    async fn upload_file(
304        &self,
305        #[auth]
306        auth_: &conjure_object::BearerToken,
307        #[query(
308            name = "fileName",
309            encoder = conjure_http::client::conjure::PlainEncoder
310        )]
311        file_name: &str,
312        #[query(
313            name = "sizeBytes",
314            encoder = conjure_http::client::conjure::PlainSeqEncoder
315        )]
316        size_bytes: Option<conjure_object::SafeLong>,
317        #[query(
318            name = "workspace",
319            encoder = conjure_http::client::conjure::PlainSeqEncoder
320        )]
321        workspace: Option<&conjure_object::ResourceIdentifier>,
322        #[body(serializer = conjure_http::client::conjure::BinaryRequestSerializer)]
323        body: impl conjure_http::client::AsyncWriteBody<O> + Sync + Send,
324    ) -> Result<String, conjure_http::private::Error>;
325}
326/// The Upload Service manages file uploads to object storage.
327#[conjure_http::conjure_client(name = "UploadService", local)]
328pub trait LocalAsyncUploadService<
329    #[request_writer]
330    O,
331    #[response_body]
332    I: conjure_http::private::Stream<
333            Item = Result<conjure_http::private::Bytes, conjure_http::private::Error>,
334        >,
335> {
336    /// Initiates a multipart upload to object storage.
337    /// Returns an uploadId that should be used with listParts, signPart, and completeMultipartUpload.
338    #[endpoint(
339        method = POST,
340        path = "/upload/v1/multipart-upload",
341        name = "initiateMultipartUpload",
342        accept = conjure_http::client::StdResponseDeserializer
343    )]
344    async fn initiate_multipart_upload(
345        &self,
346        #[auth]
347        auth_: &conjure_object::BearerToken,
348        #[body(serializer = conjure_http::client::StdRequestSerializer)]
349        upload_request: &super::super::super::super::objects::ingest::api::InitiateMultipartUploadRequest,
350    ) -> Result<
351        super::super::super::super::objects::ingest::api::InitiateMultipartUploadResponse,
352        conjure_http::private::Error,
353    >;
354    /// Lists the parts that have been uploaded for a given uploadId.
355    #[endpoint(
356        method = GET,
357        path = "/upload/v1/multipart-upload/{uploadId}",
358        name = "listParts",
359        accept = conjure_http::client::conjure::CollectionResponseDeserializer
360    )]
361    async fn list_parts(
362        &self,
363        #[auth]
364        auth_: &conjure_object::BearerToken,
365        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
366        upload_id: &str,
367        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
368        key: &str,
369    ) -> Result<
370        Vec<super::super::super::super::objects::ingest::api::PartWithSize>,
371        conjure_http::private::Error,
372    >;
373    /// Signs an upload request for a single part.
374    /// Returns a URL that will execute the upload without further authentication.
375    #[endpoint(
376        method = POST,
377        path = "/upload/v1/multipart-upload/{uploadId}",
378        name = "signPart",
379        accept = conjure_http::client::StdResponseDeserializer
380    )]
381    async fn sign_part(
382        &self,
383        #[auth]
384        auth_: &conjure_object::BearerToken,
385        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
386        upload_id: &str,
387        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
388        key: &str,
389        #[query(
390            name = "partNumber",
391            encoder = conjure_http::client::conjure::PlainEncoder
392        )]
393        part_number: i32,
394    ) -> Result<
395        super::super::super::super::objects::ingest::api::SignPartResponse,
396        conjure_http::private::Error,
397    >;
398    /// Completes a multipart upload to object storage.
399    /// This should be called after all parts have been uploaded.
400    /// Will throw EmptyMultipartUpload if there are 0 parts.
401    #[endpoint(
402        method = POST,
403        path = "/upload/v1/multipart-upload/{uploadId}/complete",
404        name = "completeMultipartUpload",
405        accept = conjure_http::client::StdResponseDeserializer
406    )]
407    async fn complete_multipart_upload(
408        &self,
409        #[auth]
410        auth_: &conjure_object::BearerToken,
411        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
412        upload_id: &str,
413        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
414        key: &str,
415        #[body(serializer = conjure_http::client::StdRequestSerializer)]
416        parts: &[super::super::super::super::objects::ingest::api::Part],
417    ) -> Result<
418        super::super::super::super::objects::ingest::api::CompleteMultipartUploadResponse,
419        conjure_http::private::Error,
420    >;
421    /// Aborts a multipart upload to S3.
422    /// Frees storage used by previously uploaded parts and prevents further uploads to the same uploadId.
423    #[endpoint(
424        method = POST,
425        path = "/upload/v1/multipart-upload/{uploadId}/abort",
426        name = "abortMultipartUpload",
427        accept = conjure_http::client::conjure::EmptyResponseDeserializer
428    )]
429    async fn abort_multipart_upload(
430        &self,
431        #[auth]
432        auth_: &conjure_object::BearerToken,
433        #[path(name = "uploadId", encoder = conjure_http::client::conjure::PlainEncoder)]
434        upload_id: &str,
435        #[query(name = "key", encoder = conjure_http::client::conjure::PlainEncoder)]
436        key: &str,
437    ) -> Result<(), conjure_http::private::Error>;
438    /// Returns a short-lived signed GET URL for an object already in the uploads bucket.
439    /// Use this to hand a freshly-uploaded object's path to an external service (e.g. Dagger)
440    /// without giving that service any Scout credentials. The caller must be authorized to
441    /// read the workspace that owns the path (encoded as the first segment of the object key).
442    #[endpoint(
443        method = POST,
444        path = "/upload/v1/sign-download",
445        name = "signDownload",
446        accept = conjure_http::client::StdResponseDeserializer
447    )]
448    async fn sign_download(
449        &self,
450        #[auth]
451        auth_: &conjure_object::BearerToken,
452        #[body(serializer = conjure_http::client::StdRequestSerializer)]
453        request: &super::super::super::super::objects::ingest::api::SignDownloadRequest,
454    ) -> Result<
455        super::super::super::super::objects::ingest::api::SignDownloadResponse,
456        conjure_http::private::Error,
457    >;
458    /// Uploads a file to S3. Intended for smaller files.
459    #[endpoint(
460        method = POST,
461        path = "/upload/v1/upload-file",
462        name = "uploadFile",
463        accept = conjure_http::client::StdResponseDeserializer
464    )]
465    async fn upload_file(
466        &self,
467        #[auth]
468        auth_: &conjure_object::BearerToken,
469        #[query(
470            name = "fileName",
471            encoder = conjure_http::client::conjure::PlainEncoder
472        )]
473        file_name: &str,
474        #[query(
475            name = "sizeBytes",
476            encoder = conjure_http::client::conjure::PlainSeqEncoder
477        )]
478        size_bytes: Option<conjure_object::SafeLong>,
479        #[query(
480            name = "workspace",
481            encoder = conjure_http::client::conjure::PlainSeqEncoder
482        )]
483        workspace: Option<&conjure_object::ResourceIdentifier>,
484        #[body(serializer = conjure_http::client::conjure::BinaryRequestSerializer)]
485        body: impl conjure_http::client::LocalAsyncWriteBody<O>,
486    ) -> Result<String, conjure_http::private::Error>;
487}