web/files.rs
1use std::sync::Arc;
2
3use crate::AppState;
4use axum::{
5 extract::{Path, State},
6 http::{HeaderMap, StatusCode, header},
7 response::IntoResponse,
8};
9
10#[derive(Debug)]
11pub struct S3File {
12 pub name: String,
13 pub link: String,
14}
15
16pub async fn download_file(
17 State(_data): State<Arc<AppState>>,
18 Path(_file_name): Path<String>,
19) -> Result<impl IntoResponse, StatusCode> {
20 let bytes = vec![1, 2, 3];
21 let mut headers = HeaderMap::new();
22 headers.insert(
23 header::CONTENT_TYPE,
24 header::HeaderValue::from_static("application/octet-stream"),
25 );
26 headers.insert(
27 header::CONTENT_DISPOSITION,
28 header::HeaderValue::from_static("attachment"),
29 );
30
31 Ok((headers, bytes).into_response())
32}
33
34pub async fn list_s3(State(_data): State<Arc<AppState>>) -> Result<Vec<S3File>, StatusCode> {
35 /*
36 let client = &data.s3.clone();
37
38 let list_req = ListObjectsRequest {
39 bucket: data.conf.s3_bucket.clone(),
40 prefix: Some("files/".to_string()),
41 ..Default::default()
42 };
43
44 client
45 .list_objects(list_req)
46 .await
47 .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?
48 .contents
49 .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?
50 .iter()
51 .map(|obj| -> Result<S3File, StatusCode> {
52 let name = obj
53 .key
54 .as_ref()
55 .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?
56 .strip_prefix("files/")
57 .ok_or(StatusCode::INTERNAL_SERVER_ERROR)?
58 .to_owned();
59 let link = format!("/api/files/download/{}", name);
60
61 Ok(S3File { name, link })
62 })
63 .collect()
64 */
65 Ok(vec![])
66}