Skip to content

Commit ea51376

Browse files
committed
Applied all the changes necessary for pre-migration
Every queries out of `User`'stable should now be converted into an intermediate type called `UserNoEmailType` (could be renamed, I guess). Conversion from this type to `User` is simply a copy except that `email` returned will always be `None`. I think its possible to remove `email` from User directly because its not actually the mirror of `User`'s table (the mirror struct is actually `NewUser`
1 parent e1d9500 commit ea51376

File tree

10 files changed

+89
-114
lines changed

10 files changed

+89
-114
lines changed

src/bin/transfer-crates.rs

+9-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
use cargo_registry::{
99
db,
10-
models::{Crate, OwnerKind, User},
10+
models::{user, Crate, OwnerKind, User},
1111
schema::{crate_owners, crates, users},
1212
};
1313
use std::{
@@ -17,14 +17,15 @@ use std::{
1717
};
1818

1919
use diesel::prelude::*;
20+
use cargo_registry::models::user::UserNoEmailType;
2021

2122
fn main() {
2223
let conn = db::connect_now().unwrap();
2324
conn.transaction::<_, diesel::result::Error, _>(|| {
2425
transfer(&conn);
2526
Ok(())
2627
})
27-
.unwrap()
28+
.unwrap()
2829
}
2930

3031
fn transfer(conn: &PgConnection) {
@@ -44,12 +45,16 @@ fn transfer(conn: &PgConnection) {
4445
};
4546

4647
let from = users::table
48+
.select(user::ALL_COLUMNS)
4749
.filter(users::gh_login.eq(from))
48-
.first::<User>(conn)
50+
.first::<UserNoEmailType>(conn)
51+
.map(User::from)
4952
.unwrap();
5053
let to = users::table
54+
.select(user::ALL_COLUMNS)
5155
.filter(users::gh_login.eq(to))
52-
.first::<User>(conn)
56+
.first::<UserNoEmailType>(conn)
57+
.map(User::from)
5358
.unwrap();
5459

5560
if from.gh_id != to.gh_id {

src/controllers/krate/metadata.rs

+8-24
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ use crate::controllers::prelude::*;
88
use crate::models::user;
99
use crate::models::user::UserNoEmailType;
1010
use crate::models::{
11-
Category, Crate, CrateCategory, CrateKeyword, CrateVersions, Keyword, RecentCrateDownloads,
12-
User, Version,
11+
Category, Crate, CrateCategory, CrateKeyword, CrateVersions, Keyword, RecentCrateDownloads, Version,
1312
};
1413
use crate::schema::*;
1514
use crate::views::{
@@ -107,10 +106,10 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
107106
let conn = req.db_conn()?;
108107
let krate = Crate::by_name(name).first::<Crate>(&*conn)?;
109108

110-
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
109+
let mut versions_and_publishers: Vec<(Version, Option<UserNoEmailType>)> = krate
111110
.all_versions()
112111
.left_outer_join(users::table)
113-
.select((versions::all_columns, users::all_columns.nullable()))
112+
.select((versions::all_columns, user::ALL_COLUMNS.nullable()))
114113
.load(&*conn)?;
115114
versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num));
116115
let ids = versions_and_publishers.iter().map(|v| v.0.id).collect();
@@ -153,7 +152,7 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
153152
),
154153
versions: versions_and_publishers
155154
.into_iter()
156-
.map(|(v, pb)| v.encodable(&krate.name, pb))
155+
.map(|(v, pb)| v.encodable(&krate.name, pb.map(From::from)))
157156
.collect(),
158157
keywords: kws.into_iter().map(Keyword::encodable).collect(),
159158
categories: cats.into_iter().map(Category::encodable).collect(),
@@ -189,15 +188,15 @@ pub fn versions(req: &mut dyn Request) -> CargoResult<Response> {
189188
let crate_name = &req.params()["crate_id"];
190189
let conn = req.db_conn()?;
191190
let krate = Crate::by_name(crate_name).first::<Crate>(&*conn)?;
192-
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
191+
let mut versions_and_publishers: Vec<(Version, Option<UserNoEmailType>)> = krate
193192
.all_versions()
194193
.left_outer_join(users::table)
195-
.select((versions::all_columns, users::all_columns.nullable()))
194+
.select((versions::all_columns, user::ALL_COLUMNS.nullable()))
196195
.load(&*conn)?;
197196
versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num));
198197
let versions = versions_and_publishers
199198
.into_iter()
200-
.map(|(v, pb)| v.encodable(crate_name, pb))
199+
.map(|(v, pb)| v.encodable(crate_name, pb.map(From::from)))
201200
.collect();
202201

203202
#[derive(Serialize)]
@@ -236,22 +235,7 @@ pub fn reverse_dependencies(req: &mut dyn Request) -> CargoResult<Response> {
236235
))
237236
.load::<(Version, String, Option<UserNoEmailType>)>(&*conn)?
238237
.into_iter()
239-
.map(|(version, krate_name, user)| {
240-
if let Some(user) = user {
241-
let published_by = User {
242-
id: user.0,
243-
email: None,
244-
gh_access_token: user.1,
245-
gh_login: user.2,
246-
name: user.3,
247-
gh_avatar: user.4,
248-
gh_id: user.5,
249-
};
250-
version.encodable(&krate_name, Some(published_by))
251-
} else {
252-
version.encodable(&krate_name, None)
253-
}
254-
})
238+
.map(|(version, krate_name, user)| version.encodable(&krate_name, user.map(From::from)))
255239
.collect();
256240

