Skip to content

Commit 1c65ab3

Browse files
committed
Auto merge of #3118 - jtgeibel:more-endpoints-on-readonly-follower-db, r=Turbo87
Convert more endpoints to the read-only follower database r? `@pietroalbini`
2 parents 643604b + aea4457 commit 1c65ab3

File tree

11 files changed

+47
-33
lines changed

11 files changed

+47
-33
lines changed

src/controllers/category.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pub fn index(req: &mut dyn RequestExt) -> EndpointResult {
1515
let offset = options.offset().unwrap_or_default();
1616
let sort = query.get("sort").map_or("alpha", String::as_str);
1717

18-
let conn = req.db_conn()?;
18+
let conn = req.db_read_only()?;
1919
let categories =
2020
Category::toplevel(&conn, sort, i64::from(options.per_page), i64::from(offset))?;
2121
let categories = categories.into_iter().map(Category::into).collect();
@@ -42,7 +42,7 @@ pub fn index(req: &mut dyn RequestExt) -> EndpointResult {
4242
/// Handles the `GET /categories/:category_id` route.
4343
pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
4444
let slug = &req.params()["category_id"];
45-
let conn = req.db_conn()?;
45+
let conn = req.db_read_only()?;
4646
let cat: Category = Category::by_slug(slug).first(&*conn)?;
4747
let subcats = cat
4848
.subcategories(&conn)?
@@ -78,7 +78,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
7878

7979
/// Handles the `GET /category_slugs` route.
8080
pub fn slugs(req: &mut dyn RequestExt) -> EndpointResult {
81-
let conn = req.db_conn()?;
81+
let conn = req.db_read_only()?;
8282
let slugs = categories::table
8383
.select((categories::slug, categories::slug, categories::description))
8484
.order(categories::slug)

src/controllers/crate_owner_invitation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::views::{EncodableCrateOwnerInvitation, InvitationResponse};
77
/// Handles the `GET /me/crate_owner_invitations` route.
88
pub fn list(req: &mut dyn RequestExt) -> EndpointResult {
99
let user_id = req.authenticate()?.user_id();
10-
let conn = &*req.db_conn()?;
10+
let conn = &*req.db_read_only()?;
1111

1212
let crate_owner_invitations: Vec<CrateOwnerInvitation> = crate_owner_invitations::table
1313
.filter(crate_owner_invitations::invited_user_id.eq(user_id))

src/controllers/keyword.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub fn index(req: &mut dyn RequestExt) -> EndpointResult {
2020
}
2121

2222
let query = query.paginate(req)?;
23-
let conn = req.db_conn()?;
23+
let conn = req.db_read_only()?;
2424
let data: Paginated<Keyword> = query.load(&*conn)?;
2525
let total = data.total();
2626
let kws = data.into_iter().map(Keyword::into).collect::<Vec<_>>();
@@ -44,7 +44,7 @@ pub fn index(req: &mut dyn RequestExt) -> EndpointResult {
4444
/// Handles the `GET /keywords/:keyword_id` route.
4545
pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
4646
let name = &req.params()["keyword_id"];
47-
let conn = req.db_conn()?;
47+
let conn = req.db_read_only()?;
4848

4949
let kw = Keyword::find_by_keyword(&conn, name)?;
5050

src/controllers/krate/follow.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ pub fn following(req: &mut dyn RequestExt) -> EndpointResult {
4747
use diesel::dsl::exists;
4848

4949
let user_id = req.authenticate()?.user_id();
50-
let conn = req.db_conn()?;
50+
let conn = req.db_read_only()?;
5151
let follow = follow_target(req, &conn, user_id)?;
5252
let following = diesel::select(exists(follows::table.find(follow.id()))).get_result(&*conn)?;
5353

src/controllers/krate/owners.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::views::EncodableOwner;
77
/// Handles the `GET /crates/:crate_id/owners` route.
88
pub fn owners(req: &mut dyn RequestExt) -> EndpointResult {
99
let crate_name = &req.params()["crate_id"];
10-
let conn = req.db_conn()?;
10+
let conn = req.db_read_only()?;
1111
let krate: Crate = Crate::by_name(crate_name).first(&*conn)?;
1212
let owners = krate.owners(&conn)?.into_iter().map(Owner::into).collect();
1313

@@ -21,7 +21,7 @@ pub fn owners(req: &mut dyn RequestExt) -> EndpointResult {
2121
/// Handles the `GET /crates/:crate_id/owner_team` route.
2222
pub fn owner_team(req: &mut dyn RequestExt) -> EndpointResult {
2323
let crate_name = &req.params()["crate_id"];
24-
let conn = req.db_conn()?;
24+
let conn = req.db_read_only()?;
2525
let krate: Crate = Crate::by_name(crate_name).first(&*conn)?;
2626
let owners = Team::owning(&krate, &conn)?
2727
.into_iter()
@@ -38,7 +38,7 @@ pub fn owner_team(req: &mut dyn RequestExt) -> EndpointResult {
3838
/// Handles the `GET /crates/:crate_id/owner_user` route.
3939
pub fn owner_user(req: &mut dyn RequestExt) -> EndpointResult {
4040
let crate_name = &req.params()["crate_id"];
41-
let conn = req.db_conn()?;
41+
let conn = req.db_read_only()?;
4242
let krate: Crate = Crate::by_name(crate_name).first(&*conn)?;
4343
let owners = User::owning(&krate, &conn)?
4444
.into_iter()

src/controllers/team.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub fn show_team(req: &mut dyn RequestExt) -> EndpointResult {
99
use self::teams::dsl::{login, teams};
1010

1111
let name = &req.params()["team_id"];
12-
let conn = req.db_conn()?;
12+
let conn = req.db_read_only()?;
1313
let team: Team = teams.filter(login.eq(name)).first(&*conn)?;
1414

1515
#[derive(Serialize)]

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/deprecated.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::views::EncodableVersion;
1414
/// Handles the `GET /versions` route.
1515
pub fn index(req: &mut dyn RequestExt) -> EndpointResult {
1616
use diesel::dsl::any;
17-
let conn = req.db_conn()?;
17+
let conn = req.db_read_only()?;
1818

1919
// Extract all ids requested.
2020
let query = url::form_urlencoded::parse(req.query_string().unwrap_or("").as_bytes());
@@ -58,7 +58,7 @@ pub fn index(req: &mut dyn RequestExt) -> EndpointResult {
5858
pub fn show_by_id(req: &mut dyn RequestExt) -> EndpointResult {
5959
let id = &req.params()["version_id"];
6060
let id = id.parse().unwrap_or(0);
61-
let conn = req.db_conn()?;
61+
let conn = req.db_read_only()?;
6262
let (version, krate, published_by): (Version, Crate, Option<User>) = versions::table
6363
.find(id)
6464
.inner_join(crates::table)

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)