diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2025-02-01 22:52:56 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2025-02-01 22:52:56 +0100 |
| commit | 85e6c3ae1f4315138bbd68feb5bb7cebc24f6ae2 (patch) | |
| tree | bcaf27055e35c4335f99e68e70e2eb46ede9745e /server/src/main.rs | |
| parent | d780391408b9e6d443e5e4f907748cae484b79fb (diff) | |
Include branch in project/reviews response
But also add /review endpoint that takes an id. So you can get
review data with either the reviewid or the branchname.
Diffstat (limited to 'server/src/main.rs')
| -rw-r--r-- | server/src/main.rs | 124 |
1 files changed, 94 insertions, 30 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index b2974ac..019f28f 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -45,6 +45,7 @@ struct Db(sqlx::MySqlPool); project_user_del, reviews, review, + review_id, users, user_key_add, user_key_get, @@ -460,7 +461,7 @@ async fn reviews( let uw_offset = offset.unwrap_or(0); let uw_limit = limit.unwrap_or(10); let entries = sqlx::query!( - "SELECT reviews.id AS id,title,state,progress,users.id AS user_id,users.name AS name,users.dn AS user_dn FROM reviews JOIN users ON users.id=owner WHERE project=? ORDER BY id DESC LIMIT ? OFFSET ?", + "SELECT reviews.id AS id,title,state,progress,branch,users.id AS user_id,users.name AS name,users.dn AS user_dn FROM reviews JOIN users ON users.id=owner WHERE project=? ORDER BY id DESC LIMIT ? OFFSET ?", projectid, uw_limit, uw_offset) .fetch(&mut **db) .map_ok(|r| api_model::ReviewEntry { @@ -473,6 +474,7 @@ async fn reviews( }, state: api_model::ReviewState::try_from(r.state).unwrap(), progress: r.progress, + branch: r.branch, }) .try_collect::<Vec<_>>() .await @@ -512,35 +514,11 @@ async fn reviews( })) } -async fn get_review_from_branch( +async fn get_review_users( mut db: Connection<Db>, projectid: &str, - branch: &str, -) -> Result<Json<api_model::Review>, NotFound<&'static str>> { - let mut review = sqlx::query!( - "SELECT reviews.id AS id,title,description,state,progress,branch,archived,users.id AS user_id,users.name AS name,users.dn AS user_dn FROM reviews JOIN users ON users.id=owner WHERE project=? AND branch=?", - projectid, branch) - .fetch_one(&mut **db) - .map_ok(|r| { - api_model::Review { - id: r.id, - title: r.title, - description: r.description, - owner: api_model::User { - id: r.user_id, - name: r.name, - active: r.user_dn.is_some(), - }, - users: Vec::new(), - state: api_model::ReviewState::try_from(r.state).unwrap(), - progress: r.progress, - branch: r.branch, - archived: r.archived != 0, - } - }) - .map_err(|_| NotFound("No such review")) - .await?; - + reviewid: u64, +) -> Vec<api_model::ReviewUserEntry> { let mut users = sqlx::query!( "SELECT id,name,dn,project_users.default_role AS role FROM users JOIN project_users ON project_users.user=id WHERE project_users.project=? ORDER BY role,id", projectid) @@ -559,7 +537,7 @@ async fn get_review_from_branch( let override_users = sqlx::query!( "SELECT id,name,dn,review_users.role AS role FROM users JOIN review_users ON review_users.user=id WHERE review_users.review=? ORDER BY role,id", - review.id) + reviewid) .fetch(&mut **db) .map_ok(|r| api_model::ReviewUserEntry { user: api_model::User { @@ -584,7 +562,73 @@ async fn get_review_from_branch( } } - review.users = users; + users +} + +async fn get_review_from_branch( + mut db: Connection<Db>, + projectid: &str, + branch: &str, +) -> Result<Json<api_model::Review>, NotFound<&'static str>> { + let mut review = sqlx::query!( + "SELECT reviews.id AS id,title,description,state,progress,archived,users.id AS user_id,users.name AS name,users.dn AS user_dn FROM reviews JOIN users ON users.id=owner WHERE project=? AND branch=?", + projectid, branch) + .fetch_one(&mut **db) + .map_ok(|r| { + api_model::Review { + id: r.id, + title: r.title, + description: r.description, + owner: api_model::User { + id: r.user_id, + name: r.name, + active: r.user_dn.is_some(), + }, + users: Vec::new(), + state: api_model::ReviewState::try_from(r.state).unwrap(), + progress: r.progress, + branch: branch.to_string(), + archived: r.archived != 0, + } + }) + .map_err(|_| NotFound("No such review")) + .await?; + + review.users = get_review_users(db, projectid, review.id).await; + + Ok(Json(review)) +} + +async fn get_review_from_id( + mut db: Connection<Db>, + projectid: &str, + reviewid: u64, +) -> Result<Json<api_model::Review>, NotFound<&'static str>> { + let mut review = sqlx::query!( + "SELECT title,description,state,progress,branch,archived,users.id AS user_id,users.name AS name,users.dn AS user_dn FROM reviews JOIN users ON users.id=owner WHERE project=? AND reviews.id=?", + projectid, reviewid) + .fetch_one(&mut **db) + .map_ok(|r| { + api_model::Review { + id: reviewid, + title: r.title, + description: r.description, + owner: api_model::User { + id: r.user_id, + name: r.name, + active: r.user_dn.is_some(), + }, + users: Vec::new(), + state: api_model::ReviewState::try_from(r.state).unwrap(), + progress: r.progress, + branch: r.branch, + archived: r.archived != 0, + } + }) + .map_err(|_| NotFound("No such review")) + .await?; + + review.users = get_review_users(db, projectid, reviewid).await; Ok(Json(review)) } @@ -621,6 +665,25 @@ async fn review_encoded_path( #[utoipa::path( responses( + (status = 200, description = "Get review", body = api_model::Review), + (status = 404, description = "No such review"), + ), + security( + ("session" = []), + ), +)] +#[get("/review/<projectid>?<reviewid>")] +async fn review_id( + db: Connection<Db>, + _session: auth::Session, + projectid: &str, + reviewid: u64, +) -> Result<Json<api_model::Review>, NotFound<&'static str>> { + get_review_from_id(db, projectid, reviewid).await +} + +#[utoipa::path( + responses( (status = 200, description = "Get all users", body = api_model::Users), ), security( @@ -879,6 +942,7 @@ fn rocket_from_config(figment: Figment) -> Rocket<Build> { reviews, review, review_encoded_path, + review_id, users, user_key_add, user_key_get, |