257241
#[derive(Serialize)]

src/controllers/user/me.rs

+2-25
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,9 @@ pub fn me(req: &mut dyn Request) -> CargoResult<Response> {
4343
// Will modify this so that we don't need this kind of conversion anymore...
4444
// In fact, the PR will use the email that we obtained from the above SQL queries
4545
// and pass it along the encodable_private function below.
46-
let user = User {
47-
id: user.0,
48-
email,
49-
gh_access_token: user.1,
50-
gh_login: user.2,
51-
name: user.3,
52-
gh_avatar: user.4,
53-
gh_id: user.5,
54-
};
5546

5647
Ok(req.json(&EncodableMe {
57-
user: user.encodable_private(verified, verification_sent),
48+
user: User::from(user).encodable_private(email, verified, verification_sent),
5849
}))
5950
}
6051

@@ -80,22 +71,8 @@ pub fn updates(req: &mut dyn Request) -> CargoResult<Response> {
8071
let versions = data
8172
.into_iter()
8273
.map(|(version, crate_name, published_by)| {
83-
if let Some(user) = published_by {
84-
let published_by = User {
85-
id: user.0,
86-
email: None,
87-
gh_access_token: user.1,
88-
gh_login: user.2,
89-
name: user.3,
90-
gh_avatar: user.4,
91-
gh_id: user.5,
92-
};
93-
version.encodable(&crate_name, Some(published_by))
94-
} else {
95-
version.encodable(&crate_name, None)
96-
}
74+
version.encodable(&crate_name, published_by.map(From::from))
9775
})
98-
// version.encodable(&crate_name, published_by))
9976
.collect();
10077

10178
#[derive(Serialize)]

src/controllers/user/other.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use crate::controllers::prelude::*;
33
use crate::models::{OwnerKind, User};
44
use crate::schema::{crate_owners, crates, users};
55
use crate::views::EncodablePublicUser;
6+
use crate::models::user::UserNoEmailType;
7+
use crate::models::user;
68

79
/// Handles the `GET /users/:user_id` route.
810
pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
@@ -11,16 +13,17 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
1113
let name = &req.params()["user_id"].to_lowercase();
1214
let conn = req.db_conn()?;
1315
let user = users
16+
.select(user::ALL_COLUMNS)
1417
.filter(crate::lower(gh_login).eq(name))
1518
.order(id.desc())
16-
.first::<User>(&*conn)?;
19+
.first::<UserNoEmailType>(&*conn)?;
1720

1821
#[derive(Serialize)]
1922
struct R {
2023
user: EncodablePublicUser,
2124
}
2225
Ok(req.json(&R {
23-
user: user.encodable_public(),
26+
user: User::from(user).encodable_public(),
2427
}))
2528
}
2629

src/controllers/user/session.rs

+18-15
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ use crate::github;
44
use conduit_cookie::RequestSession;
55
use oauth2::{prelude::*, AuthorizationCode, TokenResponse};
66

7+
use crate::models::user;
78
use crate::models::{NewUser, User};
89
use crate::schema::users;
910
use crate::util::errors::{CargoError, ReadOnlyMode};
11+
use crate::models::user::UserNoEmailType;
1012

