@@ -4,7 +4,7 @@ use crate::github;
4
4
use conduit_cookie:: RequestSession ;
5
5
use rand:: { thread_rng, Rng } ;
6
6
7
- use crate :: models:: NewUser ;
7
+ use crate :: models:: { NewUser , User } ;
8
8
9
9
/// Handles the `GET /authorize_url` route.
10
10
///
@@ -84,35 +84,41 @@ pub fn github_access_token(req: &mut dyn Request) -> CargoResult<Response> {
84
84
}
85
85
}
86
86
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
-
96
87
// Fetch the access token from github using the code we just got
97
88
let token = req. app ( ) . github . exchange ( code) . map_err ( |s| human ( & s) ) ?;
98
89
99
90
let ghuser = github:: github :: < GithubUser > ( req. app ( ) , "/user" , & token) ?;
91
+ let user = ghuser. save_to_database ( & token. access_token , & * req. db_conn ( ) ?) ?;
100
92
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 ( ) ?) ?;
110
93
req. session ( )
111
94
. insert ( "user_id" . to_string ( ) , user. id . to_string ( ) ) ;
112
95
req. mut_extensions ( ) . insert ( user) ;
113
96
super :: me:: me ( req)
114
97
}
115
98
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
+
116
122
/// Handles the `GET /logout` route.
117
123
pub fn logout ( req : & mut dyn Request ) -> CargoResult < Response > {
118
124
req. session ( ) . remove ( & "user_id" . to_string ( ) ) ;
0 commit comments