diff --git a/backend/src/handlers/ticket.rs b/backend/src/handlers/ticket.rs index cb31d38..4006227 100644 --- a/backend/src/handlers/ticket.rs +++ b/backend/src/handlers/ticket.rs @@ -11,7 +11,7 @@ use sqlx::query; use crate::{ AppState, - models::{Ticket, TicketCreateScheme, TicketResponse}, + models::{Ticket, TicketCreateScheme, TicketResponse, TicketUpdateScheme}, }; pub async fn create_ticket( @@ -93,7 +93,7 @@ pub async fn get_ticket_by_id( Path(id): Path, State(data): State>, ) -> Result)> { - let query = sqlx::query_as(r#"SELECT * FROM tickets WHERE id = $1"#) + let query = sqlx::query_as::<_, Ticket>(r#"SELECT * FROM tickets WHERE id = $1"#) .bind(id) .fetch_one(&data.db) .await; @@ -119,6 +119,50 @@ pub async fn get_ticket_by_id( }; } +pub async fn edit_ticket( + Path(id): Path, + State(data): State>, + Json(body): Json, +) -> Result)> { + let update_result = sqlx::query(r#"UPDATE tickets SET status = $1 WHERE id = $2"#) + .bind(body.status.to_owned()) + .bind(id) + .execute(&data.db) + .await + .map_err(|e| { + ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(json!({"status": "error", "message": format!("{:?}", e)})), + ) + })?; + + if update_result.rows_affected() == 0 { + let error_response = serde_json::json!({ + "status": "error", + "message": format!("Ticket with ID {} not found", id) + }); + return Err((StatusCode::INTERNAL_SERVER_ERROR, Json(error_response))); + } + + let updated_ticket = sqlx::query_as(r#"SELECT * FROM tickets WHERE id = $1"#) + .bind(id) + .fetch_one(&data.db) + .await + .map_err(|e| { + ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(json!({"status": "error", "message": format!("{:?}", e)})), + ) + })?; + + let ticket_response = serde_json::json!({ + "ticket": filter_record(&updated_ticket), + "status": "success" + }); + + Ok(Json(ticket_response)) +} + fn filter_record(ticket: &Ticket) -> TicketResponse { TicketResponse { id: ticket.id.to_owned(), diff --git a/backend/src/models.rs b/backend/src/models.rs index 7365775..bbdf392 100644 --- a/backend/src/models.rs +++ b/backend/src/models.rs @@ -42,3 +42,8 @@ pub struct TicketCreateScheme { pub description: String, pub room: i16, } + +#[derive(Deserialize, Serialize, Debug)] +pub struct TicketUpdateScheme { + pub status: String, +} diff --git a/backend/src/router.rs b/backend/src/router.rs index 2bc1a37..6179a61 100644 --- a/backend/src/router.rs +++ b/backend/src/router.rs @@ -7,7 +7,7 @@ use axum::{ use crate::{ AppState, - handlers::ticket::{create_ticket, delete_ticket, get_ticket_by_id, get_tickets}, + handlers::ticket::{create_ticket, delete_ticket, edit_ticket, get_ticket_by_id, get_tickets}, }; pub fn create_router(state: Arc) -> Router { @@ -16,7 +16,9 @@ pub fn create_router(state: Arc) -> Router { .route("/api/tickets/create", post(create_ticket)) .route( "/api/tickets/{id}", - get(get_ticket_by_id).delete(delete_ticket), + get(get_ticket_by_id) + .delete(delete_ticket) + .patch(edit_ticket), ) .with_state(state) } diff --git a/migrations/20260422094706_ticket_table.sql b/migrations/20260422094706_ticket_table.sql index 6f08af4..5806f85 100644 --- a/migrations/20260422094706_ticket_table.sql +++ b/migrations/20260422094706_ticket_table.sql @@ -6,5 +6,5 @@ CREATE TABLE IF NOT EXISTS tickets ( room SMALLINT, status VARCHAR(15) NOT NULL DEFAULT 'ToDo', date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - user_id SMALLINT + user_id SMALLINT DEFAULT 1 );