Skip to content

Commit

Permalink
fix: handle empty strings when creating maps
Browse files Browse the repository at this point in the history
Also fixes `offset` and `limit` in `GET /maps`.
  • Loading branch information
AlphaKeks committed Jan 18, 2024
1 parent 89dbd5f commit 0d92b07
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 22 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 26 additions & 6 deletions src/maps/routes/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,14 +155,19 @@ async fn insert_map(
sqlx::query! {
r#"
INSERT INTO
Maps (name, workshop_id, checksum, global_status)
Maps (name, workshop_id, checksum, global_status, description)
VALUES
(?, ?, ?, ?)
(?, ?, ?, ?, ?)
"#,
workshop_map.name,
map.workshop_id,
checksum,
map.global_status,
if matches!(map.description.as_deref(), Some("")) {
&None
} else {
&map.description
},
}
.execute(transaction.as_mut())
.await?;
Expand Down Expand Up @@ -217,13 +222,22 @@ async fn insert_courses(
courses: &[NewCourse],
transaction: &mut Transaction<'static, MySql>,
) -> Result<()> {
let mut query = QueryBuilder::new("INSERT INTO Courses (map_id, map_stage, name)");
let mut query = QueryBuilder::new("INSERT INTO Courses (map_id, map_stage, name, description)");

query.push_values(courses, |mut query, course| {
query
.push_bind(map_id)
.push_bind(course.stage)
.push_bind(&course.name);
.push_bind(if matches!(course.name.as_deref(), Some("")) {
&None
} else {
&course.name
})
.push_bind(if matches!(course.description.as_deref(), Some("")) {
&None
} else {
&course.description
});
});

query.build().execute(transaction.as_mut()).await?;
Expand Down Expand Up @@ -288,7 +302,8 @@ async fn insert_course_details(
mode_id,
teleports,
tier,
ranked_status
ranked_status,
notes
)
"#,
);
Expand All @@ -299,7 +314,12 @@ async fn insert_course_details(
.push_bind(filter.mode)
.push_bind(filter.teleports)
.push_bind(filter.tier)
.push_bind(filter.ranked_status);
.push_bind(filter.ranked_status)
.push_bind(if matches!(filter.notes.as_deref(), Some("")) {
&None
} else {
&filter.notes
});
});

insert_filters.build().execute(transaction.as_mut()).await?;
Expand Down
25 changes: 12 additions & 13 deletions src/maps/routes/get_many.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use axum::extract::Query;
use axum::Json;
use cs2kz::PlayerIdentifier;
use itertools::Itertools;
use serde::Deserialize;
use sqlx::QueryBuilder;
use utoipa::IntoParams;
Expand All @@ -9,7 +10,7 @@ use crate::database::{GlobalStatus, ToID};
use crate::extractors::State;
use crate::maps::{queries, KZMap};
use crate::params::{Limit, Offset};
use crate::query::{self, Filter};
use crate::query::Filter;
use crate::{responses, Error, Result};

/// Query Parameters for fetching [`KZMap`]s.
Expand Down Expand Up @@ -86,23 +87,21 @@ pub async fn get_many(
filter.switch();
}

if let Some(global_status) = params.global_status {
query
.push(filter)
.push(" m.global_status = ")
.push_bind(global_status);

filter.switch();
}

query.push(" ORDER BY m.id ASC ");
query::push_limit(params.limit, params.offset, &mut query);
query
.push(filter)
.push(" m.global_status = ")
.push_bind(params.global_status.unwrap_or(GlobalStatus::Global))
.push(" ORDER BY m.id ASC ");

let maps = query
.build_query_as::<KZMap>()
.fetch_all(state.database())
.await
.map(KZMap::flatten)?;
.map(KZMap::flatten)?
.into_iter()
.skip(params.offset.0 as _)
.take(params.limit.0 as _)
.collect_vec();

if maps.is_empty() {
return Err(Error::NoContent);
Expand Down

0 comments on commit 0d92b07

Please sign in to comment.