From 86a706293856833a71451772ff340c4d6a2e71a4 Mon Sep 17 00:00:00 2001 From: "Carol (Nichols || Goulding)" Date: Mon, 25 Nov 2019 11:27:12 -0500 Subject: [PATCH] Revert "Auto merge of #1911 - hbina:remove_email_from_user_struct, r=carols10cents" This reverts commit 92edac3d0843509a1acb1391c91c622455c5c633, reversing changes made to 4df7001b7f0b9dac8f6780fc58cb6a918c4861a6. --- src/bin/transfer-crates.rs | 11 ++-- src/controllers/krate/metadata.rs | 22 ++++---- src/controllers/user/me.rs | 24 ++++----- src/controllers/user/other.rs | 7 +-- src/controllers/user/session.rs | 9 ++-- src/controllers/version/deprecated.rs | 18 +++---- src/middleware/current_user.rs | 6 +-- src/models.rs | 2 +- src/models/krate.rs | 7 +-- src/models/owner.rs | 5 +- src/models/user.rs | 73 ++++----------------------- src/models/version.rs | 9 +--- 12 files changed, 51 insertions(+), 142 deletions(-) diff --git a/src/bin/transfer-crates.rs b/src/bin/transfer-crates.rs index 527937f9feb..76fd187c03c 100644 --- a/src/bin/transfer-crates.rs +++ b/src/bin/transfer-crates.rs @@ -7,7 +7,7 @@ use cargo_registry::{ db, - models::{user, Crate, OwnerKind, User}, + models::{Crate, OwnerKind, User}, schema::{crate_owners, crates, users}, }; use std::{ @@ -16,7 +16,6 @@ use std::{ process::exit, }; -use cargo_registry::models::user::UserNoEmailType; use diesel::prelude::*; fn main() { @@ -45,16 +44,12 @@ fn transfer(conn: &PgConnection) { }; let from = users::table - .select(user::ALL_COLUMNS) .filter(users::gh_login.eq(from)) - .first::(conn) - .map(User::from) + .first::(conn) .unwrap(); let to = users::table - .select(user::ALL_COLUMNS) .filter(users::gh_login.eq(to)) - .first::(conn) - .map(User::from) + .first::(conn) .unwrap(); if from.gh_id != to.gh_id { diff --git a/src/controllers/krate/metadata.rs b/src/controllers/krate/metadata.rs index 3a9aa90e298..d53741c3c7a 100644 --- a/src/controllers/krate/metadata.rs +++ b/src/controllers/krate/metadata.rs @@ -5,11 +5,9 @@ //! `Cargo.toml` file. use crate::controllers::prelude::*; -use crate::models::user; -use crate::models::user::UserNoEmailType; use crate::models::{ Category, Crate, CrateCategory, CrateKeyword, CrateVersions, Keyword, RecentCrateDownloads, - Version, + User, Version, }; use crate::schema::*; use crate::views::{ @@ -107,10 +105,10 @@ pub fn show(req: &mut dyn Request) -> CargoResult { let conn = req.db_conn()?; let krate = Crate::by_name(name).first::(&*conn)?; - let mut versions_and_publishers: Vec<(Version, Option)> = krate + let mut versions_and_publishers: Vec<(Version, Option)> = krate .all_versions() .left_outer_join(users::table) - .select((versions::all_columns, user::ALL_COLUMNS.nullable())) + .select((versions::all_columns, users::all_columns.nullable())) .load(&*conn)?; versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num)); let ids = versions_and_publishers.iter().map(|v| v.0.id).collect(); @@ -153,7 +151,7 @@ pub fn show(req: &mut dyn Request) -> CargoResult { ), versions: versions_and_publishers .into_iter() - .map(|(v, pb)| v.encodable(&krate.name, pb.map(From::from))) + .map(|(v, pb)| v.encodable(&krate.name, pb)) .collect(), keywords: kws.into_iter().map(Keyword::encodable).collect(), categories: cats.into_iter().map(Category::encodable).collect(), @@ -189,15 +187,15 @@ pub fn versions(req: &mut dyn Request) -> CargoResult { let crate_name = &req.params()["crate_id"]; let conn = req.db_conn()?; let krate = Crate::by_name(crate_name).first::(&*conn)?; - let mut versions_and_publishers: Vec<(Version, Option)> = krate + let mut versions_and_publishers: Vec<(Version, Option)> = krate .all_versions() .left_outer_join(users::table) - .select((versions::all_columns, user::ALL_COLUMNS.nullable())) + .select((versions::all_columns, users::all_columns.nullable())) .load(&*conn)?; versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num)); let versions = versions_and_publishers .into_iter() - .map(|(v, pb)| v.encodable(crate_name, pb.map(From::from))) + .map(|(v, pb)| v.encodable(crate_name, pb)) .collect(); #[derive(Serialize)] @@ -229,11 +227,11 @@ pub fn reverse_dependencies(req: &mut dyn Request) -> CargoResult { .select(( versions::all_columns, crates::name, - user::ALL_COLUMNS.nullable(), + users::all_columns.nullable(), )) - .load::<(Version, String, Option)>(&*conn)? + .load::<(Version, String, Option)>(&*conn)? .into_iter() - .map(|(version, krate_name, user)| version.encodable(&krate_name, user.map(From::from))) + .map(|(version, krate_name, published_by)| version.encodable(&krate_name, published_by)) .collect(); #[derive(Serialize)] diff --git a/src/controllers/user/me.rs b/src/controllers/user/me.rs index f8f6241920c..d7b36c2d60f 100644 --- a/src/controllers/user/me.rs +++ b/src/controllers/user/me.rs @@ -7,7 +7,6 @@ use crate::email; use crate::util::bad_request; use crate::util::errors::CargoError; -use crate::models::user::{UserNoEmailType, ALL_COLUMNS}; use crate::models::{CrateOwner, Email, Follow, NewEmail, OwnerKind, User, Version}; use crate::schema::{crate_owners, crates, emails, follows, users, versions}; use crate::views::{EncodableMe, EncodableVersion, OwnedCrate}; @@ -32,12 +31,12 @@ pub fn me(req: &mut dyn Request) -> CargoResult { .find(user_id) .left_join(emails::table) .select(( - ALL_COLUMNS, + users::all_columns, emails::verified.nullable(), emails::email.nullable(), emails::token_generated_at.nullable().is_not_null(), )) - .first::<(UserNoEmailType, Option, Option, bool)>(&*conn)?; + .first::<(User, Option, Option, bool)>(&*conn)?; let owned_crates = crate_owners::table .inner_join(crates::table) @@ -56,13 +55,10 @@ pub fn me(req: &mut dyn Request) -> CargoResult { let verified = verified.unwrap_or(false); let verification_sent = verified || verification_sent; - // PR :: https://github.com/rust-lang/crates.io/pull/1891 - // Will modify this so that we don't need this kind of conversion anymore... - // In fact, the PR will use the email that we obtained from the above SQL queries - // and pass it along the encodable_private function below. + let user = User { email, ..user }; Ok(req.json(&EncodableMe { - user: User::from(user).encodable_private(email, verified, verification_sent), + user: user.encodable_private(verified, verification_sent), owned_crates, })) } @@ -80,17 +76,19 @@ pub fn updates(req: &mut dyn Request) -> CargoResult { .left_outer_join(users::table) .filter(crates::id.eq(any(followed_crates))) .order(versions::created_at.desc()) - .select((versions::all_columns, crates::name, ALL_COLUMNS.nullable())) + .select(( + versions::all_columns, + crates::name, + users::all_columns.nullable(), + )) .paginate(&req.query())? - .load::<(Version, String, Option)>(&*conn)?; + .load::<(Version, String, Option)>(&*conn)?; let more = data.next_page_params().is_some(); let versions = data .into_iter() - .map(|(version, crate_name, published_by)| { - version.encodable(&crate_name, published_by.map(From::from)) - }) + .map(|(version, crate_name, published_by)| version.encodable(&crate_name, published_by)) .collect(); #[derive(Serialize)] diff --git a/src/controllers/user/other.rs b/src/controllers/user/other.rs index 9ec66bb9b92..cbdf4180010 100644 --- a/src/controllers/user/other.rs +++ b/src/controllers/user/other.rs @@ -1,7 +1,5 @@ use crate::controllers::prelude::*; -use crate::models::user; -use crate::models::user::UserNoEmailType; use crate::models::{OwnerKind, User}; use crate::schema::{crate_owners, crates, users}; use crate::views::EncodablePublicUser; @@ -13,17 +11,16 @@ pub fn show(req: &mut dyn Request) -> CargoResult { let name = &req.params()["user_id"].to_lowercase(); let conn = req.db_conn()?; let user = users - .select(user::ALL_COLUMNS) .filter(crate::lower(gh_login).eq(name)) .order(id.desc()) - .first::(&*conn)?; + .first::(&*conn)?; #[derive(Serialize)] struct R { user: EncodablePublicUser, } Ok(req.json(&R { - user: User::from(user).encodable_public(), + user: user.encodable_public(), })) } diff --git a/src/controllers/user/session.rs b/src/controllers/user/session.rs index 33c03febcbd..fdbdd5f099d 100644 --- a/src/controllers/user/session.rs +++ b/src/controllers/user/session.rs @@ -4,8 +4,6 @@ use crate::github; use conduit_cookie::RequestSession; use oauth2::{prelude::*, AuthorizationCode, TokenResponse}; -use crate::models::user; -use crate::models::user::UserNoEmailType; use crate::models::{NewUser, User}; use crate::schema::users; use crate::util::errors::{CargoError, ReadOnlyMode}; @@ -132,11 +130,10 @@ impl GithubUser { // just look for an existing user if e.is::() { users::table - .select(user::ALL_COLUMNS) .filter(users::gh_id.eq(self.id)) - .first::(conn) - .map(User::from) - .map_err(|_| e) + .first(conn) + .optional()? + .ok_or(e) } else { Err(e) } diff --git a/src/controllers/version/deprecated.rs b/src/controllers/version/deprecated.rs index 71739034dd7..346b089636c 100644 --- a/src/controllers/version/deprecated.rs +++ b/src/controllers/version/deprecated.rs @@ -7,9 +7,7 @@ use crate::controllers::prelude::*; -use crate::models::user; -use crate::models::user::UserNoEmailType; -use crate::models::{Crate, Version}; +use crate::models::{Crate, User, Version}; use crate::schema::*; use crate::views::EncodableVersion; @@ -30,14 +28,12 @@ pub fn index(req: &mut dyn Request) -> CargoResult { .select(( versions::all_columns, crates::name, - user::ALL_COLUMNS.nullable(), + users::all_columns.nullable(), )) .filter(versions::id.eq(any(ids))) - .load::<(Version, String, Option)>(&*conn)? + .load::<(Version, String, Option)>(&*conn)? .into_iter() - .map(|(version, crate_name, published_by)| { - version.encodable(&crate_name, published_by.map(From::from)) - }) + .map(|(version, crate_name, published_by)| version.encodable(&crate_name, published_by)) .collect(); #[derive(Serialize)] @@ -54,14 +50,14 @@ pub fn show_by_id(req: &mut dyn Request) -> CargoResult { let id = &req.params()["version_id"]; let id = id.parse().unwrap_or(0); let conn = req.db_conn()?; - let (version, krate, published_by): (Version, Crate, Option) = versions::table + let (version, krate, published_by): (Version, Crate, Option) = versions::table .find(id) .inner_join(crates::table) .left_outer_join(users::table) .select(( versions::all_columns, crate::models::krate::ALL_COLUMNS, - user::ALL_COLUMNS.nullable(), + users::all_columns.nullable(), )) .first(&*conn)?; @@ -70,6 +66,6 @@ pub fn show_by_id(req: &mut dyn Request) -> CargoResult { version: EncodableVersion, } Ok(req.json(&R { - version: version.encodable(&krate.name, published_by.map(From::from)), + version: version.encodable(&krate.name, published_by), })) } diff --git a/src/middleware/current_user.rs b/src/middleware/current_user.rs index 0bd08e1ec56..ad760c88857 100644 --- a/src/middleware/current_user.rs +++ b/src/middleware/current_user.rs @@ -6,7 +6,6 @@ use diesel::prelude::*; use crate::db::RequestTransaction; use crate::util::errors::{std_error, CargoResult, ChainError, Unauthorized}; -use crate::models::user::{UserNoEmailType, ALL_COLUMNS}; use crate::models::User; use crate::schema::users; @@ -32,10 +31,7 @@ impl Middleware for CurrentUser { if let Some(id) = id { // If it did, look for a user in the database with the given `user_id` - let maybe_user = users::table - .select(ALL_COLUMNS) - .find(id) - .first::(&*conn); + let maybe_user = users::table.find(id).first::(&*conn); drop(conn); if let Ok(user) = maybe_user { // Attach the `User` model from the database to the request diff --git a/src/models.rs b/src/models.rs index f11eb84e9d4..806d7c91dc9 100644 --- a/src/models.rs +++ b/src/models.rs @@ -31,5 +31,5 @@ mod owner; mod rights; mod team; mod token; -pub mod user; +mod user; mod version; diff --git a/src/models/krate.rs b/src/models/krate.rs index 969de414a98..e19cc219735 100644 --- a/src/models/krate.rs +++ b/src/models/krate.rs @@ -8,8 +8,6 @@ use url::Url; use crate::app::App; use crate::email; -use crate::models::user; -use crate::models::user::UserNoEmailType; use crate::util::{human, CargoResult}; use crate::models::{ @@ -401,10 +399,9 @@ impl Crate { let users = CrateOwner::by_owner_kind(OwnerKind::User) .filter(crate_owners::crate_id.eq(self.id)) .inner_join(users::table) - .select(user::ALL_COLUMNS) - .load::(conn)? + .select(users::all_columns) + .load(conn)? .into_iter() - .map(User::from) .map(Owner::User); let teams = CrateOwner::by_owner_kind(OwnerKind::Team) .filter(crate_owners::crate_id.eq(self.id)) diff --git a/src/models/owner.rs b/src/models/owner.rs index 88d8c7afb92..a1f83586a28 100644 --- a/src/models/owner.rs +++ b/src/models/owner.rs @@ -5,7 +5,6 @@ use crate::app::App; use crate::github; use crate::util::{human, CargoResult}; -use crate::models::user::{UserNoEmailType, ALL_COLUMNS}; use crate::models::{Crate, Team, User}; use crate::schema::{crate_owners, users}; use crate::views::EncodableOwner; @@ -72,10 +71,8 @@ impl Owner { )?)) } else { users::table - .select(ALL_COLUMNS) .filter(users::gh_login.eq(name)) - .first::(conn) - .map(User::from) + .first(conn) .map(Owner::User) .map_err(|_| human(&format_args!("could not find user with login `{}`", name))) } diff --git a/src/models/user.rs b/src/models/user.rs index 5ff3cb987d5..8fb9c59cd57 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -32,41 +32,6 @@ pub struct NewUser<'a> { pub gh_access_token: Cow<'a, str>, } -pub type UserNoEmailType = ( - // pub id: - i32, - // pub email: - // Option, - // pub gh_access_token: - String, - // pub gh_login: - String, - // pub name: - Option, - // pub gh_avatar: - Option, - // pub gh_id: - i32, -); - -pub type AllColumns = ( - users::id, - users::gh_access_token, - users::gh_login, - users::name, - users::gh_avatar, - users::gh_id, -); - -pub const ALL_COLUMNS: AllColumns = ( - users::id, - users::gh_access_token, - users::gh_login, - users::name, - users::gh_avatar, - users::gh_id, -); - impl<'a> NewUser<'a> { pub fn new( gh_id: i32, @@ -113,13 +78,12 @@ impl<'a> NewUser<'a> { gh_avatar.eq(excluded(gh_avatar)), gh_access_token.eq(excluded(gh_access_token)), )) - .returning(ALL_COLUMNS) - .get_result::(conn)?; + .get_result::(conn)?; // To send the user an account verification email... - if let Some(user_email) = self.email { + if let Some(user_email) = user.email.as_ref() { let new_email = NewEmail { - user_id: user.0, + user_id: user.id, email: user_email, }; @@ -131,11 +95,11 @@ impl<'a> NewUser<'a> { .optional()?; if let Some(token) = token { - crate::email::send_user_confirm_email(user_email, &user.2, &token); + crate::email::send_user_confirm_email(user_email, &user.gh_login, &token); } } - Ok(User::from(user)) + Ok(user) }) } } @@ -161,21 +125,16 @@ impl User { }) .or_else(|_| tokens.select(user_id).first(conn))?; - users::table - .select(ALL_COLUMNS) - .find(user_id_) - .first::(conn) - .map(User::from) + users::table.find(user_id_).first(conn) } pub fn owning(krate: &Crate, conn: &PgConnection) -> CargoResult> { let users = CrateOwner::by_owner_kind(OwnerKind::User) .inner_join(users::table) - .select(ALL_COLUMNS) + .select(users::all_columns) .filter(crate_owners::crate_id.eq(krate.id)) - .load::(conn)? + .load(conn)? .into_iter() - .map(User::from) .map(Owner::User); Ok(users.collect()) @@ -219,12 +178,12 @@ impl User { /// Converts this `User` model into an `EncodablePrivateUser` for JSON serialization. pub fn encodable_private( self, - email: Option, email_verified: bool, email_verification_sent: bool, ) -> EncodablePrivateUser { let User { id, + email, name, gh_login, gh_avatar, @@ -262,17 +221,3 @@ impl User { } } } - -impl From for User { - fn from(user: UserNoEmailType) -> Self { - User { - id: user.0, - email: None, - gh_access_token: user.1, - gh_login: user.2, - name: user.3, - gh_avatar: user.4, - gh_id: user.5, - } - } -} diff --git a/src/models/version.rs b/src/models/version.rs index 0194b55e096..4be66b41a21 100644 --- a/src/models/version.rs +++ b/src/models/version.rs @@ -5,8 +5,6 @@ use diesel::prelude::*; use crate::util::{human, CargoResult}; -use crate::models::user; -use crate::models::user::UserNoEmailType; use crate::models::{Crate, Dependency, User}; use crate::schema::*; use crate::views::{EncodableVersion, EncodableVersionLinks}; @@ -117,12 +115,7 @@ impl Version { /// Not for use when you have a group of versions you need the publishers for. pub fn published_by(&self, conn: &PgConnection) -> Option { match self.published_by { - Some(pb) => users::table - .find(pb) - .select(user::ALL_COLUMNS) - .first::(conn) - .map(User::from) - .ok(), + Some(pb) => users::table.find(pb).first(conn).ok(), None => None, } }