Skip to content

Commit 6e28c56

Browse files
committed
Track GitHub ids instead of logins
These are stable across renames on GitHub, and help track on GitHub account.
1 parent 6ac348a commit 6e28c56

File tree

5 files changed

+34
-13
lines changed

5 files changed

+34
-13
lines changed

src/bin/migrate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,7 @@ fn migrations() -> Vec<Migration> {
741741
),
742742

743743
Migration::add_column(20160811151953, "users", "gh_id", "INTEGER"),
744+
index(20160811151954, "users", "gh_id"),
744745
];
745746
// NOTE: Generate a new id via `date +"%Y%m%d%H%M%S"`
746747

src/bin/update-downloads.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ mod test {
149149
}
150150

151151
fn user(conn: &postgres::Transaction) -> User{
152-
User::find_or_insert(conn, "login", None, None, None,
152+
User::find_or_insert(conn, 2, "login", None, None, None,
153153
"access_token", "api_token").unwrap()
154154
}
155155

src/tests/all.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ static NEXT_ID: AtomicUsize = ATOMIC_USIZE_INIT;
168168
fn user(login: &str) -> User {
169169
User {
170170
id: NEXT_ID.fetch_add(1, Ordering::SeqCst) as i32,
171+
gh_id: NEXT_ID.fetch_add(1, Ordering::SeqCst) as i32,
171172
gh_login: login.to_string(),
172173
email: None,
173174
name: None,
@@ -197,6 +198,7 @@ fn krate(name: &str) -> Crate {
197198

198199
fn mock_user(req: &mut Request, u: User) -> User {
199200
let u = User::find_or_insert(req.tx().unwrap(),
201+
u.gh_id,
200202
&u.gh_login,
201203
u.email.as_ref().map(|s| &s[..]),
202204
u.name.as_ref().map(|s| &s[..]),

src/tests/user.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,23 @@ fn user_insert() {
3535
let conn = t!(app.database.get());
3636
let tx = t!(conn.transaction());
3737

38-
let user = t!(User::find_or_insert(&tx, "foo", None, None, None, "bar", "baz"));
38+
let user = t!(User::find_or_insert(&tx, 1, "foo", None, None, None, "bar", "baz"));
3939
assert_eq!(t!(User::find_by_api_token(&tx, "baz")), user);
4040
assert_eq!(t!(User::find(&tx, user.id)), user);
4141

42-
assert_eq!(t!(User::find_or_insert(&tx, "foo", None, None, None,
42+
assert_eq!(t!(User::find_or_insert(&tx, 1, "foo", None, None, None,
4343
"bar", "api")), user);
44-
let user2 = t!(User::find_or_insert(&tx, "foo", None, None, None,
44+
let user2 = t!(User::find_or_insert(&tx, 1, "foo", None, None, None,
4545
"baz", "api"));
4646
assert!(user != user2);
47+
assert_eq!(user.id, user2.id);
4748
assert_eq!(user2.gh_access_token, "baz");
49+
50+
let user3 = t!(User::find_or_insert(&tx, 1, "bar", None, None, None,
51+
"baz", "api"));
52+
assert!(user != user3);
53+
assert_eq!(user.id, user3.id);
54+
assert_eq!(user3.gh_login, "bar");
4855
}
4956

5057
#[test]
@@ -68,7 +75,7 @@ fn reset_token() {
6875
let mut req = ::req(app, Method::Put, "/me/reset_token");
6976
let user = {
7077
let tx = RequestTransaction::tx(&mut req as &mut Request);
71-
User::find_or_insert(tx.unwrap(), "foo", None,
78+
User::find_or_insert(tx.unwrap(), 1, "foo", None,
7279
None, None, "bar", "baz").unwrap()
7380
};
7481
::mock_user(&mut req, user.clone());

src/user/mod.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub mod middleware;
2525
pub struct User {
2626
pub id: i32,
2727
pub gh_login: String,
28+
pub gh_id: i32,
2829
pub name: Option<String>,
2930
pub email: Option<String>,
3031
pub avatar: Option<String>,
@@ -68,6 +69,7 @@ impl User {
6869

6970
/// Updates a user or inserts a new user into the database.
7071
pub fn find_or_insert(conn: &GenericConnection,
72+
id: i32,
7173
login: &str,
7274
email: Option<&str>,
7375
name: Option<&str>,
@@ -82,26 +84,32 @@ impl User {
8284
SET gh_access_token = $1,
8385
email = $2,
8486
name = $3,
85-
gh_avatar = $4
86-
WHERE gh_login = $5
87+
gh_avatar = $4,
88+
gh_login = $5
89+
WHERE gh_id = $6
8790
RETURNING *"));
8891
let rows = try!(stmt.query(&[&access_token,
89-
&email, &name, &avatar,
90-
&login]));
92+
&email,
93+
&name,
94+
&avatar,
95+
&login,
96+
&id]));
9197
match rows.iter().next() {
9298
Some(ref row) => return Ok(Model::from_row(row)),
9399
None => {}
94100
}
95101
let stmt = try!(conn.prepare("INSERT INTO users
96102
(email, gh_access_token, api_token,
97-
gh_login, name, gh_avatar)
98-
VALUES ($1, $2, $3, $4, $5, $6)
103+
gh_login, name, gh_avatar, gh_id)
104+
VALUES ($1, $2, $3, $4, $5, $6, $7)
99105
RETURNING *"));
100106
let rows = try!(stmt.query(&[&email,
101107
&access_token,
102108
&api_token,
103109
&login,
104-
&name, &avatar]));
110+
&name,
111+
&avatar,
112+
&id]));
105113
Ok(Model::from_row(&try!(rows.iter().next().chain_error(|| {
106114
internal("no user with email we just found")
107115
}))))
@@ -115,7 +123,7 @@ impl User {
115123
/// Converts this `User` model into an `EncodableUser` for JSON serialization.
116124
pub fn encodable(self) -> EncodableUser {
117125
let User { id, email, api_token: _, gh_access_token: _,
118-
name, gh_login, avatar } = self;
126+
name, gh_login, avatar, gh_id: _ } = self;
119127
EncodableUser {
120128
id: id,
121129
email: email,
@@ -134,6 +142,7 @@ impl Model for User {
134142
gh_access_token: row.get("gh_access_token"),
135143
api_token: row.get("api_token"),
136144
gh_login: row.get("gh_login"),
145+
gh_id: row.get("gh_id"),
137146
name: row.get("name"),
138147
avatar: row.get("gh_avatar"),
139148
}
@@ -218,6 +227,7 @@ pub fn github_access_token(req: &mut Request) -> CargoResult<Response> {
218227
email: Option<String>,
219228
name: Option<String>,
220229
login: String,
230+
id: i32,
221231
avatar_url: Option<String>,
222232
}
223233

@@ -233,6 +243,7 @@ pub fn github_access_token(req: &mut Request) -> CargoResult<Response> {
233243
// Into the database!
234244
let api_token = User::new_api_token();
235245
let user = try!(User::find_or_insert(try!(req.tx()),
246+
ghuser.id,
236247
&ghuser.login,
237248
ghuser.email.as_ref()
238249
.map(|s| &s[..]),

0 commit comments

Comments
 (0)