From cfa376458e31eb115149743a021fa826602fdddb Mon Sep 17 00:00:00 2001 From: jasonyess Date: Sat, 28 Dec 2024 13:28:41 -0500 Subject: [PATCH 1/5] Fixed code 500 when creating demon with level ID --- pointercrate-demonlist-api/src/endpoints/demon.rs | 5 ++++- pointercrate-demonlist/src/demon/post.rs | 3 +-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pointercrate-demonlist-api/src/endpoints/demon.rs b/pointercrate-demonlist-api/src/endpoints/demon.rs index 324c81535..19d039460 100644 --- a/pointercrate-demonlist-api/src/endpoints/demon.rs +++ b/pointercrate-demonlist-api/src/endpoints/demon.rs @@ -19,6 +19,7 @@ use pointercrate_demonlist::{ }; use pointercrate_user::auth::ApiToken; use pointercrate_user_api::auth::Auth; +use pointercrate_integrate::gd::GeometryDashConnector; use rocket::{http::Status, serde::json::Json, State}; #[rocket::get("/")] @@ -64,7 +65,7 @@ pub async fn movement_log(demon_id: i32, pool: &State) -> Resu #[rocket::post("/", data = "")] pub async fn post( - mut auth: Auth, data: Json, ratelimits: &State, + mut auth: Auth, data: Json, ratelimits: &State, gd: &State ) -> Result>> { auth.require_permission(LIST_MODERATOR)?; @@ -76,6 +77,8 @@ pub async fn post( let demon_id = demon.demon.base.id; + gd.inner().clone().refresh_demon_data(demon.demon.base.name.clone(), demon_id).await; + Ok(Response2::tagged(demon) .status(Status::Created) .with_header("Location", format!("/api/v2/demons/{}/", demon_id))) diff --git a/pointercrate-demonlist/src/demon/post.rs b/pointercrate-demonlist/src/demon/post.rs index f7bccbbe6..e617c371d 100644 --- a/pointercrate-demonlist/src/demon/post.rs +++ b/pointercrate-demonlist/src/demon/post.rs @@ -41,7 +41,7 @@ impl FullDemon { Demon::shift_down(data.position, connection).await?; let created = sqlx::query!( - "INSERT INTO demons (name, position, requirement, video, verifier, publisher, level_id) VALUES ($1::text,$2,$3,$4::text,$5,$6, $7) \ + "INSERT INTO demons (name, position, requirement, video, verifier, publisher) VALUES ($1::text,$2,$3,$4::text,$5,$6) \ RETURNING id, thumbnail", data.name.to_string(), data.position, @@ -49,7 +49,6 @@ impl FullDemon { video.as_ref(), verifier.id, publisher.id, - data.level_id ) .fetch_one(&mut *connection) .await?; From b0fc0701c05f8d3dd2ef65d8418534b3cced3ae7 Mon Sep 17 00:00:00 2001 From: jasonyess Date: Sat, 28 Dec 2024 13:41:14 -0500 Subject: [PATCH 2/5] Removed requirement to pass a level ID in form --- pointercrate-demonlist-pages/src/account/demons.rs | 2 +- pointercrate-demonlist-pages/static/js/account/demon.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pointercrate-demonlist-pages/src/account/demons.rs b/pointercrate-demonlist-pages/src/account/demons.rs index a5f0ca422..0791191cf 100644 --- a/pointercrate-demonlist-pages/src/account/demons.rs +++ b/pointercrate-demonlist-pages/src/account/demons.rs @@ -346,7 +346,7 @@ fn demon_submitter() -> Markup { label for = "level_id" { "Geometry Dash Level ID:" } - input type = "number" name = "level_id" required min = "1"; + input type = "number" name = "level_id" min = "1"; p.error {} } span.form-input.flex.col #demon-add-position { diff --git a/pointercrate-demonlist-pages/static/js/account/demon.js b/pointercrate-demonlist-pages/static/js/account/demon.js index 4323f3392..1325f4cf4 100644 --- a/pointercrate-demonlist-pages/static/js/account/demon.js +++ b/pointercrate-demonlist-pages/static/js/account/demon.js @@ -256,7 +256,6 @@ function setupDemonAdditionForm() { form.addValidators({ "demon-add-name": { "Please specify a name": valueMissing }, "demon-add-level-id": { - "Please specify a Geometry Dash level ID": valueMissing, "Level ID must be positive": rangeUnderflow, }, "demon-add-position": { From d239a16ccf2a9d2ded5b24678924723ffc51daa5 Mon Sep 17 00:00:00 2001 From: jasonyess Date: Sun, 29 Dec 2024 19:45:38 -0500 Subject: [PATCH 3/5] Revert "Fixed code 500 when creating demon with level ID" --- pointercrate-demonlist-api/src/endpoints/demon.rs | 5 +---- pointercrate-demonlist/src/demon/post.rs | 3 ++- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pointercrate-demonlist-api/src/endpoints/demon.rs b/pointercrate-demonlist-api/src/endpoints/demon.rs index 19d039460..324c81535 100644 --- a/pointercrate-demonlist-api/src/endpoints/demon.rs +++ b/pointercrate-demonlist-api/src/endpoints/demon.rs @@ -19,7 +19,6 @@ use pointercrate_demonlist::{ }; use pointercrate_user::auth::ApiToken; use pointercrate_user_api::auth::Auth; -use pointercrate_integrate::gd::GeometryDashConnector; use rocket::{http::Status, serde::json::Json, State}; #[rocket::get("/")] @@ -65,7 +64,7 @@ pub async fn movement_log(demon_id: i32, pool: &State) -> Resu #[rocket::post("/", data = "")] pub async fn post( - mut auth: Auth, data: Json, ratelimits: &State, gd: &State + mut auth: Auth, data: Json, ratelimits: &State, ) -> Result>> { auth.require_permission(LIST_MODERATOR)?; @@ -77,8 +76,6 @@ pub async fn post( let demon_id = demon.demon.base.id; - gd.inner().clone().refresh_demon_data(demon.demon.base.name.clone(), demon_id).await; - Ok(Response2::tagged(demon) .status(Status::Created) .with_header("Location", format!("/api/v2/demons/{}/", demon_id))) diff --git a/pointercrate-demonlist/src/demon/post.rs b/pointercrate-demonlist/src/demon/post.rs index e617c371d..f7bccbbe6 100644 --- a/pointercrate-demonlist/src/demon/post.rs +++ b/pointercrate-demonlist/src/demon/post.rs @@ -41,7 +41,7 @@ impl FullDemon { Demon::shift_down(data.position, connection).await?; let created = sqlx::query!( - "INSERT INTO demons (name, position, requirement, video, verifier, publisher) VALUES ($1::text,$2,$3,$4::text,$5,$6) \ + "INSERT INTO demons (name, position, requirement, video, verifier, publisher, level_id) VALUES ($1::text,$2,$3,$4::text,$5,$6, $7) \ RETURNING id, thumbnail", data.name.to_string(), data.position, @@ -49,6 +49,7 @@ impl FullDemon { video.as_ref(), verifier.id, publisher.id, + data.level_id ) .fetch_one(&mut *connection) .await?; From 056aecba49970c88b7e6b7b36f11976599bf8ec4 Mon Sep 17 00:00:00 2001 From: jasonyess Date: Sun, 29 Dec 2024 19:47:54 -0500 Subject: [PATCH 4/5] Add migrations --- migrations/20241229232706_no_level_id_ref.down.sql | 10 ++++++++++ migrations/20241229232706_no_level_id_ref.up.sql | 1 + 2 files changed, 11 insertions(+) create mode 100644 migrations/20241229232706_no_level_id_ref.down.sql create mode 100644 migrations/20241229232706_no_level_id_ref.up.sql diff --git a/migrations/20241229232706_no_level_id_ref.down.sql b/migrations/20241229232706_no_level_id_ref.down.sql new file mode 100644 index 000000000..833939ecf --- /dev/null +++ b/migrations/20241229232706_no_level_id_ref.down.sql @@ -0,0 +1,10 @@ +UPDATE demons +SET level_id = NULL +WHERE level_id IS NOT NULL + AND level_id NOT IN ( + SELECT level_id + FROM gj_level + ); +-- if a demon was added when the constraint was dropped but had an invalid level_id (didn't appear in gj_level), it will be set to null +ALTER TABLE demons +ADD CONSTRAINT demons_level_id_fkey FOREIGN KEY (level_id) REFERENCES gj_level(level_id); \ No newline at end of file diff --git a/migrations/20241229232706_no_level_id_ref.up.sql b/migrations/20241229232706_no_level_id_ref.up.sql new file mode 100644 index 000000000..b7cb8a228 --- /dev/null +++ b/migrations/20241229232706_no_level_id_ref.up.sql @@ -0,0 +1 @@ +ALTER TABLE demons DROP CONSTRAINT IF EXISTS demons_level_id_fkey; \ No newline at end of file From 02012142852520b09ecd219fbe87fa82b48e72c0 Mon Sep 17 00:00:00 2001 From: jasonyess Date: Sun, 29 Dec 2024 19:49:11 -0500 Subject: [PATCH 5/5] Modified request body in test_add_demon_ratelimits --- pointercrate-test/tests/demonlist/demon.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pointercrate-test/tests/demonlist/demon.rs b/pointercrate-test/tests/demonlist/demon.rs index 10d68a776..febccedd9 100644 --- a/pointercrate-test/tests/demonlist/demon.rs +++ b/pointercrate-test/tests/demonlist/demon.rs @@ -14,7 +14,7 @@ async fn test_add_demon_ratelimits(pool: Pool) { let user = pointercrate_test::user::system_user_with_perms(LIST_MODERATOR, &mut *connection).await; - let demon = serde_json::json! {{"name": "Bloodbath", "requirement": 90, "position": 1, "verifier": "Riot", "publisher": "Riot", "creators": []}}; + let demon = serde_json::json! {{"name": "Bloodbath", "requirement": 90, "position": 1, "verifier": "Riot", "publisher": "Riot", "creators": [], "level_id": 10565740}}; // first one should succeed clnt.post("/api/v2/demons/", &demon)