From 37a83275bd1b321a80aeed36c072d2f15690711b Mon Sep 17 00:00:00 2001 From: Daniel Svitan Date: Sun, 5 Oct 2025 19:58:33 +0200 Subject: [PATCH] :sparkles: Adds delete method --- src/api/tracker.rs | 32 +++++++++++++++++++++++++++----- src/dtos/tracker.rs | 2 +- src/main.rs | 10 +++++++++- src/models/tracker.rs | 9 +-------- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/api/tracker.rs b/src/api/tracker.rs index 5698ea7..43c6019 100644 --- a/src/api/tracker.rs +++ b/src/api/tracker.rs @@ -1,7 +1,8 @@ use crate::dtos::tracker::TrackerDTO; use crate::models::AppState; -use crate::models::tracker::{NewTracker, Tracker}; +use crate::models::tracker::Tracker; use crate::schema::trackers; +use crate::schema::trackers::dsl; use chrono::Utc; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper}; use rocket::State; @@ -20,7 +21,7 @@ pub fn index( let offset = offset.unwrap_or(0); let limit = limit.unwrap_or(10); - let results = trackers::dsl::trackers + let results = dsl::trackers .offset(offset) .limit(limit) .select(Tracker::as_select()) @@ -39,10 +40,10 @@ pub fn get(id: String, state: &State) -> Result, Stat let id = match Uuid::parse_str(id.as_str()).ok() { Some(id) => id, - None => return Err(Status::NotFound), + None => return Err(Status::BadRequest), }; - let result = trackers::dsl::trackers + let result = dsl::trackers .filter(trackers::id.eq(id)) .first::(&mut *db) .ok(); @@ -57,7 +58,8 @@ pub fn get(id: String, state: &State) -> Result, Stat pub fn create(state: &State) -> Result, Status> { let mut db = state.db.lock().unwrap(); - let new = NewTracker { + let new = Tracker { + id: Uuid::new_v4(), created_at: Utc::now().naive_utc(), }; let result = diesel::insert_into(trackers::table) @@ -71,3 +73,23 @@ pub fn create(state: &State) -> Result, Status> { None => Err(Status::InternalServerError), } } + +#[delete("/")] +pub fn delete(id: String, state: &State) -> Result { + let mut db = state.db.lock().unwrap(); + + let id = match Uuid::parse_str(id.as_str()).ok() { + Some(id) => id, + None => return Err(Status::BadRequest), + }; + + let count = diesel::delete(dsl::trackers.filter(dsl::id.eq(id))) + .execute(&mut *db) + .ok(); + + match count { + Some(count) if count > 0 => Ok(Status::Ok), + Some(_) => Ok(Status::NotFound), + None => Err(Status::InternalServerError), + } +} diff --git a/src/dtos/tracker.rs b/src/dtos/tracker.rs index 4867db9..8a0c38a 100644 --- a/src/dtos/tracker.rs +++ b/src/dtos/tracker.rs @@ -1,5 +1,5 @@ use crate::models::tracker::Tracker; -use serde::{Deserialize, Serialize}; +use serde::Serialize; #[derive(Serialize)] pub struct TrackerDTO { diff --git a/src/main.rs b/src/main.rs index a69b185..b1ab378 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,5 +27,13 @@ fn rocket() -> _ { rocket::build() .manage(app_data) .mount("/", routes![index]) - .mount("/tracker", routes![tracker::index, tracker::get, tracker::create]) + .mount( + "/tracker", + routes![ + tracker::index, + tracker::get, + tracker::create, + tracker::delete + ], + ) } diff --git a/src/models/tracker.rs b/src/models/tracker.rs index 00aa087..a2c8d1f 100644 --- a/src/models/tracker.rs +++ b/src/models/tracker.rs @@ -2,17 +2,10 @@ use chrono::NaiveDateTime; use diesel::{Insertable, Queryable, Selectable}; use uuid::Uuid; -#[derive(Queryable, Selectable, Clone)] +#[derive(Queryable, Selectable, Insertable, Clone)] #[diesel(table_name = crate::schema::trackers)] #[diesel(check_for_backend(diesel::pg::Pg))] pub struct Tracker { pub id: Uuid, pub created_at: NaiveDateTime, } - -#[derive(Insertable)] -#[diesel(table_name = crate::schema::trackers)] -#[diesel(check_for_backend(diesel::pg::Pg))] -pub struct NewTracker { - pub created_at: NaiveDateTime, -}