| 1 | use sqlx::PgPool;
|
|---|
| 2 | use tauri::State;
|
|---|
| 3 | use crate::models::table::RestaurantTable;
|
|---|
| 4 | use crate::commands::auth::ActiveSessions;
|
|---|
| 5 |
|
|---|
| 6 | pub const STATUS_FREE: &str = "СЛОБОДНА";
|
|---|
| 7 | pub const STATUS_OCCUPIED: &str = "ЗАФАТЕНА";
|
|---|
| 8 | pub const STATUS_RESERVED: &str = "РЕЗЕРВИРАНА";
|
|---|
| 9 |
|
|---|
| 10 | #[tauri::command]
|
|---|
| 11 | pub async fn get_tables(
|
|---|
| 12 | token: String,
|
|---|
| 13 | pool: State<'_, PgPool>,
|
|---|
| 14 | sessions: State<'_, ActiveSessions>,
|
|---|
| 15 | ) -> Result<Vec<RestaurantTable>, String> {
|
|---|
| 16 | {
|
|---|
| 17 | let lock = sessions.0.lock().map_err(|_| "Системска грешка со сесијата".to_string())?;
|
|---|
| 18 | if !lock.contains_key(&token) {
|
|---|
| 19 | return Err("Невалидна или истечена сесија.".to_string());
|
|---|
| 20 | }
|
|---|
| 21 | }
|
|---|
| 22 |
|
|---|
| 23 | let tables = sqlx::query_as::<_, RestaurantTable>(
|
|---|
| 24 | "
|
|---|
| 25 | SELECT table_id, table_number, capacity, status
|
|---|
| 26 | FROM restaurant_table
|
|---|
| 27 | ORDER BY table_id ASC
|
|---|
| 28 | "
|
|---|
| 29 | )
|
|---|
| 30 | .fetch_all(pool.inner())
|
|---|
| 31 | .await
|
|---|
| 32 | .map_err(|e| e.to_string())?;
|
|---|
| 33 |
|
|---|
| 34 | Ok(tables)
|
|---|
| 35 | }
|
|---|
| 36 |
|
|---|
| 37 | #[tauri::command]
|
|---|
| 38 | pub async fn reserve_table(
|
|---|
| 39 | token: String,
|
|---|
| 40 | table_id: i32,
|
|---|
| 41 | pool: State<'_, PgPool>,
|
|---|
| 42 | sessions: State<'_, ActiveSessions>,
|
|---|
| 43 | ) -> Result<(), String> {
|
|---|
| 44 | {
|
|---|
| 45 | let lock = sessions.0.lock().map_err(|_| "Системска грешка со сесијата".to_string())?;
|
|---|
| 46 | if !lock.contains_key(&token) {
|
|---|
| 47 | return Err("Невалидна или истечена сесија.".to_string());
|
|---|
| 48 | }
|
|---|
| 49 | }
|
|---|
| 50 |
|
|---|
| 51 | set_table_status(table_id, STATUS_RESERVED, pool.inner()).await
|
|---|
| 52 | }
|
|---|
| 53 |
|
|---|
| 54 | #[tauri::command]
|
|---|
| 55 | pub async fn cancel_reservation(
|
|---|
| 56 | token: String,
|
|---|
| 57 | table_id: i32,
|
|---|
| 58 | pool: State<'_, PgPool>,
|
|---|
| 59 | sessions: State<'_, ActiveSessions>,
|
|---|
| 60 | ) -> Result<(), String> {
|
|---|
| 61 | {
|
|---|
| 62 | let lock = sessions.0.lock().map_err(|_| "Системска грешка со сесијата".to_string())?;
|
|---|
| 63 | if !lock.contains_key(&token) {
|
|---|
| 64 | return Err("Невалидна или истечена сесија.".to_string());
|
|---|
| 65 | }
|
|---|
| 66 | }
|
|---|
| 67 |
|
|---|
| 68 | set_table_status(table_id, STATUS_FREE, pool.inner()).await
|
|---|
| 69 | }
|
|---|
| 70 |
|
|---|
| 71 | pub async fn set_table_status<'e, E>(
|
|---|
| 72 | table_id: i32,
|
|---|
| 73 | status: &str,
|
|---|
| 74 | executor: E,
|
|---|
| 75 | ) -> Result<(), String>
|
|---|
| 76 | where
|
|---|
| 77 | E: sqlx::Executor<'e, Database = sqlx::Postgres>,
|
|---|
| 78 | {
|
|---|
| 79 | sqlx::query(
|
|---|
| 80 | "
|
|---|
| 81 | UPDATE restaurant_table
|
|---|
| 82 | SET status = $1
|
|---|
| 83 | WHERE table_id = $2
|
|---|
| 84 | "
|
|---|
| 85 | )
|
|---|
| 86 | .bind(status)
|
|---|
| 87 | .bind(table_id)
|
|---|
| 88 | .execute(executor)
|
|---|
| 89 | .await
|
|---|
| 90 | .map_err(|e| e.to_string())?;
|
|---|
| 91 |
|
|---|
| 92 | Ok(())
|
|---|
| 93 | } |
|---|