Skip to content

Commit 6d94155

Browse files
committed
Refactor querying crate owners by owner kind
1 parent 0a30e8e commit 6d94155

File tree

5 files changed

+43
-28
lines changed

5 files changed

+43
-28
lines changed

src/controllers/krate/search.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use diesel_full_text_search::*;
55

66
use crate::controllers::helpers::Paginate;
77
use crate::controllers::prelude::*;
8-
use crate::models::{Crate, CrateBadge, CrateVersions, OwnerKind, Version};
8+
use crate::models::{Crate, CrateBadge, CrateOwner, CrateVersions, OwnerKind, Version};
99
use crate::schema::*;
1010
use crate::views::EncodableCrate;
1111

@@ -118,21 +118,17 @@ pub fn search(req: &mut dyn Request) -> CargoResult<Response> {
118118
} else if let Some(user_id) = params.get("user_id").and_then(|s| s.parse::<i32>().ok()) {
119119
query = query.filter(
120120
crates::id.eq_any(
121-
crate_owners::table
121+
CrateOwner::by_owner_kind(OwnerKind::User)
122122
.select(crate_owners::crate_id)
123-
.filter(crate_owners::owner_id.eq(user_id))
124-
.filter(crate_owners::deleted.eq(false))
125-
.filter(crate_owners::owner_kind.eq(OwnerKind::User as i32)),
123+
.filter(crate_owners::owner_id.eq(user_id)),
126124
),
127125
);
128126
} else if let Some(team_id) = params.get("team_id").and_then(|s| s.parse::<i32>().ok()) {
129127
query = query.filter(
130128
crates::id.eq_any(
131-
crate_owners::table
129+
CrateOwner::by_owner_kind(OwnerKind::Team)
132130
.select(crate_owners::crate_id)
133-
.filter(crate_owners::owner_id.eq(team_id))
134-
.filter(crate_owners::deleted.eq(false))
135-
.filter(crate_owners::owner_kind.eq(OwnerKind::Team as i32)),
131+
.filter(crate_owners::owner_id.eq(team_id)),
136132
),
137133
);
138134
} else if params.get("following").is_some() {

src/controllers/user/me.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,6 @@ pub fn regenerate_token_and_send(req: &mut dyn Request) -> CargoResult<Response>
234234
/// Handles `PUT /me/email_notifications` route
235235
pub fn update_email_notifications(req: &mut dyn Request) -> CargoResult<Response> {
236236
use self::crate_owners::dsl::*;
237-
// use diesel::update;
238237
use diesel::pg::upsert::excluded;
239238

240239
#[derive(Deserialize)]
@@ -255,20 +254,26 @@ pub fn update_email_notifications(req: &mut dyn Request) -> CargoResult<Response
255254
let conn = req.db_conn()?;
256255

257256
// Build inserts from existing crates beloning to the current user
258-
let to_insert = CrateOwner::belonging_to(user)
257+
let to_insert = CrateOwner::by_owner_kind(OwnerKind::User)
258+
.filter(owner_id.eq(user.id))
259259
.select((crate_id, owner_id, owner_kind, email_notifications))
260-
.filter(owner_kind.eq(OwnerKind::User as i32))
261260
.load(&*conn)?
262261
.into_iter()
263-
.map(
262+
// Remove records whose `email_notifications` will not change from their current value
263+
.filter_map(
264264
|(c_id, o_id, o_kind, e_notifications): (i32, i32, i32, bool)| {
265-
(
266-
crate_id.eq(c_id),
267-
owner_id.eq(o_id),
268-
owner_kind.eq(o_kind),
269-
email_notifications
270-
.eq(updates.get(&c_id).unwrap_or(&e_notifications).to_owned()),
271-
)
265+
let current_e_notifications = *updates.get(&c_id).unwrap_or(&e_notifications);
266+
267+
if e_notifications == current_e_notifications {
268+
None
269+
} else {
270+
Some((
271+
crate_id.eq(c_id),
272+
owner_id.eq(o_id),
273+
owner_kind.eq(o_kind),
274+
email_notifications.eq(current_e_notifications),
275+
))
276+
}
272277
},
273278
)
274279
.collect::<Vec<_>>();

src/models/krate.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -401,18 +401,17 @@ impl Crate {
401401
}
402402

403403
pub fn owners(&self, conn: &PgConnection) -> CargoResult<Vec<Owner>> {
404-
let base_query = CrateOwner::belonging_to(self).filter(crate_owners::deleted.eq(false));
405-
let users = base_query
404+
let users = CrateOwner::by_owner_kind(OwnerKind::User)
405+
.filter(crate_owners::crate_id.eq(self.id))
406406
.inner_join(users::table)
407407
.select(users::all_columns)
408-
.filter(crate_owners::owner_kind.eq(OwnerKind::User as i32))
409408
.load(conn)?
410409
.into_iter()
411410
.map(Owner::User);
412-
let teams = base_query
411+
let teams = CrateOwner::by_owner_kind(OwnerKind::Team)
412+
.filter(crate_owners::crate_id.eq(self.id))
413413
.inner_join(teams::table)
414414
.select(teams::all_columns)
415-
.filter(crate_owners::owner_kind.eq(OwnerKind::Team as i32))
416415
.load(conn)?
417416
.into_iter()
418417
.map(Owner::Team);

src/models/owner.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use diesel::pg::Pg;
12
use diesel::prelude::*;
23

34
use crate::app::App;
@@ -22,6 +23,21 @@ pub struct CrateOwner {
2223
pub email_notifications: bool,
2324
}
2425

26+
type BoxedQuery<'a> = crate_owners::BoxedQuery<'a, Pg, crate_owners::SqlType>;
27+
28+
impl CrateOwner {
29+
/// Returns a base crate owner query filtered by the owner kind argument. This query also
30+
/// filters out deleted records.
31+
pub fn by_owner_kind(kind: OwnerKind) -> BoxedQuery<'static> {
32+
use self::crate_owners::dsl::*;
33+
34+
crate_owners
35+
.filter(deleted.eq(false))
36+
.filter(owner_kind.eq(kind as i32))
37+
.into_boxed()
38+
}
39+
}
40+
2541
#[derive(Debug, Clone, Copy)]
2642
#[repr(u32)]
2743
pub enum OwnerKind {

src/models/user.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,10 @@ impl User {
129129
}
130130

131131
pub fn owning(krate: &Crate, conn: &PgConnection) -> CargoResult<Vec<Owner>> {
132-
let base_query = CrateOwner::belonging_to(krate).filter(crate_owners::deleted.eq(false));
133-
let users = base_query
132+
let users = CrateOwner::by_owner_kind(OwnerKind::User)
134133
.inner_join(users::table)
135134
.select(users::all_columns)
136-
.filter(crate_owners::owner_kind.eq(OwnerKind::User as i32))
135+
.filter(crate_owners::crate_id.eq(krate.id))
137136
.load(conn)?
138137
.into_iter()
139138
.map(Owner::User);

0 commit comments

Comments
 (0)