Skip to main content

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

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