1
use crate::{
2
    auth::Claims,
3
    data::Data,
4
    data_format::{Rejection, Report, ReviewRequest, ReviewType, Task},
5
    error::{Error, Result},
6
};
7
use actix_web::web::{self, Json, Payload};
8
use futures_util::stream::StreamExt;
9
use std::collections::BTreeMap;
10

            
11
pub async fn get_selectors(data: web::Data<Data>) -> Json<Vec<String>> {
12
    Json(data.selectors().to_vec())
13
}
14

            
15
pub async fn get_review_types(data: web::Data<Data>) -> Json<BTreeMap<String, ReviewType>> {
16
    Json(data.review_types().clone())
17
}
18

            
19
pub async fn get_requests(
20
    claims: Claims,
21
    data: web::Data<Data>,
22
) -> Json<BTreeMap<String, ReviewRequest>> {
23
    Json(data.get_requests(&claims).await)
24
}
25

            
26
/// Add a request for service coming in via the web form.
27
/// The submitter should receive a receipt of their request via mail.
28
pub async fn add_request(data: web::Data<Data>, body: Payload) -> Result<Json<()>> {
29
    let bytes = get_bytes(body).await?;
30
    let _request = data.add_request(&bytes).await?;
31
    Ok(Json(()))
32
}
33

            
34
pub async fn get_rejections(
35
    claims: Claims,
36
    data: web::Data<Data>,
37
) -> Json<BTreeMap<String, Rejection>> {
38
    Json(data.get_rejections(&claims).await)
39
}
40

            
41
pub async fn add_rejection(data: web::Data<Data>, body: Payload) -> Result<Json<()>> {
42
    let bytes = get_bytes(body).await?;
43
    let _rejection = data.add_rejection(&bytes).await?;
44
    Ok(Json(()))
45
}
46

            
47
pub async fn get_tasks(data: web::Data<Data>) -> Json<BTreeMap<String, Task>> {
48
    Json(data.tasks().await)
49
}
50

            
51
/// Add a task for a partner to handle a request.
52
/// A mail should be sent to the partner that a task has been added.
53
pub async fn add_task(claims: Claims, data: web::Data<Data>, body: Payload) -> Result<Json<()>> {
54
    // check that the request comes from a selector
55
    if data.is_selector(&claims) {
56
        let bytes = get_bytes(body).await?;
57
        let _task = data.add_task(&data.config, &bytes).await?;
58
    } else {
59
        return Err(Error::Msg("You are not allowed to add a task.".into()));
60
    }
61
    Ok(Json(()))
62
}
63

            
64
pub async fn get_reports(data: web::Data<Data>) -> Json<BTreeMap<String, Report>> {
65
    Json(data.reports().await)
66
}
67

            
68
pub async fn add_report(claims: Claims, data: web::Data<Data>, body: Payload) -> Result<Json<()>> {
69
    let bytes = get_bytes(body).await?;
70
    let _report = data.add_report(&bytes, &claims).await?;
71
    Ok(Json(()))
72
}
73

            
74
pub async fn add_file(data: web::Data<Data>, body: Payload) -> Result<Json<String>> {
75
    let bytes = get_bytes(body).await?;
76
    let name = data.add_file(&bytes).await?;
77
    Ok(Json(name))
78
}
79

            
80
async fn get_bytes(mut body: Payload) -> Result<Vec<u8>> {
81
    let mut bytes = web::BytesMut::new();
82
    while let Some(item) = body.next().await {
83
        bytes.extend_from_slice(&item?);
84
    }
85
    Ok(bytes.to_vec())
86
}