use actix_web::{web, HttpResponse, Responder}; use sqlx::PgPool; use crate::{ endpoints::{vehicle::VehicleNewOrEditTemplate, IdPath}, utils::{ApplicationError, TemplateResponse}, }; use brass_db::models::{Role, User, Vehicle}; #[actix_web::get("/vehicles/{id}")] pub async fn get( user: web::ReqData, pool: web::Data, path: web::Path, ) -> Result { if user.role != Role::Admin && user.role != Role::AreaManager { return Err(ApplicationError::Unauthorized); } let Some(vehicle) = Vehicle::read(pool.get_ref(), path.id).await? else { return Ok(HttpResponse::NotFound().finish()); }; let template = VehicleNewOrEditTemplate { user: user.into_inner(), vehicle: Some(vehicle), }; Ok(template.to_response()?) } #[cfg(test)] mod tests { use crate::utils::test_helper::{ assert_snapshot, create_test_login_user, test_get, DbTestContext, RequestConfig, ServiceResponseExt, StatusCode, }; use brass_db::models::{Role, Vehicle}; use brass_macros::db_test; #[db_test] async fn returns_not_found_for_user(context: &DbTestContext) { Vehicle::create(&context.db_pool, "11.49.1", "FF Leipzig Ost") .await .unwrap(); let app = context.app().await; let config = RequestConfig::new("/vehicles/1"); create_test_login_user(&context.db_pool, &config).await; let response = test_get(&app, &config).await; assert_eq!(StatusCode::UNAUTHORIZED, response.status()); } #[db_test] async fn area_manager_can_edit(context: &DbTestContext) { Vehicle::create(&context.db_pool, "11.49.1", "FF Leipzig Ost") .await .unwrap(); let app = context.app().await; let config = RequestConfig::new("/vehicles/1").with_role(Role::AreaManager); create_test_login_user(&context.db_pool, &config).await; let response = test_get(&app, &config).await; assert_eq!(StatusCode::OK, response.status()); } #[db_test] async fn produces_template_fine_when_user_is_admin(context: &DbTestContext) { let app = context.app().await; Vehicle::create(&context.db_pool, "11.49.1", "FF Leipzig Ost") .await .unwrap(); let config = RequestConfig::new("/vehicles/1").with_role(Role::Admin); create_test_login_user(&context.db_pool, &config).await; let (status, body) = test_get(&app, &config).await.into_status_and_body().await; assert_eq!(StatusCode::OK, status); assert_snapshot!(body); } }