Skip to content

Commit 7e6bd7c

Browse files
committed
Auto merge of #3133 - Turbo87:encodable, r=pietroalbini
Replace more `encodable()` methods with `From` implementations This PR continues #3124 by replacing more of our `encodable()` methods with `From` trait implementations to ultimately decouple our database models from the JSON views. r? `@pietroalbini`
2 parents b6bc89f + 85c664b commit 7e6bd7c

File tree

16 files changed

+144
-148
lines changed

16 files changed

+144
-148
lines changed

src/controllers/keyword.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub fn index(req: &mut dyn RequestExt) -> EndpointResult {
2323
let conn = req.db_conn()?;
2424
let data: Paginated<Keyword> = query.load(&*conn)?;
2525
let total = data.total();
26-
let kws = data.into_iter().map(Keyword::encodable).collect::<Vec<_>>();
26+
let kws = data.into_iter().map(Keyword::into).collect::<Vec<_>>();
2727

2828
#[derive(Serialize)]
2929
struct R {
@@ -52,7 +52,5 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
5252
struct R {
5353
keyword: EncodableKeyword,
5454
}
55-
Ok(req.json(&R {
56-
keyword: kw.encodable(),
57-
}))
55+
Ok(req.json(&R { keyword: kw.into() }))
5856
}

src/controllers/krate/downloads.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub fn downloads(req: &mut dyn RequestExt) -> EndpointResult {
3131
.order(version_downloads::date.asc())
3232
.load(&*conn)?
3333
.into_iter()
34-
.map(VersionDownload::encodable)
34+
.map(VersionDownload::into)
3535
.collect::<Vec<_>>();
3636

3737
let sum_downloads = sql::<BigInt>("SUM(version_downloads.downloads)");

src/controllers/krate/metadata.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ pub fn summary(req: &mut dyn RequestExt) -> EndpointResult {
8080
.limit(10)
8181
.load(&*conn)?
8282
.into_iter()
83-
.map(Keyword::encodable)
83+
.map(Keyword::into)
8484
.collect();
8585

8686
let popular_categories = Category::toplevel(&conn, "crates", 10, 0)?
@@ -178,7 +178,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
178178
.into_iter()
179179
.map(|(v, pb, aas)| v.encodable(&krate.name, pb, aas))
180180
.collect(),
181-
keywords: kws.into_iter().map(Keyword::encodable).collect(),
181+
keywords: kws.into_iter().map(Keyword::into).collect(),
182182
categories: cats.into_iter().map(Category::into).collect(),
183183
}))
184184
}

