feat: endpoints for rooms
This commit is contained in:
parent
c6aebd8dae
commit
0a2b71082b
3 changed files with 81 additions and 2 deletions
|
@ -59,11 +59,12 @@ pub struct Booking {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct CleaningPlan {
|
pub struct CleaningPlan {
|
||||||
pub id: i32,
|
pub id: i32,
|
||||||
pub date: String,
|
pub date: String,
|
||||||
pub duration: i32,
|
pub duration: i32,
|
||||||
pub room: Room,
|
pub room_id: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
|
|
|
@ -10,6 +10,23 @@ async fn rooms(
|
||||||
Ok(Json(rooms))
|
Ok(Json(rooms))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn room(
|
||||||
|
Path(id): Path<i32>,
|
||||||
|
Extension(service): Extension<Service>,
|
||||||
|
) -> Result<impl IntoResponse, ServiceError> {
|
||||||
|
let room = service.get_room(id).await?
|
||||||
|
.ok_or_else(|| ServiceError::ErrorResponse(StatusCode::NOT_FOUND, Some("room not found".to_string())))?;
|
||||||
|
Ok(Json(room))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn cleaning_plans(
|
||||||
|
Path(id): Path<i32>,
|
||||||
|
Extension(service): Extension<Service>,
|
||||||
|
) -> Result<impl IntoResponse, ServiceError> {
|
||||||
|
let cleaning_plans = service.get_room_cleaning_plans(id).await?;
|
||||||
|
Ok(Json(cleaning_plans))
|
||||||
|
}
|
||||||
|
|
||||||
async fn bookings(
|
async fn bookings(
|
||||||
Query(query): Query<BookingQuery>,
|
Query(query): Query<BookingQuery>,
|
||||||
Extension(service): Extension<Service>,
|
Extension(service): Extension<Service>,
|
||||||
|
@ -114,6 +131,8 @@ async fn update_booking(
|
||||||
pub fn routes() -> Router<BoxRoute> {
|
pub fn routes() -> Router<BoxRoute> {
|
||||||
Router::new()
|
Router::new()
|
||||||
.route("/rooms", get(rooms))
|
.route("/rooms", get(rooms))
|
||||||
|
.route("/rooms/:id", get(room))
|
||||||
|
.route("/rooms/:id/cleaningPlans", get(cleaning_plans))
|
||||||
.route("/bookings", get(bookings).post(add_booking))
|
.route("/bookings", get(bookings).post(add_booking))
|
||||||
.route("/bookings/:id", get(booking).delete(delete_booking).put(update_booking))
|
.route("/bookings/:id", get(booking).delete(delete_booking).put(update_booking))
|
||||||
.route("/bookings/:id/rooms", get(booking_rooms))
|
.route("/bookings/:id/rooms", get(booking_rooms))
|
||||||
|
|
61
src/sql.rs
61
src/sql.rs
|
@ -1,6 +1,6 @@
|
||||||
use hyper::StatusCode;
|
use hyper::StatusCode;
|
||||||
|
|
||||||
use crate::{ServiceInner, model::{Room, Booking, Person, Address, BookingBody}, error::ServiceError};
|
use crate::{ServiceInner, model::{Room, Booking, Person, Address, BookingBody, CleaningPlan}, error::ServiceError};
|
||||||
|
|
||||||
impl ServiceInner {
|
impl ServiceInner {
|
||||||
|
|
||||||
|
@ -37,6 +37,65 @@ impl ServiceInner {
|
||||||
|
|
||||||
Ok(rooms)
|
Ok(rooms)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn get_room(&self, id: i32) -> Result<Option<Room>, ServiceError> {
|
||||||
|
let session = self.pool.get_session().await?;
|
||||||
|
let stmt = session.prepare("
|
||||||
|
SELECT
|
||||||
|
roomNumber,
|
||||||
|
floor,
|
||||||
|
roomTyp,
|
||||||
|
\"size\",
|
||||||
|
accessibility,
|
||||||
|
beds
|
||||||
|
FROM room WHERE roomNumber = :ID
|
||||||
|
").await?;
|
||||||
|
|
||||||
|
let row = stmt.query_single(id).await?;
|
||||||
|
|
||||||
|
Ok(match row {
|
||||||
|
Some(row) => {
|
||||||
|
let acc: i32 = row.get(5)?;
|
||||||
|
Some(Room {
|
||||||
|
room_number: row.get(0)?,
|
||||||
|
floor: row.get(1)?,
|
||||||
|
size: row.get(3)?,
|
||||||
|
room_type: row.get(2)?,
|
||||||
|
beds: row.get(4)?,
|
||||||
|
accessibility: acc != 0,
|
||||||
|
})
|
||||||
|
},
|
||||||
|
None => None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn get_room_cleaning_plans(&self, roomid: i32) -> Result<Vec<CleaningPlan>, ServiceError> {
|
||||||
|
let session = self.pool.get_session().await?;
|
||||||
|
let stmt = session.prepare("
|
||||||
|
SELECT
|
||||||
|
cleaningPlanId,
|
||||||
|
TO_CHAR(\"date\", 'YYYY-MM-DD'),
|
||||||
|
duration
|
||||||
|
FROM CleaningPlan
|
||||||
|
WHERE roomNumber = :ROOMID
|
||||||
|
").await?;
|
||||||
|
|
||||||
|
let rows = stmt.query(roomid).await?;
|
||||||
|
|
||||||
|
let mut cleaning_plans: Vec<CleaningPlan> = vec![];
|
||||||
|
|
||||||
|
while let Some(row) = rows.next().await? {
|
||||||
|
let cleaning_plan = CleaningPlan {
|
||||||
|
id: row.get(0)?,
|
||||||
|
date: row.get(1)?,
|
||||||
|
duration: row.get(2)?,
|
||||||
|
room_id: roomid,
|
||||||
|
};
|
||||||
|
cleaning_plans.push(cleaning_plan);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(cleaning_plans)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn get_bookings(&self) -> Result<Vec<Booking>, ServiceError> {
|
pub async fn get_bookings(&self) -> Result<Vec<Booking>, ServiceError> {
|
||||||
let session = self.pool.get_session().await?;
|
let session = self.pool.get_session().await?;
|
||||||
|
|
Loading…
Reference in a new issue