diff --git a/Cargo.toml b/Cargo.toml index c0417af..fe35afa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,8 @@ edition = "2021" [dependencies] tokio = { version = "1.27", features = ["full"] } axum = "0.6" +tower = "0.4" +tower-http = { version = "0.4", features = ["cors"]} axum-auth = { version = "0.4", features = ["auth-bearer"]} sqlx = { version = "0.6", features = ["postgres", "runtime-tokio-rustls", "all-types"] } serde = { version = "1.0", features = ["derive"] } diff --git a/src/events.rs b/src/events.rs index 9ea614d..c10a7a6 100644 --- a/src/events.rs +++ b/src/events.rs @@ -215,6 +215,48 @@ pub async fn get_event( .into_response() } +pub async fn delete_event( + AuthBearer(token): AuthBearer, + State(app_state): State, + Query(get_event_query): Query, +) -> impl IntoResponse { + if let Err(err) = handle_token(token, &app_state, Role::Student) { + return err; + }; + + let result = query!( + r#" + DELETE FROM events + WHERE id = $1 + "#, + get_event_query.id + ) + .execute(&app_state.db_pool) + .await; + + match result { + Ok(result) => { + if result.rows_affected() != 1 { + ( + StatusCode::NOT_FOUND, + Json(json!({ + "error": format!("Event {} not found.", get_event_query.id) + })), + ) + } else { + (StatusCode::OK, Json(json!({}))) + } + } + Err(err) => ( + StatusCode::INTERNAL_SERVER_ERROR, + Json(json!({ + "error": format!("Unknown error getting event: {:?}", err) + })), + ), + } + .into_response() +} + pub async fn create_event( AuthBearer(token): AuthBearer, State(app_state): State, diff --git a/src/main.rs b/src/main.rs index f4c3389..0d922f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,8 @@ mod report; mod user; mod winner; +use std::net::SocketAddr; + use axum::{ routing::{delete, get, post, put}, Router, @@ -14,7 +16,7 @@ use axum::{ use jsonwebtoken::{DecodingKey, EncodingKey}; use sqlx::postgres::PgPoolOptions; use sqlx::PgPool; -use std::net::SocketAddr; +use tower_http::cors::{self, CorsLayer}; use user::{signin, signup}; #[derive(Clone)] @@ -45,7 +47,12 @@ async fn main() { .route("/", get(root)) .route("/user/signup", post(signup)) .route("/user/signin", post(signin)) - .route("/event", get(events::get_event).post(events::create_event)) + .route( + "/event", + get(events::get_event) + .post(events::create_event) + .delete(events::delete_event), + ) .route("/event/preview", get(events::get_events_preview)) .route("/event/future", get(events::get_all_events)) .route("/event/recent", get(events::get_recent_events)) @@ -65,6 +72,12 @@ async fn main() { jwt_decode, }); + // Create CORS midleware to allow the web build of the UI to work. + let cors = CorsLayer::new() + .allow_methods(cors::Any) + .allow_origin(cors::Any); + + let app = app.layer(cors); // run our app with hyper // `axum::Server` is a re-export of `hyper::Server` let addr = SocketAddr::from(([0, 0, 0, 0], 3000));