use crate::client::{api::Hmc, *};
use http::uri::PathAndQuery;
use reqwest::{multipart::*, Response};
#[derive(Debug, Clone)]
pub enum FileId {
Hmc(Hmc),
Id(String),
}
pub async fn upload(
client: &Client,
filename: String,
content_type: String,
data: Vec<u8>,
) -> ClientResult<Response> {
let session_token = if let AuthStatus::Complete(session) = client.auth_status() {
session.session_token
} else {
return Err(ClientError::Unauthenticated);
};
let api = PathAndQuery::from_static("/_harmony/media/upload");
let uri = Uri::from_parts(assign::assign!(client.homeserver_url().clone().into_parts(), { path_and_query: Some(api), })).unwrap();
let form = Form::new().part("file", Part::bytes(data));
let request = client
.data
.http
.post(uri.to_string().as_str())
.multipart(form)
.header("Authorization", session_token)
.query(&[("filename", &filename), ("contentType", &content_type)])
.build()?;
log::debug!("Sending HTTP request: {:?}", request);
let response = client.data.http.execute(request).await?;
log::debug!("Got HTTP response: {:?}", response);
response.error_for_status().map_err(Into::into)
}
pub async fn download(client: &Client, file_id: FileId) -> ClientResult<Response> {
let (scheme, server, id) = match file_id {
FileId::Hmc(hmc) => ("https", hmc.server().to_string(), hmc.id().to_string()),
FileId::Id(id) => {
let url = client.homeserver_url();
(
url.scheme_str().unwrap(), url.authority().unwrap().to_string(), id,
)
}
};
let uri = Uri::builder()
.scheme(scheme)
.authority(server.as_str())
.path_and_query(format!("/_harmony/media/download/{}", id))
.build()?;
let request = client.data.http.get(uri.to_string().as_str()).build()?;
log::debug!("Sending HTTP request: {:?}", request);
let response = client.data.http.execute(request).await?;
log::debug!("Got HTTP response: {:?}", response);
response.error_for_status().map_err(Into::into)
}