Skip to content

Commit b119287

Browse files
committed
Extract a method for testability
1 parent 723025d commit b119287

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

src/controllers/user/session.rs

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::github;
44
use conduit_cookie::RequestSession;
55
use rand::{thread_rng, Rng};
66

7-
use crate::models::NewUser;
7+
use crate::models::{NewUser, User};
88

99
/// Handles the `GET /authorize_url` route.
1010
///
@@ -84,35 +84,41 @@ pub fn github_access_token(req: &mut dyn Request) -> CargoResult<Response> {
8484
}
8585
}
8686

87-
#[derive(Deserialize)]
88-
struct GithubUser {
89-
email: Option<String>,
90-
name: Option<String>,
91-
login: String,
92-
id: i32,
93-
avatar_url: Option<String>,
94-
}
95-
9687
// Fetch the access token from github using the code we just got
9788
let token = req.app().github.exchange(code).map_err(|s| human(&s))?;
9889

9990
let ghuser = github::github::<GithubUser>(req.app(), "/user", &token)?;
91+
let user = ghuser.save_to_database(&token.access_token, &*req.db_conn()?)?;
10092

101-
let user = NewUser::new(
102-
ghuser.id,
103-
&ghuser.login,
104-
ghuser.email.as_ref().map(|s| &s[..]),
105-
ghuser.name.as_ref().map(|s| &s[..]),
106-
ghuser.avatar_url.as_ref().map(|s| &s[..]),
107-
&token.access_token,
108-
)
109-
.create_or_update(&*req.db_conn()?)?;
11093
req.session()
11194
.insert("user_id".to_string(), user.id.to_string());
11295
req.mut_extensions().insert(user);
11396
super::me::me(req)
11497
}
11598

99+
#[derive(Deserialize)]
100+
struct GithubUser {
101+
email: Option<String>,
102+
name: Option<String>,
103+
login: String,
104+
id: i32,
105+
avatar_url: Option<String>,
106+
}
107+
108+
impl GithubUser {
109+
fn save_to_database(&self, access_token: &str, conn: &PgConnection) -> QueryResult<User> {
110+
Ok(NewUser::new(
111+
self.id,
112+
&self.login,
113+
self.email.as_ref().map(|s| &s[..]),
114+
self.name.as_ref().map(|s| &s[..]),
115+
self.avatar_url.as_ref().map(|s| &s[..]),
116+
access_token,
117+
)
118+
.create_or_update(conn)?)
119+
}
120+
}
121+
116122
/// Handles the `GET /logout` route.
117123
pub fn logout(req: &mut dyn Request) -> CargoResult<Response> {
118124
req.session().remove(&"user_id".to_string());

0 commit comments

Comments
 (0)