src/controllers/krate/owners.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@ pub fn owners(req: &mut dyn RequestExt) -> EndpointResult {
99
let crate_name = &req.params()["crate_id"];
1010
let conn = req.db_conn()?;
1111
let krate: Crate = Crate::by_name(crate_name).first(&*conn)?;
12-
let owners = krate
13-
.owners(&conn)?
14-
.into_iter()
15-
.map(Owner::encodable)
16-
.collect();
12+
let owners = krate.owners(&conn)?.into_iter().map(Owner::into).collect();
1713

1814
#[derive(Serialize)]
1915
struct R {
@@ -29,7 +25,7 @@ pub fn owner_team(req: &mut dyn RequestExt) -> EndpointResult {
2925
let krate: Crate = Crate::by_name(crate_name).first(&*conn)?;
3026
let owners = Team::owning(&krate, &conn)?
3127
.into_iter()
32-
.map(Owner::encodable)
28+
.map(Owner::into)
3329
.collect();
3430

3531
#[derive(Serialize)]
@@ -46,7 +42,7 @@ pub fn owner_user(req: &mut dyn RequestExt) -> EndpointResult {
4642
let krate: Crate = Crate::by_name(crate_name).first(&*conn)?;
4743
let owners = User::owning(&krate, &conn)?
4844
.into_iter()
49-
.map(Owner::encodable)
45+
.map(Owner::into)
5046
.collect();
5147

5248
#[derive(Serialize)]

src/controllers/team.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,5 @@ pub fn show_team(req: &mut dyn RequestExt) -> EndpointResult {
1616
struct R {
1717
team: EncodableTeam,
1818
}
19-
Ok(req.json(&R {
20-
team: team.encodable(),
21-
}))
19+
Ok(req.json(&R { team: team.into() }))
2220
}

src/controllers/token.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ pub fn new(req: &mut dyn RequestExt) -> EndpointResult {
8787
api_token: EncodableApiTokenWithToken,
8888
}
8989
Ok(req.json(&R {
90-
api_token: api_token.encodable_with_token(),
90+
api_token: api_token.into(),
9191
}))
9292
}
9393

src/controllers/user/other.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
2020
struct R {
2121
user: EncodablePublicUser,
2222
}
23-
Ok(req.json(&R {
24-
user: user.encodable_public(),
25-
}))
23+
Ok(req.json(&R { user: user.into() }))
2624
}
2725

2826
/// Handles the `GET /users/:user_id/stats` route.

src/controllers/version/downloads.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ pub fn downloads(req: &mut dyn RequestExt) -> EndpointResult {
9494
.order(version_downloads::date)
9595
.load(&*conn)?
9696
.into_iter()
97-
.map(VersionDownload::encodable)
97+
.map(VersionDownload::into)
9898
.collect();
9999

100100
#[derive(Serialize)]

src/models/download.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use diesel::prelude::*;
33

44
use crate::models::Version;
55
use crate::schema::version_downloads;
6-
use crate::views::EncodableVersionDownload;
76

87
#[derive(Queryable, Identifiable, Associations, Debug, Clone, Copy)]
98
#[belongs_to(Version)]
@@ -31,12 +30,4 @@ impl VersionDownload {
3130
.execute(conn)?;
3231
Ok(())
3332
}
34-
35-
pub fn encodable(self) -> EncodableVersionDownload {
36-
EncodableVersionDownload {
37-
version: self.version_id,
38-
downloads: self.downloads,
39-
date: self.date.to_string(),
40-
}
41-
}
4233
}

src/models/keyword.rs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use diesel::prelude::*;
33

44
use crate::models::Crate;
55
use crate::schema::*;
6-
use crate::views::EncodableKeyword;
76

87
#[derive(Clone, Identifiable, Queryable, Debug)]
98
pub struct Keyword {
@@ -61,21 +60,6 @@ impl Keyword {
6160
&& name.chars().all(|c| c.is_ascii())
6261
}
6362

64-
pub fn encodable(self) -> EncodableKeyword {
65-
let Keyword {
66-
crates_cnt,
67-
keyword,
68-
created_at,
69-
..
70-
} = self;
71-
EncodableKeyword {
72-
id: keyword.clone(),
73-
created_at,
74-
crates_cnt,
75-
keyword,
76-
}
77-
}
78-
7963
pub fn update_crate(conn: &PgConnection, krate: &Crate, keywords: &[&str]) -> QueryResult<()> {
8064
conn.transaction(|| {
8165
let keywords = Keyword::find_or_create_all(conn, keywords)?;

src/models/owner.rs

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ use diesel::pg::Pg;
22
use diesel::prelude::*;
33

44
use crate::app::App;
5-
use crate::github;
65
use crate::util::errors::{cargo_err, AppResult};
76

87
use crate::models::{Crate, Team, User};
98
use crate::schema::{crate_owners, users};
10-
use crate::views::EncodableOwner;
119

1210
#[derive(Insertable, Associations, Identifiable, Debug, Clone, Copy)]
1311
#[belongs_to(Crate)]
@@ -100,43 +98,4 @@ impl Owner {
10098
Owner::Team(ref team) => team.id,
10199
}
102100
}
103-
104-
pub fn encodable(self) -> EncodableOwner {
105-
match self {
106-
Owner::User(User {
107-
id,
108-
name,
109-
gh_login,
110-
gh_avatar,
111-
..
112-
}) => {
113-
let url = format!("https://github.com/{}", gh_login);
114-
EncodableOwner {
115-
id,
116-
login: gh_login,
117-
avatar: gh_avatar,
118-
url: Some(url),
119-
name,
120-
kind: String::from("user"),
121-
}
122-
}
123-
Owner::Team(Team {
124-
id,
125-
name,
126-
login,
127-
avatar,
128-
..
129-
}) => {
130-
let url = github::team_url(&login);
131-
EncodableOwner {
132-
id,
133-
login,
134-
url: Some(url),
135-
avatar,
136-
name,
137-
kind: String::from("team"),
138-
}
139-
}
140-
}
141-
}
142101
}

src/models/team.rs

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
use diesel::prelude::*;
22

33
use crate::app::App;
4-
use crate::github::{github_api, team_url};
4+
use crate::github::github_api;
55
use crate::util::errors::{cargo_err, AppResult, NotFound};
66

77
use oauth2::AccessToken;
88

99
use crate::models::{Crate, CrateOwner, Owner, OwnerKind, User};
1010
use crate::schema::{crate_owners, teams};
11-
use crate::views::EncodableTeam;
1211

1312
/// For now, just a Github Team. Can be upgraded to other teams
1413
/// later if desirable.
@@ -213,25 +212,6 @@ impl Team {
213212

214213
Ok(teams.collect())
215214
}
216-
217-
pub fn encodable(self) -> EncodableTeam {
218-
let Team {
219-
id,
220-
name,
221-
login,
222-
avatar,
223-
..
224-
} = self;
225-
let url = team_url(&login);
226-
227-
EncodableTeam {
228-
id,
229-
login,
230-
name,
231-
avatar,
232-
url: Some(url),
233-
}
234-
}
235215
}
236216

237217
fn team_with_gh_id_contains_user(

src/models/token.rs

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use crate::models::User;
66
use crate::schema::api_tokens;
77
use crate::util::errors::{AppResult, InsecurelyGeneratedTokenRevoked};
88
use crate::util::rfc3339;
9-
use crate::views::EncodableApiTokenWithToken;
109

1110
const TOKEN_LENGTH: usize = 32;
1211
const TOKEN_PREFIX: &str = "cio"; // Crates.IO
@@ -83,21 +82,6 @@ pub struct CreatedApiToken {
8382
pub plaintext: String,
8483
}
8584

86-
impl CreatedApiToken {
87-
/// Converts this `CreatedApiToken` into an `EncodableApiToken` including
88-
/// the actual token value for JSON serialization.
89-
pub fn encodable_with_token(self) -> EncodableApiTokenWithToken {
90-
EncodableApiTokenWithToken {
91-
id: self.model.id,
92-
name: self.model.name,
93-
token: self.plaintext,
94-
revoked: self.model.revoked,
95-
created_at: self.model.created_at,
96-
last_used_at: self.model.last_used_at,
97-
}
98-
}
99-
}
100-
10185
// Use a custom implementation of Debug to hide the plaintext token.
10286
impl std::fmt::Debug for CreatedApiToken {
10387
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
@@ -111,6 +95,7 @@ impl std::fmt::Debug for CreatedApiToken {
11195
#[cfg(test)]
11296
mod tests {
11397
use super::*;
98+
use crate::views::EncodableApiTokenWithToken;
11499
use chrono::NaiveDate;
115100

116101
#[test]

src/models/user.rs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::util::errors::AppResult;
77

88
use crate::models::{ApiToken, Crate, CrateOwner, Email, NewEmail, Owner, OwnerKind, Rights};
99
use crate::schema::{crate_owners, emails, users};
10-
use crate::views::{EncodablePrivateUser, EncodablePublicUser};
10+
use crate::views::EncodablePrivateUser;
1111

1212
/// The model representing a row in the `users` database table.
1313
#[derive(Clone, Debug, PartialEq, Eq, Queryable, Identifiable, AsChangeset, Associations)]
@@ -203,23 +203,4 @@ impl User {
203203
.first(&*conn)
204204
.optional()?)
205205
}
206-
207-
/// Converts this`User` model into an `EncodablePublicUser` for JSON serialization.
208-
pub fn encodable_public(self) -> EncodablePublicUser {
209-
let User {
210-
id,
211-
name,
212-
gh_login,
213-
gh_avatar,
214-
..
215-
} = self;
216-
let url = format!("https://github.com/{}", gh_login);
217-
EncodablePublicUser {
218-
id,
219-
avatar: gh_avatar,
220-
login: gh_login,
221-
name,
222-
url: Some(url),
223-
}
224-
}
225206
}

src/models/version.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,12 @@ impl Version {
9494
authors: format!("/api/v1/crates/{}/{}/authors", crate_name, num),
9595
},
9696
crate_size,
97-
published_by: published_by.map(User::encodable_public),
97+
published_by: published_by.map(User::into),
9898
audit_actions: audit_actions
9999
.into_iter()
100100
.map(|(audit_action, user)| EncodableAuditAction {
101101
action: audit_action.action.into(),
102-
user: User::encodable_public(user),
102+
user: user.into(),
103103
time: audit_action.time,
104104
})
105105
.collect(),

0 commit comments

Comments
 (0)