Adds delete method

This commit is contained in:
2025-10-05 19:58:33 +02:00
parent cb9cfec119
commit 37a83275bd
4 changed files with 38 additions and 15 deletions

View File

@@ -1,7 +1,8 @@
use crate::dtos::tracker::TrackerDTO; use crate::dtos::tracker::TrackerDTO;
use crate::models::AppState; use crate::models::AppState;
use crate::models::tracker::{NewTracker, Tracker}; use crate::models::tracker::Tracker;
use crate::schema::trackers; use crate::schema::trackers;
use crate::schema::trackers::dsl;
use chrono::Utc; use chrono::Utc;
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper}; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper};
use rocket::State; use rocket::State;
@@ -20,7 +21,7 @@ pub fn index(
let offset = offset.unwrap_or(0); let offset = offset.unwrap_or(0);
let limit = limit.unwrap_or(10); let limit = limit.unwrap_or(10);
let results = trackers::dsl::trackers let results = dsl::trackers
.offset(offset) .offset(offset)
.limit(limit) .limit(limit)
.select(Tracker::as_select()) .select(Tracker::as_select())
@@ -39,10 +40,10 @@ pub fn get(id: String, state: &State<AppState>) -> Result<Json<TrackerDTO>, Stat
let id = match Uuid::parse_str(id.as_str()).ok() { let id = match Uuid::parse_str(id.as_str()).ok() {
Some(id) => id, 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)) .filter(trackers::id.eq(id))
.first::<Tracker>(&mut *db) .first::<Tracker>(&mut *db)
.ok(); .ok();
@@ -57,7 +58,8 @@ pub fn get(id: String, state: &State<AppState>) -> Result<Json<TrackerDTO>, Stat
pub fn create(state: &State<AppState>) -> Result<Json<TrackerDTO>, Status> { pub fn create(state: &State<AppState>) -> Result<Json<TrackerDTO>, Status> {
let mut db = state.db.lock().unwrap(); let mut db = state.db.lock().unwrap();
let new = NewTracker { let new = Tracker {
id: Uuid::new_v4(),
created_at: Utc::now().naive_utc(), created_at: Utc::now().naive_utc(),
}; };
let result = diesel::insert_into(trackers::table) let result = diesel::insert_into(trackers::table)
@@ -71,3 +73,23 @@ pub fn create(state: &State<AppState>) -> Result<Json<TrackerDTO>, Status> {
None => Err(Status::InternalServerError), None => Err(Status::InternalServerError),
} }
} }
#[delete("/<id>")]
pub fn delete(id: String, state: &State<AppState>) -> Result<Status, Status> {
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),
}
}

View File

@@ -1,5 +1,5 @@
use crate::models::tracker::Tracker; use crate::models::tracker::Tracker;
use serde::{Deserialize, Serialize}; use serde::Serialize;
#[derive(Serialize)] #[derive(Serialize)]
pub struct TrackerDTO { pub struct TrackerDTO {

View File

@@ -27,5 +27,13 @@ fn rocket() -> _ {
rocket::build() rocket::build()
.manage(app_data) .manage(app_data)
.mount("/", routes![index]) .mount("/", routes![index])
.mount("/tracker", routes![tracker::index, tracker::get, tracker::create]) .mount(
"/tracker",
routes![
tracker::index,
tracker::get,
tracker::create,
tracker::delete
],
)
} }

View File

@@ -2,17 +2,10 @@ use chrono::NaiveDateTime;
use diesel::{Insertable, Queryable, Selectable}; use diesel::{Insertable, Queryable, Selectable};
use uuid::Uuid; use uuid::Uuid;
#[derive(Queryable, Selectable, Clone)] #[derive(Queryable, Selectable, Insertable, Clone)]
#[diesel(table_name = crate::schema::trackers)] #[diesel(table_name = crate::schema::trackers)]
#[diesel(check_for_backend(diesel::pg::Pg))] #[diesel(check_for_backend(diesel::pg::Pg))]
pub struct Tracker { pub struct Tracker {
pub id: Uuid, pub id: Uuid,
pub created_at: NaiveDateTime, 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,
}