Skip to content

Commit f69ccb8

Browse files
committed
Split crate_owner_invitations into MVC modules
1 parent cac2454 commit f69ccb8

File tree

7 files changed

+92
-115
lines changed

7 files changed

+92
-115
lines changed
Lines changed: 5 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,10 @@
1-
use chrono::NaiveDateTime;
2-
use conduit::{Request, Response};
3-
use diesel::prelude::*;
4-
use serde_json;
5-
6-
use db::RequestTransaction;
7-
use user::RequestUser;
8-
use util::errors::{human, CargoResult};
9-
use util::RequestUtils;
10-
11-
use models::{CrateOwner, OwnerKind};
12-
use schema::{crate_owner_invitations, crate_owners, crates, users};
13-
14-
/// The model representing a row in the `crate_owner_invitations` database table.
15-
#[derive(Clone, Copy, Debug, PartialEq, Eq, Identifiable, Queryable)]
16-
#[primary_key(invited_user_id, crate_id)]
17-
pub struct CrateOwnerInvitation {
18-
pub invited_user_id: i32,
19-
pub invited_by_user_id: i32,
20-
pub crate_id: i32,
21-
pub created_at: NaiveDateTime,
22-
}
23-
24-
#[derive(Insertable, Clone, Copy, Debug)]
25-
#[table_name = "crate_owner_invitations"]
26-
pub struct NewCrateOwnerInvitation {
27-
pub invited_user_id: i32,
28-
pub invited_by_user_id: i32,
29-
pub crate_id: i32,
30-
}
1+
use super::prelude::*;
312

32-
impl CrateOwnerInvitation {
33-
pub fn invited_by_username(&self, conn: &PgConnection) -> String {
34-
users::table
35-
.find(self.invited_by_user_id)
36-
.select(users::gh_login)
37-
.first(&*conn)
38-
.unwrap_or_else(|_| String::from("(unknown username)"))
39-
}
40-
41-
pub fn crate_name(&self, conn: &PgConnection) -> String {
42-
crates::table
43-
.find(self.crate_id)
44-
.select(crates::name)
45-
.first(&*conn)
46-
.unwrap_or_else(|_| String::from("(unknown crate name)"))
47-
}
48-
49-
pub fn encodable(self, conn: &PgConnection) -> EncodableCrateOwnerInvitation {
50-
EncodableCrateOwnerInvitation {
51-
invited_by_username: self.invited_by_username(conn),
52-
crate_name: self.crate_name(conn),
53-
crate_id: self.crate_id,
54-
created_at: self.created_at,
55-
}
56-
}
57-
}
3+
use serde_json;
584

59-
/// The serialization format for the `CrateOwnerInvitation` model.
60-
#[derive(Deserialize, Serialize, Debug)]
61-
pub struct EncodableCrateOwnerInvitation {
62-
pub invited_by_username: String,
63-
pub crate_name: String,
64-
pub crate_id: i32,
65-
#[serde(with = "::util::rfc3339")]
66-
pub created_at: NaiveDateTime,
67-
}
5+
use models::{CrateOwner, CrateOwnerInvitation, OwnerKind};
6+
use schema::{crate_owner_invitations, crate_owners};
7+
use views::{EncodableCrateOwnerInvitation, InvitationResponse};
688

