Skip to content

Commit 428dae5

Browse files
committed
controllers/krate: Extract CratePath::load_crate() and load_crate_id() fns
1 parent a1dde8b commit 428dae5

File tree

6 files changed

+47
-46
lines changed

6 files changed

+47
-46
lines changed

src/controllers/krate.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
use crate::models::Crate;
2+
use crate::util::errors::{crate_not_found, AppResult};
13
use axum::extract::{FromRequestParts, Path};
4+
use crates_io_database::schema::crates;
5+
use diesel::{OptionalExtension, QueryDsl};
6+
use diesel_async::{AsyncPgConnection, RunQueryDsl};
27

38
pub mod delete;
49
pub mod downloads;
@@ -15,3 +20,30 @@ pub struct CratePath {
1520
/// Name of the crate
1621
pub name: String,
1722
}
23+
24+
impl CratePath {
25+
pub async fn load_crate(&self, conn: &mut AsyncPgConnection) -> AppResult<Crate> {
26+
load_crate(conn, &self.name).await
27+
}
28+
29+
pub async fn load_crate_id(&self, conn: &mut AsyncPgConnection) -> AppResult<i32> {
30+
load_crate_id(conn, &self.name).await
31+
}
32+
}
33+
34+
pub async fn load_crate(conn: &mut AsyncPgConnection, name: &str) -> AppResult<Crate> {
35+
Crate::by_name(name)
36+
.first(conn)
37+
.await
38+
.optional()?
39+
.ok_or_else(|| crate_not_found(name))
40+
}
41+
42+
pub async fn load_crate_id(conn: &mut AsyncPgConnection, name: &str) -> AppResult<i32> {
43+
Crate::by_name(name)
44+
.select(crates::id)
45+
.first(conn)
46+
.await
47+
.optional()?
48+
.ok_or_else(|| crate_not_found(name))
49+
}

src/controllers/krate/delete.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use crate::app::AppState;
22
use crate::auth::AuthCheck;
33
use crate::controllers::krate::CratePath;
4-
use crate::models::{Crate, NewDeletedCrate, Rights};
4+
use crate::models::{NewDeletedCrate, Rights};
55
use crate::schema::{crate_downloads, crates, dependencies};
6-
use crate::util::errors::{crate_not_found, custom, AppResult, BoxedAppError};
6+
use crate::util::errors::{custom, AppResult, BoxedAppError};
77
use crate::worker::jobs;
88
use bigdecimal::ToPrimitive;
99
use chrono::{TimeDelta, Utc};
@@ -40,8 +40,7 @@ pub async fn delete_crate(path: CratePath, parts: Parts, app: AppState) -> AppRe
4040
let auth = AuthCheck::only_cookie().check(&parts, &mut conn).await?;
4141

4242
// Check that the crate exists
43-
let krate = find_crate(&mut conn, &path.name).await?;
44-
let krate = krate.ok_or_else(|| crate_not_found(&path.name))?;
43+
let krate = path.load_crate(&mut conn).await?;
4544

4645
// Check that the user is an owner of the crate (team owners are not allowed to delete crates)
4746
let user = auth.user();
@@ -119,10 +118,6 @@ pub async fn delete_crate(path: CratePath, parts: Parts, app: AppState) -> AppRe
119118
Ok(StatusCode::NO_CONTENT)
120119
}
121120

