diff --git a/db-setup.sql b/db-setup.sql index 6721fe5..8fdbb5f 100644 --- a/db-setup.sql +++ b/db-setup.sql @@ -3,8 +3,11 @@ CREATE TABLE files ( data BYTEA NOT NULL ); +CREATE SEQUENCE tasks_data_id_seq START WITH 1 INCREMENT BY 1; + CREATE TABLE tasks ( - id TEXT PRIMARY KEY, + data_id BIGINT PRIMARY KEY DEFAULT nextval('tasks_data_id_seq'), + id TEXT NOT NULL, in_game_id TEXT NOT NULL, boss_app_id TEXT NOT NULL, creator_user TEXT NOT NULL, diff --git a/src/api/add_task.rs b/src/api/add_task.rs index fc67e6f..137e3ca 100644 --- a/src/api/add_task.rs +++ b/src/api/add_task.rs @@ -3,6 +3,7 @@ use rocket::{State, http::Status}; use rocket::serde::json::Json; use crate::Pool; use crate::admin_auth::AdminAuth; +use crate::models::task::Task; use crate::models::task::is_valid_task_status; #[derive(Deserialize)] @@ -21,17 +22,36 @@ pub async fn add_task(pool: &State, input: Json, auth: AdminA let data = input.into_inner(); let admin_username = auth.0; + let task_id_end = data.task_id + .char_indices() + .nth(7) + .map(|(i, _)| i) + .unwrap_or_else(|| data.task_id.len()); + if data.boss_app_id.len() != 16 { return Err(Status::BadRequest) }; if !is_valid_task_status(&data.status) { return Err(Status::BadRequest) }; + let does_exist = sqlx::query_as!( + Task, + "SELECT * FROM tasks WHERE id = $1 AND boss_app_id = $2", + data.task_id[..task_id_end].to_string(), data.boss_app_id.to_string() + ) + .fetch_one(pool) + .await; + + match does_exist { + Ok(_) => return Err(Status::Conflict), + Err(_) => (), + }; + sqlx::query!( r#" INSERT INTO tasks (id, in_game_id, boss_app_id, creator_user, status, interval, title_id, description, created, updated) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, NOW() AT TIME ZONE 'UTC', NOW() AT TIME ZONE 'UTC') "#, - data.task_id[0..7].to_string(), + data.task_id[..task_id_end].to_string(), data.task_id, data.boss_app_id, admin_username, diff --git a/src/models/task.rs b/src/models/task.rs index 13b7192..6178e7e 100644 --- a/src/models/task.rs +++ b/src/models/task.rs @@ -14,6 +14,7 @@ pub fn is_valid_task_status(status: &str) -> bool { #[derive(Clone)] pub struct Task { pub deleted: bool, + pub data_id: i64, pub id: String, pub in_game_id: String, pub boss_app_id: String,