From 72d42c204d9051bffe24623fd34f472c06b9c6bc Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Fri, 25 Dec 2020 14:40:06 +0100 Subject: [PATCH 1/2] views: Implement `from()` method for `EncodablePrivateUser` --- src/controllers/user/me.rs | 4 ++-- src/views.rs | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/controllers/user/me.rs b/src/controllers/user/me.rs index 2ebcc86955b..c9e546e3bfa 100644 --- a/src/controllers/user/me.rs +++ b/src/controllers/user/me.rs @@ -10,7 +10,7 @@ use crate::models::{ CrateOwner, Email, Follow, NewEmail, OwnerKind, User, Version, VersionOwnerAction, }; use crate::schema::{crate_owners, crates, emails, follows, users, versions}; -use crate::views::{EncodableMe, EncodableVersion, OwnedCrate}; +use crate::views::{EncodableMe, EncodablePrivateUser, EncodableVersion, OwnedCrate}; /// Handles the `GET /me` route. pub fn me(req: &mut dyn RequestExt) -> EndpointResult { @@ -46,7 +46,7 @@ pub fn me(req: &mut dyn RequestExt) -> EndpointResult { let verified = verified.unwrap_or(false); let verification_sent = verified || verification_sent; Ok(req.json(&EncodableMe { - user: user.encodable_private(email, verified, verification_sent), + user: EncodablePrivateUser::from(user, email, verified, verification_sent), owned_crates, })) } diff --git a/src/views.rs b/src/views.rs index 1c77d8c3fce..f69e83bdb15 100644 --- a/src/views.rs +++ b/src/views.rs @@ -352,6 +352,17 @@ pub struct EncodablePrivateUser { pub url: Option, } +impl EncodablePrivateUser { + pub fn from( + user: User, + email: Option, + email_verified: bool, + email_verification_sent: bool, + ) -> Self { + user.encodable_private(email, email_verified, email_verification_sent) + } +} + /// The serialization format for the `User` model. /// Same as private user, except no email field #[derive(Deserialize, Serialize, Debug)] From 58842e6ef84cc64a02c4704e1d29587a44f16904 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Fri, 25 Dec 2020 14:41:20 +0100 Subject: [PATCH 2/2] models::user: Inline `encodable_private()` method --- src/models/user.rs | 29 ----------------------------- src/views.rs | 21 ++++++++++++++++++++- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/src/models/user.rs b/src/models/user.rs index 6aa6f7c2d99..46e3af307b5 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -7,7 +7,6 @@ use crate::util::errors::AppResult; use crate::models::{ApiToken, Crate, CrateOwner, Email, NewEmail, Owner, OwnerKind, Rights}; use crate::schema::{crate_owners, emails, users}; -use crate::views::EncodablePrivateUser; /// The model representing a row in the `users` database table. #[derive(Clone, Debug, PartialEq, Eq, Queryable, Identifiable, AsChangeset, Associations)] @@ -168,34 +167,6 @@ impl User { .optional()?) } - /// 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, - name, - gh_login, - gh_avatar, - .. - } = self; - let url = format!("https://github.com/{}", gh_login); - - EncodablePrivateUser { - id, - email, - email_verified, - email_verification_sent, - avatar: gh_avatar, - login: gh_login, - name, - url: Some(url), - } - } - /// Queries for the email belonging to a particular user pub fn email(&self, conn: &PgConnection) -> AppResult> { Ok(Email::belonging_to(self) diff --git a/src/views.rs b/src/views.rs index f69e83bdb15..77c9189e9be 100644 --- a/src/views.rs +++ b/src/views.rs @@ -353,13 +353,32 @@ pub struct EncodablePrivateUser { } impl EncodablePrivateUser { + /// Converts this `User` model into an `EncodablePrivateUser` for JSON serialization. pub fn from( user: User, email: Option, email_verified: bool, email_verification_sent: bool, ) -> Self { - user.encodable_private(email, email_verified, email_verification_sent) + let User { + id, + name, + gh_login, + gh_avatar, + .. + } = user; + let url = format!("https://github.com/{}", gh_login); + + EncodablePrivateUser { + id, + email, + email_verified, + email_verification_sent, + avatar: gh_avatar, + login: gh_login, + name, + url: Some(url), + } } }