122-
async fn find_crate(conn: &mut AsyncPgConnection, name: &str) -> QueryResult<Option<Crate>> {
123-
Crate::by_name(name).first(conn).await.optional()
124-
}
125-
126121
async fn get_crate_downloads(conn: &mut AsyncPgConnection, crate_id: i32) -> QueryResult<u64> {
127122
let downloads = crate_downloads::table
128123
.find(crate_id)

src/controllers/krate/downloads.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
66
use crate::app::AppState;
77
use crate::controllers::krate::CratePath;
8-
use crate::models::{Crate, Version, VersionDownload};
9-
use crate::schema::{crates, version_downloads, versions};
8+
use crate::models::{Version, VersionDownload};
9+
use crate::schema::{version_downloads, versions};
1010
use crate::sql::to_char;
11-
use crate::util::errors::{crate_not_found, AppResult};
11+
use crate::util::errors::AppResult;
1212
use crate::views::EncodableVersionDownload;
1313
use axum_extra::json;
1414
use axum_extra::response::ErasedJson;
@@ -33,12 +33,7 @@ pub async fn get_crate_downloads(state: AppState, path: CratePath) -> AppResult<
3333
use diesel::dsl::*;
3434
use diesel::sql_types::BigInt;
3535

36-
let crate_id: i32 = Crate::by_name(&path.name)
37-
.select(crates::id)
38-
.first(&mut conn)
39-
.await
40-
.optional()?
41-
.ok_or_else(|| crate_not_found(&path.name))?;
36+
let crate_id: i32 = path.load_crate_id(&mut conn).await?;
4237

4338
let mut versions: Vec<Version> = versions::table
4439
.filter(versions::crate_id.eq(crate_id))

src/controllers/krate/metadata.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,11 +276,7 @@ pub async fn list_reverse_dependencies(
276276

277277
let pagination_options = PaginationOptions::builder().gather(&req)?;
278278

279-
let krate: Crate = Crate::by_name(&path.name)
280-
.first(&mut conn)
281-
.await
282-
.optional()?
283-
.ok_or_else(|| crate_not_found(&path.name))?;
279+
let krate = path.load_crate(&mut conn).await?;
284280

285281
let (rev_deps, total) = krate
286282
.reverse_dependencies(&mut conn, pagination_options)

src/controllers/krate/owners.rs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,7 @@ use secrecy::{ExposeSecret, SecretString};
2727
pub async fn list_owners(state: AppState, path: CratePath) -> AppResult<ErasedJson> {
2828
let mut conn = state.db_read().await?;
2929

30-
let krate: Crate = Crate::by_name(&path.name)
31-
.first(&mut conn)
32-
.await
33-
.optional()?
34-
.ok_or_else(|| crate_not_found(&path.name))?;
30+
let krate = path.load_crate(&mut conn).await?;
3531

3632
let owners = krate
3733
.owners(&mut conn)
@@ -52,11 +48,7 @@ pub async fn list_owners(state: AppState, path: CratePath) -> AppResult<ErasedJs
5248
)]
5349
pub async fn get_team_owners(state: AppState, path: CratePath) -> AppResult<ErasedJson> {
5450
let mut conn = state.db_read().await?;
55-
let krate: Crate = Crate::by_name(&path.name)
56-
.first(&mut conn)
57-
.await
58-
.optional()?
59-
.ok_or_else(|| crate_not_found(&path.name))?;
51+
let krate = path.load_crate(&mut conn).await?;
6052

6153
let owners = Team::owning(&krate, &mut conn)
6254
.await?
@@ -77,11 +69,7 @@ pub async fn get_team_owners(state: AppState, path: CratePath) -> AppResult<Eras
7769
pub async fn get_user_owners(state: AppState, path: CratePath) -> AppResult<ErasedJson> {
7870
let mut conn = state.db_read().await?;
7971

80-
let krate: Crate = Crate::by_name(&path.name)
81-
.first(&mut conn)
82-
.await
83-
.optional()?
84-
.ok_or_else(|| crate_not_found(&path.name))?;
72+
let krate = path.load_crate(&mut conn).await?;
8573

8674
let owners = User::owning(&krate, &mut conn)
8775
.await?

src/controllers/krate/versions.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ use std::str::FromStr;
1414
use crate::app::AppState;
1515
use crate::controllers::helpers::pagination::{encode_seek, Page, PaginationOptions};
1616
use crate::controllers::krate::CratePath;
17-
use crate::models::{Crate, User, Version, VersionOwnerAction};
18-
use crate::schema::{crates, users, versions};
19-
use crate::util::errors::{bad_request, crate_not_found, AppResult, BoxedAppError};
17+
use crate::models::{User, Version, VersionOwnerAction};
18+
use crate::schema::{users, versions};
19+
use crate::util::errors::{bad_request, AppResult, BoxedAppError};
2020
use crate::util::RequestUtils;
2121
use crate::views::EncodableVersion;
2222

@@ -30,12 +30,7 @@ use crate::views::EncodableVersion;
3030
pub async fn list_versions(state: AppState, path: CratePath, req: Parts) -> AppResult<ErasedJson> {
3131
let mut conn = state.db_read().await?;
3232

33-
let crate_id: i32 = Crate::by_name(&path.name)
34-
.select(crates::id)
35-
.first(&mut conn)
36-
.await
37-
.optional()?
38-
.ok_or_else(|| crate_not_found(&path.name))?;
33+
let crate_id = path.load_crate_id(&mut conn).await?;
3934

4035
let mut pagination = None;
4136
let params = req.query();

0 commit comments

Comments
 (0)