1113
/// Handles the `GET /authorize_url` route.
1214
///
@@ -123,21 +125,22 @@ impl GithubUser {
123125
self.avatar_url.as_ref().map(|s| &s[..]),
124126
access_token,
125127
)
126-
.create_or_update(conn)
127-
.map_err(Into::into)
128-
.or_else(|e: Box<dyn CargoError>| {
129-
// If we're in read only mode, we can't update their details
130-
// just look for an existing user
131-
if e.is::<ReadOnlyMode>() {
132-
users::table
133-
.filter(users::gh_id.eq(self.id))
134-
.first(conn)
135-
.optional()?
136-
.ok_or(e)
137-
} else {
138-
Err(e)
139-
}
140-
})
128+
.create_or_update(conn)
129+
.map_err(Into::into)
130+
.or_else(|e: Box<dyn CargoError>| {
131+
// If we're in read only mode, we can't update their details
132+
// just look for an existing user
133+
if e.is::<ReadOnlyMode>() {
134+
users::table
135+
.select(user::ALL_COLUMNS)
136+
.filter(users::gh_id.eq(self.id))
137+
.first::<UserNoEmailType>(conn)
138+
.map(User::from)
139+
.map_err(|_| e)
140+
} else {
141+
Err(e)
142+
}
143+
})
141144
}
142145
}
143146

src/controllers/version/deprecated.rs

+9-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
88
use crate::controllers::prelude::*;
99

10-
use crate::models::{Crate, User, Version};
10+
use crate::models::user;
11+
use crate::models::user::UserNoEmailType;
12+
use crate::models::{Crate, Version};
1113
use crate::schema::*;
1214
use crate::views::EncodableVersion;
1315

@@ -28,12 +30,12 @@ pub fn index(req: &mut dyn Request) -> CargoResult<Response> {
2830
.select((
2931
versions::all_columns,
3032
crates::name,
31-
users::all_columns.nullable(),
33+
user::ALL_COLUMNS.nullable(),
3234
))
3335
.filter(versions::id.eq(any(ids)))
34-
.load::<(Version, String, Option<User>)>(&*conn)?
36+
.load::<(Version, String, Option<UserNoEmailType>)>(&*conn)?
3537
.into_iter()
36-
.map(|(version, crate_name, published_by)| version.encodable(&crate_name, published_by))
38+
.map(|(version, crate_name, published_by)| version.encodable(&crate_name, published_by.map(From::from)))
3739
.collect();
3840

3941
#[derive(Serialize)]
@@ -50,14 +52,14 @@ pub fn show_by_id(req: &mut dyn Request) -> CargoResult<Response> {
5052
let id = &req.params()["version_id"];
5153
let id = id.parse().unwrap_or(0);
5254
let conn = req.db_conn()?;
53-
let (version, krate, published_by): (Version, Crate, Option<User>) = versions::table
55+
let (version, krate, published_by): (Version, Crate, Option<UserNoEmailType>) = versions::table
5456
.find(id)
5557
.inner_join(crates::table)
5658
.left_outer_join(users::table)
5759
.select((
5860
versions::all_columns,
5961
crate::models::krate::ALL_COLUMNS,
60-
users::all_columns.nullable(),
62+
user::ALL_COLUMNS.nullable(),
6163
))
6264
.first(&*conn)?;
6365

@@ -66,6 +68,6 @@ pub fn show_by_id(req: &mut dyn Request) -> CargoResult<Response> {
6668
version: EncodableVersion,
6769
}
6870
Ok(req.json(&R {
69-
version: version.encodable(&krate.name, published_by),
71+
version: version.encodable(&krate.name, published_by.map(From::from)),
7072
}))
7173
}

src/models/krate.rs

+1-10
Original file line numberDiff line numberDiff line change
@@ -409,16 +409,7 @@ impl Crate {
409409
.filter(crate_owners::owner_kind.eq(OwnerKind::User as i32))
410410
.load::<UserNoEmailType>(conn)?
411411
.into_iter()
412-
.map(|user| User {
413-
id: user.0,
414-
email: None, // <-- Because user _should not_ contain the email column.
415-
// This hack should be fixed in the future.
416-
gh_access_token: user.1,
417-
gh_login: user.2,
418-
name: user.3,
419-
gh_avatar: user.4,
420-
gh_id: user.5,
421-
})
412+
.map(User::from)
422413
.map(Owner::User);
423414
let teams = base_query
424415
.inner_join(teams::table)

src/models/owner.rs

+1-9
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,7 @@ impl Owner {
5858
.select(ALL_COLUMNS)
5959
.filter(users::gh_login.eq(name))
6060
.first::<UserNoEmailType>(conn)
61-
.map(|user| User {
62-
id: user.0,
63-
email: None,
64-
gh_access_token: user.1,
65-
gh_login: user.2,
66-
name: user.3,
67-
gh_avatar: user.4,
68-
gh_id: user.5,
69-
})
61+
.map(User::from)
7062
.map(Owner::User)
7163
.map_err(|_| human(&format_args!("could not find user with login `{}`", name)))
7264
}

0 commit comments

Comments
 (0)