699
/// Handles the `GET /me/crate_owner_invitations` route.
7010
pub fn list(req: &mut Request) -> CargoResult<Response> {
@@ -92,12 +32,6 @@ struct OwnerInvitation {
9232
crate_owner_invite: InvitationResponse,
9333
}
9434

95-
#[derive(Deserialize, Serialize, Debug, Copy, Clone)]
96-
pub struct InvitationResponse {
97-
pub crate_id: i32,
98-
pub accepted: bool,
99-
}
100-
10135
/// Handles the `PUT /me/crate_owner_invitations/:crate_id` route.
10236
pub fn handle_invite(req: &mut Request) -> CargoResult<Response> {
10337
let conn = &*req.db_conn()?;
@@ -175,27 +109,3 @@ fn decline_invite(
175109
crate_owner_invitation: crate_invite,
176110
}))
177111
}
178-
179-
#[cfg(test)]
180-
mod tests {
181-
use super::*;
182-
use chrono::NaiveDate;
183-
use serde_json;
184-
185-
#[test]
186-
fn crate_owner_invitation_serializes_to_rfc3339() {
187-
let inv = EncodableCrateOwnerInvitation {
188-
invited_by_username: "".to_string(),
189-
crate_name: "".to_string(),
190-
crate_id: 123,
191-
created_at: NaiveDate::from_ymd(2017, 1, 6).and_hms(14, 23, 11),
192-
};
193-
let json = serde_json::to_string(&inv).unwrap();
194-
assert!(
195-
json.as_str()
196-
.find(r#""created_at":"2017-01-06T14:23:11+00:00""#)
197-
.is_some()
198-
);
199-
}
200-
201-
}

src/controllers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ mod prelude {
1515
pub mod helpers;
1616

1717
pub mod category;
18+
pub mod crate_owner_invitation;
1819
pub mod keyword;
1920
pub mod krate;

src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ use util::{R404, C, R};
6565
pub mod app;
6666
pub mod boot;
6767
pub mod config;
68-
pub mod crate_owner_invitation;
6968
pub mod db;
7069
pub mod dependency;
7170
pub mod dist;
@@ -223,11 +222,11 @@ pub fn middleware(app: Arc<App>) -> MiddlewareBuilder {
223222
api_router.delete("/me/tokens/:id", C(token::revoke));
224223
api_router.get(
225224
"/me/crate_owner_invitations",
226-
C(crate_owner_invitation::list),
225+
C(controllers::crate_owner_invitation::list),
227226
);
228227
api_router.put(
229228
"/me/crate_owner_invitations/:crate_id",
230-
C(crate_owner_invitation::handle_invite),
229+
C(controllers::crate_owner_invitation::handle_invite),
231230
);
232231
api_router.get("/summary", C(controllers::krate::metadata::summary));
233232
api_router.put("/confirm/:email_token", C(user::confirm_user_email));

src/models/crate_owner_invitation.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use chrono::NaiveDateTime;
2+
use diesel::prelude::*;
3+
4+
use schema::{crate_owner_invitations, crates, users};
5+
use views::EncodableCrateOwnerInvitation;
6+
7+
/// The model representing a row in the `crate_owner_invitations` database table.
8+
#[derive(Clone, Copy, Debug, PartialEq, Eq, Identifiable, Queryable)]
9+
#[primary_key(invited_user_id, crate_id)]
10+
pub struct CrateOwnerInvitation {
11+
pub invited_user_id: i32,
12+
pub invited_by_user_id: i32,
13+
pub crate_id: i32,
14+
pub created_at: NaiveDateTime,
15+
}
16+
17+
#[derive(Insertable, Clone, Copy, Debug)]
18+
#[table_name = "crate_owner_invitations"]
19+
pub struct NewCrateOwnerInvitation {
20+
pub invited_user_id: i32,
21+
pub invited_by_user_id: i32,
22+
pub crate_id: i32,
23+
}
24+
25+
impl CrateOwnerInvitation {
26+
pub fn invited_by_username(&self, conn: &PgConnection) -> String {
27+
users::table
28+
.find(self.invited_by_user_id)
29+
.select(users::gh_login)
30+
.first(&*conn)
31+
.unwrap_or_else(|_| String::from("(unknown username)"))
32+
}
33+
34+
pub fn crate_name(&self, conn: &PgConnection) -> String {
35+
crates::table
36+
.find(self.crate_id)
37+
.select(crates::name)
38+
.first(&*conn)
39+
.unwrap_or_else(|_| String::from("(unknown crate name)"))
40+
}
41+
42+
pub fn encodable(self, conn: &PgConnection) -> EncodableCrateOwnerInvitation {
43+
EncodableCrateOwnerInvitation {
44+
invited_by_username: self.invited_by_username(conn),
45+
crate_name: self.crate_name(conn),
46+
crate_id: self.crate_id,
47+
created_at: self.created_at,
48+
}
49+
}
50+
}

src/models/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
pub use self::badge::{Badge, MaintenanceStatus};
22
pub use self::category::{Category, CrateCategory, NewCategory};
3-
pub use crate_owner_invitation::NewCrateOwnerInvitation;
3+
pub use self::crate_owner_invitation::{CrateOwnerInvitation, NewCrateOwnerInvitation};
44
pub use dependency::{Dependency, Kind, ReverseDependency};
55
pub use download::VersionDownload;
66
pub use self::follow::Follow;
@@ -17,6 +17,7 @@ pub mod helpers;
1717

1818
mod badge;
1919
mod category;
20+
mod crate_owner_invitation;
2021
mod follow;
2122
mod keyword;
2223
pub mod krate;

src/tests/owners.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,6 @@ fn new_crate_owner() {
8585
crate_owner_invitation: InvitationResponse,
8686
}
8787

88-
#[derive(Deserialize)]
89-
struct InvitationResponse {
90-
crate_id: i32,
91-
accepted: bool,
92-
}
93-
9488
let crate_owner_invite = ::json::<CrateOwnerInvitation>(&mut response);
9589
assert!(crate_owner_invite.crate_owner_invitation.accepted);
9690
assert_eq!(crate_owner_invite.crate_owner_invitation.crate_id, krate_id);
@@ -202,12 +196,6 @@ fn owners_can_remove_self() {
202196
crate_owner_invitation: InvitationResponse,
203197
}
204198

205-
#[derive(Deserialize)]
206-
struct InvitationResponse {
207-
crate_id: i32,
208-
accepted: bool,
209-
}
210-
211199
let crate_owner_invite = ::json::<CrateOwnerInvitation>(&mut response);
212200
assert!(crate_owner_invite.crate_owner_invitation.accepted);
213201
assert_eq!(crate_owner_invite.crate_owner_invitation.crate_id, krate_id);

src/views/mod.rs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
// TODO: Move all encodable types here
2-
// For now, just reexport
3-
41
use std::collections::HashMap;
52
use chrono::NaiveDateTime;
63

@@ -33,7 +30,22 @@ pub struct EncodableCategoryWithSubcategories {
3330
pub subcategories: Vec<EncodableCategory>,
3431
}
3532

36-
pub use crate_owner_invitation::{EncodableCrateOwnerInvitation, InvitationResponse};
33+
/// The serialization format for the `CrateOwnerInvitation` model.
34+
#[derive(Deserialize, Serialize, Debug)]
35+
pub struct EncodableCrateOwnerInvitation {
36+
pub invited_by_username: String,
37+
pub crate_name: String,
38+
pub crate_id: i32,
39+
#[serde(with = "::util::rfc3339")]
40+
pub created_at: NaiveDateTime,
41+
}
42+
43+
#[derive(Deserialize, Serialize, Debug, Copy, Clone)]
44+
pub struct InvitationResponse {
45+
pub crate_id: i32,
46+
pub accepted: bool,
47+
}
48+
3749
pub use dependency::EncodableDependency;
3850
pub use download::EncodableVersionDownload;
3951

@@ -240,4 +252,20 @@ mod tests {
240252
.is_some()
241253
);
242254
}
255+
256+
#[test]
257+
fn crate_owner_invitation_serializes_to_rfc3339() {
258+
let inv = EncodableCrateOwnerInvitation {
259+
invited_by_username: "".to_string(),
260+
crate_name: "".to_string(),
261+
crate_id: 123,
262+
created_at: NaiveDate::from_ymd(2017, 1, 6).and_hms(14, 23, 11),
263+
};
264+
let json = serde_json::to_string(&inv).unwrap();
265+
assert!(
266+
json.as_str()
267+
.find(r#""created_at":"2017-01-06T14:23:11+00:00""#)
268+
.is_some()
269+
);
270+
}
243271
}

0 commit comments

Comments
 (0)