Skip to content

Commit 1761ba9

Browse files
aw-server: Implement swagger for some endpoints
1 parent 5c68853 commit 1761ba9

File tree

9 files changed

+169
-21
lines changed

9 files changed

+169
-21
lines changed

Cargo.lock

+89
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

aw-client-rust/src/lib.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
extern crate aw_models;
12
extern crate gethostname;
23
extern crate reqwest;
3-
#[macro_use]
4-
extern crate aw_models;
54
extern crate serde_json;
65

76
use std::collections::HashMap;

aw-models/src/timeinterval.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use std::fmt;
22

3-
use serde::de::{self, Deserialize, Deserializer, Visitor};
3+
use serde::de::Error as DeserializeError;
4+
use serde::de::Visitor;
5+
use serde::{Deserialize, Deserializer};
46

57
use chrono::DateTime;
68
use chrono::Duration;
@@ -72,13 +74,16 @@ impl<'de> Visitor<'de> for TimeIntervalVisitor {
7274

7375
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
7476
where
75-
E: de::Error,
77+
E: DeserializeError,
7678
{
7779
match TimeInterval::new_from_string(&value) {
7880
Ok(ti) => Ok(ti),
7981
Err(e) => {
8082
warn!("{:?}", e);
81-
Err(de::Error::invalid_value(Unexpected::Str(value), &self))
83+
Err(DeserializeError::invalid_value(
84+
Unexpected::Str(value),
85+
&self,
86+
))
8287
}
8388
}
8489
}

aw-server/Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ toml = "0.5"
2929
gethostname = "0.2"
3030
uuid = { version = "0.8", features = ["serde", "v4"] }
3131
getopts = "0.2"
32+
rocket_okapi = "0.5"
33+
schemars = "0.7"
34+
okapi = { version = "0.4", features = ["derive_json_schema"] }
3235

3336
aw-datastore = { path = "../aw-datastore" }
3437
aw-models = { path = "../aw-models" }

aw-server/src/endpoints/bucket.rs

+17-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::collections::HashMap;
2-
use std::io::Cursor;
32

43
use rocket_contrib::json::Json;
54

@@ -10,13 +9,13 @@ use aw_models::Bucket;
109
use aw_models::BucketsExport;
1110
use aw_models::Event;
1211

13-
use rocket::http::Header;
1412
use rocket::http::Status;
15-
use rocket::response::Response;
1613
use rocket::State;
14+
use rocket_okapi::openapi;
1715

1816
use crate::endpoints::{HttpErrorJson, ServerState};
1917

18+
#[openapi]
2019
#[get("/")]
2120
pub fn buckets_get(
2221
state: State<ServerState>,
@@ -28,6 +27,7 @@ pub fn buckets_get(
2827
}
2928
}
3029

30+
#[openapi]
3131
#[get("/<bucket_id>")]
3232
pub fn bucket_get(
3333
bucket_id: String,
@@ -40,6 +40,7 @@ pub fn bucket_get(
4040
}
4141
}
4242

43+
#[openapi]
4344
#[post("/<bucket_id>", data = "<message>", format = "application/json")]
4445
pub fn bucket_new(
4546
bucket_id: String,
@@ -58,6 +59,7 @@ pub fn bucket_new(
5859
}
5960
}
6061

62+
#[openapi]
6163
#[get("/<bucket_id>/events?<start>&<end>&<limit>")]
6264
pub fn bucket_events_get(
6365
bucket_id: String,
@@ -102,6 +104,7 @@ pub fn bucket_events_get(
102104
}
103105
}
104106

107+
#[openapi]
105108
#[post("/<bucket_id>/events", data = "<events>", format = "application/json")]
106109
pub fn bucket_events_create(
107110
bucket_id: String,
@@ -116,6 +119,7 @@ pub fn bucket_events_create(
116119
}
117120
}
118121

122+
#[openapi]
119123
#[post(
120124
"/<bucket_id>/heartbeat?<pulsetime>",
121125
data = "<heartbeat_json>",
@@ -135,6 +139,7 @@ pub fn bucket_events_heartbeat(
135139
}
136140
}
137141

