Skip to content

Commit 76c0706

Browse files
committed
Handle missing achievement detail rows
1 parent 4b65336 commit 76c0706

6 files changed

Lines changed: 36 additions & 12 deletions

File tree

src/api/achievements/id/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
2929
params(LanguageParams),
3030
responses(
3131
(status = 200, description = "Achievement", body = Achievement),
32+
(status = 404, description = "Achievement not found"),
3233
)
3334
)]
3435
#[get("/api/achievements/{id}")]
@@ -37,8 +38,11 @@ async fn get_achievement(
3738
language_params: web::Query<LanguageParams>,
3839
pool: web::Data<PgPool>,
3940
) -> ApiResult<impl Responder> {
40-
let db_achievement =
41-
database::achievements::get_one_by_id(*id, language_params.lang, &pool).await?;
41+
let Some(db_achievement) =
42+
database::achievements::get_one_by_id(*id, language_params.lang, &pool).await?
43+
else {
44+
return Ok(HttpResponse::NotFound().finish());
45+
};
4246

4347
let mut achievement = Achievement::from(db_achievement);
4448

src/api/gi/achievements/id/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
2727
params(LanguageParams),
2828
responses(
2929
(status = 200, description = "Achievement", body = Achievement),
30+
(status = 404, description = "Achievement not found"),
3031
)
3132
)]
3233
#[get("/api/gi/achievements/{id}")]
@@ -42,8 +43,11 @@ async fn get_gi_achievement(
4243
false
4344
};
4445

45-
let db_achievement =
46-
database::gi::achievements::get_one_by_id(*id, language_params.lang, &pool).await?;
46+
let Some(db_achievement) =
47+
database::gi::achievements::get_one_by_id(*id, language_params.lang, &pool).await?
48+
else {
49+
return Ok(HttpResponse::NotFound().finish());
50+
};
4751

4852
if (db_achievement.impossible && db_achievement.hidden) && !admin {
4953
return Ok(HttpResponse::NotFound().finish());

src/api/zzz/achievements/id/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
2727
params(LanguageParams),
2828
responses(
2929
(status = 200, description = "Achievement", body = Achievement),
30+
(status = 404, description = "Achievement not found"),
3031
)
3132
)]
3233
#[get("/api/zzz/achievements/{id}")]
@@ -42,8 +43,11 @@ async fn get_zzz_achievement(
4243
false
4344
};
4445

45-
let db_achievement =
46-
database::zzz::achievements::get_one_by_id(*id, language_params.lang, &pool).await?;
46+
let Some(db_achievement) =
47+
database::zzz::achievements::get_one_by_id(*id, language_params.lang, &pool).await?
48+
else {
49+
return Ok(HttpResponse::NotFound().finish());
50+
};
4751

4852
if (db_achievement.impossible && db_achievement.hidden) && !admin {
4953
return Ok(HttpResponse::NotFound().finish());

src/database/achievements.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,11 @@ pub async fn get_all_related_ids(id: i32, set: i32, pool: &PgPool) -> Result<Vec
8585
)
8686
}
8787

88-
pub async fn get_one_by_id(id: i32, language: Language, pool: &PgPool) -> Result<DbAchievement> {
88+
pub async fn get_one_by_id(
89+
id: i32,
90+
language: Language,
91+
pool: &PgPool,
92+
) -> Result<Option<DbAchievement>> {
8993
let language = language.to_string();
9094

9195
Ok(sqlx::query_file_as!(
@@ -94,7 +98,7 @@ pub async fn get_one_by_id(id: i32, language: Language, pool: &PgPool) -> Result
9498
id,
9599
language,
96100
)
97-
.fetch_one(pool)
101+
.fetch_optional(pool)
98102
.await?)
99103
}
100104

src/database/gi/achievements.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ pub async fn get_all(language: Language, pool: &PgPool) -> Result<Vec<DbAchievem
5757
)
5858
}
5959

60-
pub async fn get_one_by_id(id: i32, language: Language, pool: &PgPool) -> Result<DbAchievement> {
60+
pub async fn get_one_by_id(
61+
id: i32,
62+
language: Language,
63+
pool: &PgPool,
64+
) -> Result<Option<DbAchievement>> {
6165
let language = language.to_string();
6266

6367
Ok(sqlx::query_file_as!(
@@ -66,7 +70,7 @@ pub async fn get_one_by_id(id: i32, language: Language, pool: &PgPool) -> Result
6670
id,
6771
language,
6872
)
69-
.fetch_one(pool)
73+
.fetch_optional(pool)
7074
.await?)
7175
}
7276

src/database/zzz/achievements.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ pub async fn get_all(language: Language, pool: &PgPool) -> Result<Vec<DbAchievem
6060
)
6161
}
6262

63-
pub async fn get_one_by_id(id: i32, language: Language, pool: &PgPool) -> Result<DbAchievement> {
63+
pub async fn get_one_by_id(
64+
id: i32,
65+
language: Language,
66+
pool: &PgPool,
67+
) -> Result<Option<DbAchievement>> {
6468
let language = language.to_string();
6569

6670
Ok(sqlx::query_file_as!(
@@ -69,7 +73,7 @@ pub async fn get_one_by_id(id: i32, language: Language, pool: &PgPool) -> Result
6973
id,
7074
language,
7175
)
72-
.fetch_one(pool)
76+
.fetch_optional(pool)
7377
.await?)
7478
}
7579

0 commit comments

Comments
 (0)