When not logged in redirection to login page
Every page is locked behind a jwt, when it is not supplied neither other pages not api calls will work
This commit is contained in:
@@ -1,30 +1,32 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use axum::{
|
||||
Json,
|
||||
Extension, Json,
|
||||
extract::{Path, State},
|
||||
http::StatusCode,
|
||||
response::IntoResponse,
|
||||
};
|
||||
use serde_json::json;
|
||||
use sqlx::query;
|
||||
use sqlx::{query, Row};
|
||||
|
||||
use crate::{
|
||||
AppState,
|
||||
models::{Ticket, TicketCreateScheme, TicketResponse, TicketUpdateScheme},
|
||||
models::{FilteredUser, Ticket, TicketCreateScheme, TicketResponse, TicketUpdateScheme},
|
||||
};
|
||||
|
||||
pub async fn create_ticket(
|
||||
Extension(user): Extension<FilteredUser>,
|
||||
State(data): State<Arc<AppState>>,
|
||||
Json(body): Json<TicketCreateScheme>,
|
||||
) -> Result<impl IntoResponse, (StatusCode, Json<serde_json::Value>)> {
|
||||
let query = query(
|
||||
r#"INSERT INTO tickets (category, description, betreff, room) VALUES ($1, $2, $3, $4)"#,
|
||||
r#"INSERT INTO tickets (category, description, betreff, room, user_id) VALUES ($1, $2, $3, $4, $5)"#,
|
||||
)
|
||||
.bind(body.category.to_string())
|
||||
.bind(body.description.to_string())
|
||||
.bind(body.betreff.to_string())
|
||||
.bind(body.room)
|
||||
.bind(user.id)
|
||||
.execute(&data.db)
|
||||
.await;
|
||||
|
||||
@@ -69,8 +71,11 @@ pub async fn get_tickets(
|
||||
State(data): State<Arc<AppState>>,
|
||||
) -> Result<impl IntoResponse, (StatusCode, Json<serde_json::Value>)> {
|
||||
println!("get_tickets called");
|
||||
let tickets = sqlx::query_as::<_, Ticket>(
|
||||
r#"SELECT * FROM tickets WHERE status <> 'Archived' ORDER BY date DESC"#,
|
||||
let tickets = sqlx::query(
|
||||
r#"SELECT t.id, t.category, t.betreff, t.description, t.room, t.status, t.date, t.user_id, u.first_name, u.last_name
|
||||
FROM tickets t
|
||||
LEFT JOIN users u ON t.user_id = u.id
|
||||
WHERE t.status <> 'Archived' ORDER BY t.date DESC"#,
|
||||
)
|
||||
.fetch_all(&data.db)
|
||||
.await
|
||||
@@ -83,10 +88,21 @@ pub async fn get_tickets(
|
||||
})?;
|
||||
println!("Tickets fetched");
|
||||
|
||||
let ticket_response = tickets
|
||||
let ticket_response: Vec<TicketResponse> = tickets
|
||||
.iter()
|
||||
.map(|ticket| filter_record(&ticket))
|
||||
.collect::<Vec<TicketResponse>>();
|
||||
.map(|row| TicketResponse {
|
||||
id: row.get("id"),
|
||||
category: row.get("category"),
|
||||
betreff: row.get("betreff"),
|
||||
description: row.get("description"),
|
||||
room: row.get("room"),
|
||||
status: row.get("status"),
|
||||
date: row.get("date"),
|
||||
user_id: row.get("user_id"),
|
||||
user_first_name: row.get("first_name"),
|
||||
user_last_name: row.get("last_name"),
|
||||
})
|
||||
.collect();
|
||||
|
||||
let json_response = serde_json::json!(ticket_response);
|
||||
println!("Json contructed");
|
||||
@@ -97,15 +113,32 @@ pub async fn get_ticket_by_id(
|
||||
Path(id): Path<i32>,
|
||||
State(data): State<Arc<AppState>>,
|
||||
) -> Result<impl IntoResponse, (StatusCode, Json<serde_json::Value>)> {
|
||||
let query = sqlx::query_as::<_, Ticket>(r#"SELECT * FROM tickets WHERE id = $1"#)
|
||||
.bind(id)
|
||||
.fetch_one(&data.db)
|
||||
.await;
|
||||
let query = sqlx::query(
|
||||
r#"SELECT t.id, t.category, t.betreff, t.description, t.room, t.status, t.date, t.user_id, u.first_name, u.last_name
|
||||
FROM tickets t
|
||||
LEFT JOIN users u ON t.user_id = u.id
|
||||
WHERE t.id = $1"#,
|
||||
)
|
||||
.bind(id)
|
||||
.fetch_one(&data.db)
|
||||
.await;
|
||||
|
||||
match query {
|
||||
Ok(ticket) => {
|
||||
let ticket_response = serde_json::json!(filter_record(&ticket));
|
||||
return Ok(Json(ticket_response));
|
||||
Ok(row) => {
|
||||
let ticket_response = TicketResponse {
|
||||
id: row.get("id"),
|
||||
category: row.get("category"),
|
||||
betreff: row.get("betreff"),
|
||||
description: row.get("description"),
|
||||
room: row.get("room"),
|
||||
status: row.get("status"),
|
||||
date: row.get("date"),
|
||||
user_id: row.get("user_id"),
|
||||
user_first_name: row.get("first_name"),
|
||||
user_last_name: row.get("last_name"),
|
||||
};
|
||||
let response = serde_json::json!(ticket_response);
|
||||
return Ok(Json(response));
|
||||
}
|
||||
Err(sqlx::Error::RowNotFound) => {
|
||||
let error_response = serde_json::json!({
|
||||
@@ -148,34 +181,40 @@ pub async fn edit_ticket(
|
||||
return Err((StatusCode::INTERNAL_SERVER_ERROR, Json(error_response)));
|
||||
}
|
||||
|
||||
let updated_ticket = sqlx::query_as::<_, Ticket>(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 updated_ticket = sqlx::query(
|
||||
r#"SELECT t.id, t.category, t.betreff, t.description, t.room, t.status, t.date, t.user_id, u.first_name, u.last_name
|
||||
FROM tickets t
|
||||
LEFT JOIN users u ON t.user_id = u.id
|
||||
WHERE t.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),
|
||||
let ticket_response = TicketResponse {
|
||||
id: updated_ticket.get("id"),
|
||||
category: updated_ticket.get("category"),
|
||||
betreff: updated_ticket.get("betreff"),
|
||||
description: updated_ticket.get("description"),
|
||||
room: updated_ticket.get("room"),
|
||||
status: updated_ticket.get("status"),
|
||||
date: updated_ticket.get("date"),
|
||||
user_id: updated_ticket.get("user_id"),
|
||||
user_first_name: updated_ticket.get("first_name"),
|
||||
user_last_name: updated_ticket.get("last_name"),
|
||||
};
|
||||
|
||||
let response = serde_json::json!({
|
||||
"ticket": ticket_response,
|
||||
"status": "success"
|
||||
});
|
||||
|
||||
Ok(Json(ticket_response))
|
||||
Ok(Json(response))
|
||||
}
|
||||
|
||||
fn filter_record(ticket: &Ticket) -> TicketResponse {
|
||||
TicketResponse {
|
||||
id: ticket.id.to_owned(),
|
||||
category: ticket.category.to_owned(),
|
||||
betreff: ticket.betreff.to_owned(),
|
||||
description: ticket.description.to_owned(),
|
||||
room: ticket.room.to_owned(),
|
||||
status: ticket.status.to_owned(),
|
||||
date: ticket.date.to_owned(),
|
||||
user_id: ticket.user_id.to_owned(),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user