Skip to content

Commit ac91dcd

Browse files
committed
Convert more endpoints to the read-only follower database
1 parent 437f5a9 commit ac91dcd

File tree

4 files changed

+34
-20
lines changed

4 files changed

+34
-20
lines changed

src/controllers/version.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,23 @@ pub mod yank;
55

66
use super::prelude::*;
77

8-
use crate::db::DieselPooledConn;
98
use crate::models::{Crate, Version};
109

11-
fn version_and_crate(req: &dyn RequestExt) -> AppResult<(DieselPooledConn<'_>, Version, Crate)> {
12-
let crate_name = extract_crate_name(req);
13-
let semver = extract_semver(req)?;
14-
15-
let conn = req.db_conn()?;
16-
let krate: Crate = Crate::by_name(crate_name).first(&*conn)?;
10+
fn version_and_crate(
11+
conn: &PgConnection,
12+
crate_name: &str,
13+
semver: &str,
14+
) -> AppResult<(Version, Crate)> {
15+
let krate: Crate = Crate::by_name(crate_name).first(conn)?;
1716
let version = krate.find_version(&conn, semver)?;
1817

19-
Ok((conn, version, krate))
18+
Ok((version, krate))
19+
}
20+
21+
fn extract_crate_name_and_semver(req: &dyn RequestExt) -> AppResult<(&str, &str)> {
22+
let name = extract_crate_name(req);
23+
let version = extract_semver(req)?;
24+
Ok((name, version))
2025
}
2126

2227
fn extract_crate_name(req: &dyn RequestExt) -> &str {

src/controllers/version/downloads.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::models::{Crate, VersionDownload};
1010
use crate::schema::*;
1111
use crate::views::EncodableVersionDownload;
1212

13-
use super::{extract_crate_name, extract_semver};
13+
use super::{extract_crate_name_and_semver, version_and_crate};
1414

1515
/// Handles the `GET /crates/:crate_id/:version/download` route.
1616
/// This returns a URL to the location where the crate is stored.
@@ -75,12 +75,10 @@ fn increment_download_counts(
7575

7676
/// Handles the `GET /crates/:crate_id/:version/downloads` route.
7777
pub fn downloads(req: &mut dyn RequestExt) -> EndpointResult {
78-
let crate_name = extract_crate_name(req);
79-
let semver = extract_semver(req)?;
78+
let (crate_name, semver) = extract_crate_name_and_semver(req)?;
8079

8180
let conn = req.db_read_only()?;
82-
let krate: Crate = Crate::by_name(crate_name).first(&*conn)?;
83-
let version = krate.find_version(&conn, semver)?;
81+
let (version, _) = version_and_crate(&conn, crate_name, semver)?;
8482

8583
let cutoff_end_date = req
8684
.query()

src/controllers/version/metadata.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::models::VersionOwnerAction;
1010
use crate::schema::*;
1111
use crate::views::{EncodableDependency, EncodablePublicUser, EncodableVersion};
1212

13-
use super::version_and_crate;
13+
use super::{extract_crate_name_and_semver, version_and_crate};
1414

1515
/// Handles the `GET /crates/:crate_id/:version/dependencies` route.
1616
///
@@ -20,8 +20,10 @@ use super::version_and_crate;
2020
/// fields for `id`, `version_id`, and `downloads` (which appears to always
2121
/// be 0)
2222
pub fn dependencies(req: &mut dyn RequestExt) -> EndpointResult {
23-
let (conn, version, _) = version_and_crate(req)?;
24-
let deps = version.dependencies(&*conn)?;
23+
let (crate_name, semver) = extract_crate_name_and_semver(req)?;
24+
let conn = req.db_read_only()?;
25+
let (version, _) = version_and_crate(&conn, crate_name, semver)?;
26+
let deps = version.dependencies(&conn)?;
2527
let deps = deps
2628
.into_iter()
2729
.map(|(dep, crate_name)| dep.encodable(&crate_name, None))
@@ -36,7 +38,9 @@ pub fn dependencies(req: &mut dyn RequestExt) -> EndpointResult {
3638

3739
/// Handles the `GET /crates/:crate_id/:version/authors` route.
3840
pub fn authors(req: &mut dyn RequestExt) -> EndpointResult {
39-
let (conn, version, _) = version_and_crate(req)?;
41+
let (crate_name, semver) = extract_crate_name_and_semver(req)?;
42+
let conn = req.db_read_only()?;
43+
let (version, _) = version_and_crate(&conn, crate_name, semver)?;
4044
let names = version_authors::table
4145
.filter(version_authors::version_id.eq(version.id))
4246
.select(version_authors::name)
@@ -66,7 +70,9 @@ pub fn authors(req: &mut dyn RequestExt) -> EndpointResult {
6670
/// The frontend doesn't appear to hit this endpoint, but our tests do, and it seems to be a useful
6771
/// API route to have.
6872
pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
69-
let (conn, version, krate) = version_and_crate(req)?;
73+
let (crate_name, semver) = extract_crate_name_and_semver(req)?;
74+
let conn = req.db_read_only()?;
75+
let (version, krate) = version_and_crate(&conn, crate_name, semver)?;
7076
let published_by = version.published_by(&conn);
7177
let actions = VersionOwnerAction::by_version(&conn, &version)?;
7278

src/controllers/version/yank.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use swirl::Job;
44

5-
use super::version_and_crate;
5+
use super::{extract_crate_name_and_semver, version_and_crate};
66
use crate::controllers::cargo_prelude::*;
77
use crate::git;
88
use crate::models::Rights;
@@ -28,8 +28,13 @@ pub fn unyank(req: &mut dyn RequestExt) -> EndpointResult {
2828

2929
/// Changes `yanked` flag on a crate version record
3030
fn modify_yank(req: &mut dyn RequestExt, yanked: bool) -> EndpointResult {
31+
// FIXME: Should reject bad requests before authentication, but can't due to
32+
// lifetime issues with `req`.
3133
let authenticated_user = req.authenticate()?;
32-
let (conn, version, krate) = version_and_crate(req)?;
34+
let (crate_name, semver) = extract_crate_name_and_semver(req)?;
35+
36+
let conn = req.db_conn()?;
37+
let (version, krate) = version_and_crate(&conn, crate_name, semver)?;
3338
let api_token_id = authenticated_user.api_token_id();
3439
let user = authenticated_user.user();
3540
let owners = krate.owners(&conn)?;

0 commit comments

Comments
 (0)