diff --git a/src/cases.rs b/src/cases.rs index e084fba..73c2be8 100644 --- a/src/cases.rs +++ b/src/cases.rs @@ -1,15 +1,15 @@ +use crate::types::*; use crate::AppState; use actix_web::web::Data; use actix_web::{get, web, HttpResponse, Responder}; -use serde::{Deserialize, Serialize}; use serde_json::to_string; use sqlx::query_as; -use crate::types::*; - #[get("/case")] async fn get_case(query: web::Query, app_state: Data) -> impl Responder { - let case = query_as!(Case, "SELECT * FROM cases WHERE uuid = $1", query.uuid).fetch_one(&app_state.database).await; + let case = query_as!(Case, "SELECT * FROM cases WHERE uuid = $1", query.uuid) + .fetch_one(&app_state.database) + .await; if case.is_err() { return HttpResponse::NotFound().finish(); } @@ -22,7 +22,9 @@ async fn get_case(query: web::Query, app_state: Data) -> imp #[get("/cases")] async fn get_cases(app_state: Data) -> impl Responder { - let cases = query_as!(Case, "SELECT * FROM cases").fetch_all(&app_state.database).await; + let cases = query_as!(Case, "SELECT * FROM cases") + .fetch_all(&app_state.database) + .await; if cases.is_err() { return HttpResponse::NotFound().finish(); } @@ -33,22 +35,32 @@ async fn get_cases(app_state: Data) -> impl Responder { HttpResponse::Ok().body(json.unwrap()) } - #[get("/case-items")] async fn get_case_items(query: web::Query, app_state: Data) -> impl Responder { - let case = query_as!(Case, "SELECT * FROM cases WHERE uuid = $1", query.uuid).fetch_one(&app_state.database).await; + let case = query_as!(Case, "SELECT * FROM cases WHERE uuid = $1", query.uuid) + .fetch_one(&app_state.database) + .await; if case.is_err() { return HttpResponse::NotFound().finish(); } let case = case.unwrap(); - let items_cases = query_as!(ItemCases, "SELECT * FROM items_cases WHERE \"case\" = $1", case.id).fetch_all(&app_state.database).await; + let items_cases = query_as!( + ItemCases, + "SELECT * FROM items_cases WHERE \"case\" = $1", + case.id + ) + .fetch_all(&app_state.database) + .await; if items_cases.is_err() { return HttpResponse::NotFound().finish(); } let items_cases = items_cases.unwrap(); let mut items = vec![]; for item_case in items_cases { - if let Ok(item) = query_as!(Item, "SELECT * FROM items WHERE id = $1", item_case.item).fetch_one(&app_state.database).await { + if let Ok(item) = query_as!(Item, "SELECT * FROM items WHERE id = $1", item_case.item) + .fetch_one(&app_state.database) + .await + { items.push(item); } } @@ -58,4 +70,3 @@ async fn get_case_items(query: web::Query, app_state: Data) } HttpResponse::Ok().body(json.unwrap()) } - diff --git a/src/items.rs b/src/items.rs index b592388..e14a495 100644 --- a/src/items.rs +++ b/src/items.rs @@ -1,14 +1,15 @@ -use actix_web::{get, web, HttpResponse, Responder, options}; +use crate::types::*; +use crate::AppState; use actix_web::web::Data; +use actix_web::{get, web, HttpResponse, Responder}; use serde_json::to_string; use sqlx::query_as; -use crate::AppState; -use crate::types::*; - #[get("/item")] async fn get_item(query: web::Query, app_state: Data) -> impl Responder { - let item = query_as!(Item, "SELECT * FROM items WHERE uuid = $1", query.uuid).fetch_one(&app_state.database).await; + let item = query_as!(Item, "SELECT * FROM items WHERE uuid = $1", query.uuid) + .fetch_one(&app_state.database) + .await; if item.is_err() { return HttpResponse::NotFound().finish(); } @@ -16,12 +17,16 @@ async fn get_item(query: web::Query, app_state: Data) -> imp if json.is_err() { return HttpResponse::InternalServerError().finish(); } - HttpResponse::Ok().append_header(("Access-Control-Allow-Origin", "*")).body(json.unwrap()) + HttpResponse::Ok() + .append_header(("Access-Control-Allow-Origin", "*")) + .body(json.unwrap()) } #[get("/items")] async fn get_items(app_state: Data) -> impl Responder { - let items = query_as!(Item, "SELECT * FROM items").fetch_all(&app_state.database).await; + let items = query_as!(Item, "SELECT * FROM items") + .fetch_all(&app_state.database) + .await; if items.is_err() { return HttpResponse::NotFound().finish(); } @@ -34,19 +39,30 @@ async fn get_items(app_state: Data) -> impl Responder { #[get("/item-cases")] async fn get_item_cases(query: web::Query, app_state: Data) -> impl Responder { - let item = query_as!(Item, "SELECT * FROM items WHERE uuid = $1", query.uuid).fetch_one(&app_state.database).await; + let item = query_as!(Item, "SELECT * FROM items WHERE uuid = $1", query.uuid) + .fetch_one(&app_state.database) + .await; if item.is_err() { return HttpResponse::NotFound().finish(); } let item = item.unwrap(); - let items_cases = query_as!(ItemCases, "SELECT * FROM items_cases WHERE \"item\" = $1", item.id).fetch_all(&app_state.database).await; + let items_cases = query_as!( + ItemCases, + "SELECT * FROM items_cases WHERE \"item\" = $1", + item.id + ) + .fetch_all(&app_state.database) + .await; if items_cases.is_err() { return HttpResponse::NotFound().finish(); } let items_cases = items_cases.unwrap(); let mut cases = vec![]; for item_case in items_cases { - if let Ok(item) = query_as!(Case, "SELECT * FROM cases WHERE id = $1", item_case.case).fetch_one(&app_state.database).await { + if let Ok(item) = query_as!(Case, "SELECT * FROM cases WHERE id = $1", item_case.case) + .fetch_one(&app_state.database) + .await + { cases.push(item); } } diff --git a/src/main.rs b/src/main.rs index c0a26f4..a557df1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,7 @@ use users::*; use utils::*; use actix_web::web::Data; -use actix_web::{App, HttpServer, middleware::DefaultHeaders}; +use actix_web::{middleware::DefaultHeaders, App, HttpServer}; use sqlx::sqlite::SqlitePool; #[derive(Clone)] @@ -48,7 +48,7 @@ async fn main() -> std::io::Result<()> { .service(options) .app_data(app_state.clone()) }) - .bind(("127.0.0.1", 8000))? - .run() - .await + .bind(("127.0.0.1", 8000))? + .run() + .await } diff --git a/src/users.rs b/src/users.rs index e9f68db..73943f8 100644 --- a/src/users.rs +++ b/src/users.rs @@ -1,19 +1,19 @@ -use std::fs::File; -use std::io::Read; use crate::AppState; use actix_web::cookie::Cookie; use actix_web::web::{Data, Json}; -use actix_web::{HttpRequest, HttpResponse, Responder, post}; -use argon2::Argon2; +use actix_web::{post, HttpRequest, HttpResponse, Responder}; use argon2::password_hash::{ - PasswordHash, PasswordHasher, PasswordVerifier, SaltString, rand_core::OsRng + rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString, }; +use argon2::Argon2; use jsonwebtoken::{ - Algorithm, DecodingKey, EncodingKey, Header, Validation, decode, encode, get_current_timestamp, + decode, encode, get_current_timestamp, Algorithm, DecodingKey, EncodingKey, Header, Validation, }; use rand::Rng; use serde::{Deserialize, Serialize}; use sqlx::{query, query_as}; +use std::fs::File; +use std::io::Read; use uuid::Uuid; #[derive(Serialize, Deserialize)] @@ -121,13 +121,17 @@ async fn logout(req: HttpRequest, app_state: Data) -> impl Responder { .await .is_err() { - return HttpResponse::InternalServerError().reason("Query fail").finish(); + return HttpResponse::InternalServerError() + .reason("Query fail") + .finish(); } } Err(e) => { let message = format!("Error: {e}"); println!("{}", message); - return HttpResponse::InternalServerError().reason("Token caca").finish(); + return HttpResponse::InternalServerError() + .reason("Token caca") + .finish(); } } let mut cookie = Cookie::new("token", ""); diff --git a/src/utils.rs b/src/utils.rs index 1c26a23..06fa592 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,11 +1,16 @@ +use crate::AppState; +use actix_web::web::Data; use actix_web::{options, HttpResponse, Responder}; // This is needed for the web client. // This returns the same options for every path of the api #[options("/{_:.*}")] -async fn options() -> impl Responder { +async fn options(app_state: Data) -> impl Responder { HttpResponse::Ok() - .append_header(("Access-Control-Allow-Origin", "*")) + .append_header(( + "Access-Control-Allow-Origin", + app_state.allow_origins.join(","), + )) .append_header(("Access-Control-Allow-Methods", "GET, OPTIONS")) .append_header(("Access-Control-Allow-Headers", "Content-Type")) .finish()