aboutsummaryrefslogtreecommitdiff
path: root/src/routes/device.rs
blob: 6f1c371c749506b1fbf6616d862309e38a4d1b79 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
use crate::error::Error;
use crate::storage::Device;
use axum::extract::Path;
use axum::Json;
use ipnetwork::IpNetwork;
use mac_address::MacAddress;
use serde::Deserialize;
use serde_json::{json, Value};
use std::str::FromStr;
use tracing::{debug, info};
use utoipa::ToSchema;

#[utoipa::path(
    get,
    path = "/device/{id}",
    responses(
        (status = 200, description = "Get `Device` information", body = [Device])
    ),
    params(
        ("id" = String, Path, description = "device id")
    ),
    security((), ("api_key" = []))
)]
pub async fn get(Path(id): Path<String>) -> Result<Json<Value>, Error> {
    info!("get device from path {}", id);

    let device = Device::read(&id)?;

    debug!("got device {:?}", device);

    Ok(Json(json!(device)))
}

#[derive(Deserialize, ToSchema)]
pub struct DPayload {
    id: String,
    mac: String,
    broadcast_addr: String,
    ip: Option<String>,
}

#[utoipa::path(
    put,
    path = "/device",
    request_body = DPayload,
    responses(
        (status = 200, description = "add device to storage", body = [Device])
    ),
    security((), ("api_key" = []))
)]
pub async fn put(Json(payload): Json<DPayload>) -> Result<Json<Value>, Error> {
    info!(
        "add device {} ({}, {}, {:?})",
        payload.id, payload.mac, payload.broadcast_addr, payload.ip
    );

    let ip = if let Some(ip_s) = payload.ip {
        Some(IpNetwork::from_str(&ip_s)?)
    } else {
        None
    };
    let mac = MacAddress::from_str(&payload.mac)?;
    let device = Device {
        id: payload.id,
        mac,
        broadcast_addr: payload.broadcast_addr,
        ip,
        times: None,
    };
    device.write()?;

    Ok(Json(json!(device)))
}

#[utoipa::path(
    post,
    path = "/device",
    request_body = DPayload,
    responses(
        (status = 200, description = "update device in storage", body = [Device])
    ),
    security((), ("api_key" = []))
)]
pub async fn post(Json(payload): Json<DPayload>) -> Result<Json<Value>, Error> {
    info!(
        "edit device {} ({}, {}, {:?})",
        payload.id, payload.mac, payload.broadcast_addr, payload.ip
    );

    let ip = if let Some(ip_s) = payload.ip {
        Some(IpNetwork::from_str(&ip_s)?)
    } else {
        None
    };
    let mac = MacAddress::from_str(&payload.mac)?;
    let times = Device::read(&payload.id)?.times;

    let device = Device {
        id: payload.id,
        mac,
        broadcast_addr: payload.broadcast_addr,
        ip,
        times,
    };
    device.write()?;

    Ok(Json(json!(device)))
}