diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2024-12-21 14:57:59 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2024-12-21 14:57:59 +0100 |
| commit | 3010daec061acd4ee88266a759abab0ac18cd100 (patch) | |
| tree | fcfd54fd3ac38fc35d8facc0bea6e655a458d911 /server/src | |
Initial commit
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/api_model.rs | 46 | ||||
| -rw-r--r-- | server/src/main.rs | 112 |
2 files changed, 158 insertions, 0 deletions
diff --git a/server/src/api_model.rs b/server/src/api_model.rs new file mode 100644 index 0000000..4b6eced --- /dev/null +++ b/server/src/api_model.rs @@ -0,0 +1,46 @@ +use serde::{Serialize}; + +#[derive(Serialize, Copy, Clone)] +pub enum ReviewState { + DRAFT, + OPEN, + DROPPED, + CLOSED, +} + +#[derive(Serialize)] +pub struct User<'r> { + pub username: &'r str, + pub name: &'r str, + pub active: bool, +} + +#[derive(Serialize)] +pub struct Review<'r> { + pub id: u64, + pub title: &'r str, + pub description: &'r str, + pub owner: &'r User<'r>, + pub reviewers: Vec<&'r User<'r>>, + pub watchers: Vec<&'r User<'r>>, + pub state: ReviewState, + pub progress: f64, +} + +#[derive(Serialize)] +pub struct ReviewEntry<'r> { + pub id: u64, + pub title: &'r str, + pub owner: &'r User<'r>, + pub state: ReviewState, + pub progress: f64, +} + +#[derive(Serialize)] +pub struct Reviews<'r> { + pub offset: u32, + pub limit: u32, + pub total_count: u32, + pub more: bool, + pub reviews: Vec<ReviewEntry<'r>>, +} diff --git a/server/src/main.rs b/server/src/main.rs new file mode 100644 index 0000000..702d954 --- /dev/null +++ b/server/src/main.rs @@ -0,0 +1,112 @@ +#[macro_use] extern crate rocket; + +use rocket::request::{self, Outcome, Request, FromRequest}; +use rocket::response::{status::NotFound}; +use rocket::serde::json::Json; + +mod api_model; + +static USER1: api_model::User = api_model::User { + username: "u1", + name: "User #1", + active: true, +}; + +static USER2: api_model::User = api_model::User { + username: "u2", + name: "User #2", + active: true, +}; + +static USER3: api_model::User = api_model::User { + username: "u3", + name: "User #3", + active: true, +}; + +fn make_r1<'r>() -> api_model::Review<'r> { + api_model::Review { + id: 1, + title: "Review #1", + description: "Description for review #1", + owner: &USER1, + reviewers: vec![&USER2, &USER3], + watchers: vec![], + state: api_model::ReviewState::OPEN, + progress: 0.42, + } +} + +fn make_r2<'r>() -> api_model::Review<'r> { + api_model::Review { + id: 2, + title: "Review #2", + description: "Description for review #2", + owner: &USER2, + reviewers: vec![&USER1], + watchers: vec![&USER3], + state: api_model::ReviewState::OPEN, + progress: 0.9999, + } +} + +struct User { + username: String, +} + +#[derive(Debug)] +enum UserError { + Missing, + Invalid, +} + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for User { + type Error = UserError; + + async fn from_request(_req: &'r Request<'_>) -> request::Outcome<Self, Self::Error> { + Outcome::Success(User{ username: String::from("foo") }) + } +} + +fn review_entry<'r>(review: &api_model::Review<'r>) -> api_model::ReviewEntry<'r> { + api_model::ReviewEntry { + id: review.id, + title: review.title, + owner: review.owner, + state: review.state, + progress: review.progress, + } +} + +#[get("/reviews")] +async fn reviews<'r>(_user: User) -> Json<api_model::Reviews<'r>> { + Json( + api_model::Reviews { + offset: 0, + limit: 10, + total_count: 2, + more: false, + reviews: vec![review_entry(&make_r1()), review_entry(&make_r2())], + }, + ) +} + +#[get("/review/<id>")] +async fn review<'r>(id: u64, _user: User) -> Result<Json<api_model::Review<'r>>, NotFound<String>> { + match id { + 1 => Ok(Json(make_r1())), + 2 => Ok(Json(make_r2())), + _ => Err(NotFound(id.to_string())) + } +} + +#[rocket::main] +async fn main() -> Result<(), rocket::Error> { + let _rocket = rocket::build() + .mount("/api/v1", routes![reviews, review]) + .launch() + .await?; + + Ok(()) +} |
