22
33from __future__ import annotations
44
5+ from typing import Mapping , cast
6+
57import httpx
68
7- from ..types import asset_download_params
8- from .._types import Body , Query , Headers , NotGiven , not_given
9- from .._utils import maybe_transform , async_maybe_transform
9+ from ..types import asset_upload_params , asset_download_params
10+ from .._types import Body , Omit , Query , Headers , NotGiven , omit , not_given
11+ from .._utils import extract_files , maybe_transform , deepcopy_minimal , async_maybe_transform
1012from .._compat import cached_property
1113from .._resource import SyncAPIResource , AsyncAPIResource
1214from .._response import (
1618 async_to_streamed_response_wrapper ,
1719)
1820from .._base_client import make_request_options
21+ from ..types .asset_upload_response import AssetUploadResponse
1922from ..types .asset_download_response import AssetDownloadResponse
2023
2124__all__ = ["AssetsResource" , "AsyncAssetsResource" ]
@@ -78,6 +81,63 @@ def download(
7881 cast_to = AssetDownloadResponse ,
7982 )
8083
84+ def upload (
85+ self ,
86+ * ,
87+ content : str ,
88+ file_name : str | Omit = omit ,
89+ mime_type : str | Omit = omit ,
90+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
91+ # The extra values given here take precedence over values defined on the client or passed to this method.
92+ extra_headers : Headers | None = None ,
93+ extra_query : Query | None = None ,
94+ extra_body : Body | None = None ,
95+ timeout : float | httpx .Timeout | None | NotGiven = not_given ,
96+ ) -> AssetUploadResponse :
97+ """Upload a file to a temporary location.
98+
99+ Supports JSON body with base64 `content`
100+ field, or multipart/form-data with `file` field. Returns a local file URL that
101+ can be used when sending messages with attachments.
102+
103+ Args:
104+ content: Base64-encoded file content (max ~500MB decoded)
105+
106+ file_name: Original filename. Generated if omitted
107+
108+ mime_type: MIME type. Auto-detected from magic bytes if omitted
109+
110+ extra_headers: Send extra headers
111+
112+ extra_query: Add additional query parameters to the request
113+
114+ extra_body: Add additional JSON properties to the request
115+
116+ timeout: Override the client-level default timeout for this request, in seconds
117+ """
118+ body = deepcopy_minimal (
119+ {
120+ "content" : content ,
121+ "file_name" : file_name ,
122+ "mime_type" : mime_type ,
123+ }
124+ )
125+ files = extract_files (cast (Mapping [str , object ], body ), paths = [["file" ]])
126+ if files :
127+ # It should be noted that the actual Content-Type header that will be
128+ # sent to the server will contain a `boundary` parameter, e.g.
129+ # multipart/form-data; boundary=---abc--
130+ extra_headers = {"Content-Type" : "multipart/form-data" , ** (extra_headers or {})}
131+ return self ._post (
132+ "/v1/assets/upload" ,
133+ body = maybe_transform (body , asset_upload_params .AssetUploadParams ),
134+ files = files ,
135+ options = make_request_options (
136+ extra_headers = extra_headers , extra_query = extra_query , extra_body = extra_body , timeout = timeout
137+ ),
138+ cast_to = AssetUploadResponse ,
139+ )
140+
81141
82142class AsyncAssetsResource (AsyncAPIResource ):
83143 """Manage assets in Beeper Desktop, like message attachments"""
@@ -136,6 +196,63 @@ async def download(
136196 cast_to = AssetDownloadResponse ,
137197 )
138198
199+ async def upload (
200+ self ,
201+ * ,
202+ content : str ,
203+ file_name : str | Omit = omit ,
204+ mime_type : str | Omit = omit ,
205+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
206+ # The extra values given here take precedence over values defined on the client or passed to this method.
207+ extra_headers : Headers | None = None ,
208+ extra_query : Query | None = None ,
209+ extra_body : Body | None = None ,
210+ timeout : float | httpx .Timeout | None | NotGiven = not_given ,
211+ ) -> AssetUploadResponse :
212+ """Upload a file to a temporary location.
213+
214+ Supports JSON body with base64 `content`
215+ field, or multipart/form-data with `file` field. Returns a local file URL that
216+ can be used when sending messages with attachments.
217+
218+ Args:
219+ content: Base64-encoded file content (max ~500MB decoded)
220+
221+ file_name: Original filename. Generated if omitted
222+
223+ mime_type: MIME type. Auto-detected from magic bytes if omitted
224+
225+ extra_headers: Send extra headers
226+
227+ extra_query: Add additional query parameters to the request
228+
229+ extra_body: Add additional JSON properties to the request
230+
231+ timeout: Override the client-level default timeout for this request, in seconds
232+ """
233+ body = deepcopy_minimal (
234+ {
235+ "content" : content ,
236+ "file_name" : file_name ,
237+ "mime_type" : mime_type ,
238+ }
239+ )
240+ files = extract_files (cast (Mapping [str , object ], body ), paths = [["file" ]])
241+ if files :
242+ # It should be noted that the actual Content-Type header that will be
243+ # sent to the server will contain a `boundary` parameter, e.g.
244+ # multipart/form-data; boundary=---abc--
245+ extra_headers = {"Content-Type" : "multipart/form-data" , ** (extra_headers or {})}
246+ return await self ._post (
247+ "/v1/assets/upload" ,
248+ body = await async_maybe_transform (body , asset_upload_params .AssetUploadParams ),
249+ files = files ,
250+ options = make_request_options (
251+ extra_headers = extra_headers , extra_query = extra_query , extra_body = extra_body , timeout = timeout
252+ ),
253+ cast_to = AssetUploadResponse ,
254+ )
255+
139256
140257class AssetsResourceWithRawResponse :
141258 def __init__ (self , assets : AssetsResource ) -> None :
@@ -144,6 +261,9 @@ def __init__(self, assets: AssetsResource) -> None:
144261 self .download = to_raw_response_wrapper (
145262 assets .download ,
146263 )
264+ self .upload = to_raw_response_wrapper (
265+ assets .upload ,
266+ )
147267
148268
149269class AsyncAssetsResourceWithRawResponse :
@@ -153,6 +273,9 @@ def __init__(self, assets: AsyncAssetsResource) -> None:
153273 self .download = async_to_raw_response_wrapper (
154274 assets .download ,
155275 )
276+ self .upload = async_to_raw_response_wrapper (
277+ assets .upload ,
278+ )
156279
157280
158281class AssetsResourceWithStreamingResponse :
@@ -162,6 +285,9 @@ def __init__(self, assets: AssetsResource) -> None:
162285 self .download = to_streamed_response_wrapper (
163286 assets .download ,
164287 )
288+ self .upload = to_streamed_response_wrapper (
289+ assets .upload ,
290+ )
165291
166292
167293class AsyncAssetsResourceWithStreamingResponse :
@@ -171,3 +297,6 @@ def __init__(self, assets: AsyncAssetsResource) -> None:
171297 self .download = async_to_streamed_response_wrapper (
172298 assets .download ,
173299 )
300+ self .upload = async_to_streamed_response_wrapper (
301+ assets .upload ,
302+ )
0 commit comments