crud_file_server/
serve.rs

1use crate::{Config, State};
2use async_std::fs::{remove_file, OpenOptions};
3use async_std::io;
4use async_std::sync::Arc;
5use tide::{Body, Request, Response, StatusCode};
6use uuid::Uuid;
7
8async fn post(req: Request<Arc<State>>) -> tide::Result<String> {
9    let name = Uuid::new_v4().to_string();
10    let path = req.state().dir_path.join(&name);
11    let file = OpenOptions::new()
12        .create_new(true)
13        .write(true)
14        .open(&path)
15        .await?;
16    io::copy(req, file).await?;
17    Ok(name)
18}
19
20async fn get(req: Request<Arc<State>>) -> tide::Result<Response> {
21    let path = req.state().dir_path.join(req.param("file")?);
22    match Body::from_file(path).await {
23        Ok(body) => Ok(body.into()),
24        Err(_) => Ok(Response::new(StatusCode::NotFound)),
25    }
26}
27
28async fn put(req: Request<Arc<State>>) -> tide::Result<Response> {
29    let path = req.state().dir_path.join(req.param("file")?);
30    if path.exists().await {
31        remove_file(&path).await?;
32    }
33    let file = OpenOptions::new()
34        .create_new(true)
35        .write(true)
36        .open(&path)
37        .await?;
38    io::copy(req, file).await?;
39    Ok(Response::new(StatusCode::Ok))
40}
41
42async fn patch(req: Request<Arc<State>>) -> tide::Result<Response> {
43    let path = req.state().dir_path.join(req.param("file")?);
44    let file = OpenOptions::new()
45        .create(true)
46        .append(true)
47        .open(&path)
48        .await?;
49    io::copy(req, file).await?;
50    Ok(Response::new(StatusCode::Ok))
51}
52
53async fn delete(req: Request<Arc<State>>) -> tide::Result<Response> {
54    let path = req.state().dir_path.join(req.param("file")?);
55    remove_file(&path).await?;
56    Ok(Response::new(StatusCode::Ok))
57}
58
59pub async fn serve(config: Config) -> Result<(), Box<dyn std::error::Error>> {
60    let srv_addr = config.srv_addr.clone();
61    let mut app = tide::with_state(Arc::new(State::from_config(config).await?));
62    app.at("/").post(post);
63    app.at(":file")
64        .get(get)
65        .put(put)
66        .patch(patch)
67        .delete(delete);
68    app.listen(srv_addr).await?;
69    Ok(())
70}