use actix_web::{web, HttpResponse, Responder}; use chrono::{Days, NaiveTime}; use sqlx::PgPool; use crate::{ endpoints::{availability::NewOrEditAvailabilityTemplate, NaiveDateQuery}, utils::{ApplicationError, TemplateResponse}, }; use brass_db::models::{find_free_date_time_slots, Availability, User}; #[actix_web::get("/availability/new")] pub async fn get( user: web::ReqData, pool: web::Data, query: web::Query, ) -> Result { let availabilities_from_user = Availability::read_all_by_user_and_date(pool.get_ref(), user.id, &query.date).await?; let slot_suggestions = find_free_date_time_slots(&availabilities_from_user); let user_can_create_availability = availabilities_from_user.is_empty() || !slot_suggestions.is_empty(); if !user_can_create_availability { return Ok(HttpResponse::BadRequest().finish()); } let template = NewOrEditAvailabilityTemplate { user: user.into_inner(), date: query.date, enddate: None, id: None, start: Some(NaiveTime::from_hms_opt(10, 0, 0).unwrap()), end: Some(NaiveTime::from_hms_opt(20, 0, 0).unwrap()), comment: None, slot_suggestions, datetomorrow: query.date.checked_add_days(Days::new(1)).unwrap(), other_user: None, other_users: Vec::default(), }; 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::{Availability, AvailabilityChangeset}; use brass_macros::db_test; use chrono::NaiveDate; #[db_test] async fn produces_template_when_user_is_admin(context: &DbTestContext) { let config = RequestConfig::new("/availability/new?date=2025-01-01"); create_test_login_user(&context.db_pool, &config).await; let date = NaiveDate::from_ymd_opt(2025, 01, 01).unwrap(); let changeset = AvailabilityChangeset::create_for_test(&date, 10, 20); Availability::create(&context.db_pool, 1, &changeset) .await .unwrap(); let response = test_get(context.app().await, &config).await; let (status, body) = response.into_status_and_body().await; assert_eq!(StatusCode::OK, status); assert_snapshot!(body); } }