142+
#[openapi]
138143
#[get("/<bucket_id>/events/count")]
139144
pub fn bucket_event_count(
140145
bucket_id: String,
@@ -148,6 +153,7 @@ pub fn bucket_event_count(
148153
}
149154
}
150155

156+
#[openapi]
151157
#[delete("/<bucket_id>/events/<event_id>")]
152158
pub fn bucket_events_delete_by_id(
153159
bucket_id: String,
@@ -161,11 +167,12 @@ pub fn bucket_events_delete_by_id(
161167
}
162168
}
163169

170+
#[openapi]
164171
#[get("/<bucket_id>/export")]
165172
pub fn bucket_export(
166173
bucket_id: String,
167174
state: State<ServerState>,
168-
) -> Result<Response, HttpErrorJson> {
175+
) -> Result<Json<BucketsExport>, HttpErrorJson> {
169176
let datastore = endpoints_get_lock!(state.datastore);
170177
let mut export = BucketsExport {
171178
buckets: HashMap::new(),
@@ -180,8 +187,10 @@ pub fn bucket_export(
180187
.expect("Failed to get events for bucket"),
181188
);
182189
export.buckets.insert(bucket_id.clone(), bucket);
183-
let filename = format!("aw-bucket-export_{}.json", bucket_id);
184190

191+
// TODO: Add back Content-Disposition
192+
/*
193+
let filename = format!("aw-bucket-export_{}.json", bucket_id);
185194
let header_content = format!("attachment; filename={}", filename);
186195
Ok(Response::build()
187196
.status(Status::Ok)
@@ -190,8 +199,11 @@ pub fn bucket_export(
190199
serde_json::to_string(&export).expect("Failed to serialize"),
191200
))
192201
.finalize())
202+
*/
203+
Ok(Json(export))
193204
}
194205

206+
#[openapi]
195207
#[delete("/<bucket_id>")]
196208
pub fn bucket_delete(bucket_id: String, state: State<ServerState>) -> Result<(), HttpErrorJson> {
197209
let datastore = endpoints_get_lock!(state.datastore);

aw-server/src/endpoints/export.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
use std::collections::HashMap;
2-
use std::io::Cursor;
32

4-
use rocket::http::Header;
53
use rocket::http::Status;
6-
use rocket::response::Response;
74
use rocket::State;
5+
use rocket_contrib::json::Json;
6+
use rocket_okapi::openapi;
87

98
use aw_models::BucketsExport;
109

1110
use crate::endpoints::{HttpErrorJson, ServerState};
1211

12+
#[openapi]
1313
#[get("/")]
14-
pub fn buckets_export(state: State<ServerState>) -> Result<Response, HttpErrorJson> {
14+
pub fn buckets_export(state: State<ServerState>) -> Result<Json<BucketsExport>, HttpErrorJson> {
1515
let datastore = endpoints_get_lock!(state.datastore);
1616
let mut export = BucketsExport {
1717
buckets: HashMap::new(),
@@ -28,6 +28,7 @@ pub fn buckets_export(state: State<ServerState>) -> Result<Response, HttpErrorJs
2828
export.buckets.insert(bid, bucket);
2929
}
3030

31+
/*
3132
Ok(Response::build()
3233
.status(Status::Ok)
3334
.header(Header::new(
@@ -38,4 +39,6 @@ pub fn buckets_export(state: State<ServerState>) -> Result<Response, HttpErrorJs
3839
serde_json::to_string(&export).expect("Failed to serialize"),
3940
))
4041
.finalize())
42+
*/
43+
Ok(Json(export))
4144
}

aw-server/src/endpoints/import.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
use multipart::server::Multipart;
12
use rocket::http::ContentType;
23
use rocket::http::Status;
34
use rocket::Data;
45
use rocket::State;
56
use rocket_contrib::json::Json;
67

7-
use multipart::server::Multipart;
8-
98
use std::io::Read;
109
use std::sync::Mutex;
1110

0 commit comments

Comments
 (0)