@@ -156,44 +156,53 @@ pub async fn save_user_to_database(
156156 . maybe_avatar ( gh_user. avatar_url . as_deref ( ) )
157157 . build ( ) ;
158158
159- // should start a transaction here
160-
161- match oauth_github_update. update ( conn) . await {
162- // oauth github exists, which means user must too
163- Ok ( oauth_github) => {
164- let user = User :: find ( conn, oauth_github. user_id ) . await ?;
165-
166- // update user display name; eventually we should stop syncing this with github
167- diesel:: update ( users:: table)
168- . filter ( users:: id. eq ( user. id ) )
169- . set ( users:: name. eq ( gh_user. name . as_ref ( ) ) )
170- . execute ( conn)
171- . await ?;
172-
173- Ok ( user. id )
174- }
175- // oauth github does not exist, which means user must not either and we need to create both
176- Err ( diesel:: result:: Error :: NotFound ) => {
177- let new_user = NewUser :: builder ( )
178- . gh_login ( & gh_user. login )
179- . maybe_name ( gh_user. name . as_deref ( ) )
180- . build ( ) ;
181-
182- let user_id =
183- create_or_update_user ( & new_user, gh_user. email . as_deref ( ) , emails, conn) . await ?;
184-
185- oauth_github_update. insert ( conn, user_id) . await ?;
186-
187- Ok ( user_id)
188- }
189- Err ( error) if is_read_only_error ( & error) => {
190- // If we're in read only mode, we can't update their details
191- // just look for an existing user
192- find_user_by_gh_id ( conn, gh_user. id ) . await ?. ok_or ( error)
159+ conn. transaction ( async |conn| {
160+ match dbg ! ( oauth_github_update. update( conn) . await ) {
161+ // oauth github exists, which means user must too
162+ Ok ( oauth_github) => {
163+ let user = User :: find ( conn, oauth_github. user_id ) . await ?;
164+ dbg ! ( & user) ;
165+
166+ // update user display name and gh_login; eventually we should stop syncing these
167+ // with github
168+ diesel:: update ( users:: table)
169+ . filter ( users:: id. eq ( user. id ) )
170+ . set ( (
171+ users:: name. eq ( gh_user. name . as_ref ( ) ) ,
172+ users:: gh_login. eq ( & gh_user. login ) ,
173+ ) )
174+ . execute ( conn)
175+ . await ?;
176+
177+ Ok ( user. id )
178+ }
179+ // oauth github does not exist, which means user must not either and we need to create both
180+ Err ( diesel:: result:: Error :: NotFound ) => {
181+ let new_user = NewUser :: builder ( )
182+ . gh_login ( & gh_user. login )
183+ . maybe_name ( gh_user. name . as_deref ( ) )
184+ . build ( ) ;
185+ dbg ! ( & new_user) ;
186+
187+ let user_id =
188+ create_or_update_user ( & new_user, gh_user. email . as_deref ( ) , emails, conn)
189+ . await ?;
190+ dbg ! ( & user_id) ;
191+
192+ dbg ! ( oauth_github_update. insert( conn, user_id) . await ) ?;
193+
194+ Ok ( user_id)
195+ }
196+ Err ( error) if is_read_only_error ( & error) => {
197+ // If we're in read only mode, we can't update their details
198+ // just look for an existing user
199+ find_user_by_gh_id ( conn, gh_user. id ) . await ?. ok_or ( error)
200+ }
201+ // other error
202+ Err ( e) => Err ( dbg ! ( e) ) ,
193203 }
194- // other error
195- Err ( e) => Err ( e) ,
196- }
204+ } )
205+ . await
197206}
198207
199208/// Inserts the user into the database, or updates an existing one.
@@ -206,41 +215,38 @@ async fn create_or_update_user(
206215 emails : & Emails ,
207216 conn : & mut AsyncPgConnection ,
208217) -> QueryResult < i32 > {
209- conn. transaction ( async |conn| {
210- let user_id = new_user. insert ( conn) . await ?;
211-
212- // To send the user an account verification email
213- if let Some ( user_email) = email {
214- let new_email = NewEmail :: builder ( )
215- . user_id ( user_id)
216- . email ( user_email)
217- . build ( ) ;
218-
219- if let Some ( token) = new_email. insert_if_missing ( conn) . await ? {
220- let email = EmailMessage :: from_template (
221- "user_confirm" ,
222- context ! {
223- user_name => new_user. gh_login,
224- domain => emails. domain,
225- token => token. expose_secret( )
226- } ,
227- ) ;
228-
229- match email {
230- Ok ( email) => {
231- // Swallows any error. Some users might insert an invalid email address here.
232- let _ = emails. send ( user_email, email) . await ;
233- }
234- Err ( error) => {
235- warn ! ( "Failed to render user confirmation email template: {error}" ) ;
236- }
237- } ;
238- }
218+ let user_id = new_user. insert ( conn) . await ?;
219+
220+ // To send the user an account verification email
221+ if let Some ( user_email) = email {
222+ let new_email = NewEmail :: builder ( )
223+ . user_id ( user_id)
224+ . email ( user_email)
225+ . build ( ) ;
226+
227+ if let Some ( token) = new_email. insert_if_missing ( conn) . await ? {
228+ let email = EmailMessage :: from_template (
229+ "user_confirm" ,
230+ context ! {
231+ user_name => new_user. gh_login,
232+ domain => emails. domain,
233+ token => token. expose_secret( )
234+ } ,
235+ ) ;
236+
237+ match email {
238+ Ok ( email) => {
239+ // Swallows any error. Some users might insert an invalid email address here.
240+ let _ = emails. send ( user_email, email) . await ;
241+ }
242+ Err ( error) => {
243+ warn ! ( "Failed to render user confirmation email template: {error}" ) ;
244+ }
245+ } ;
239246 }
247+ }
240248
241- Ok ( user_id)
242- } )
243- . await
249+ Ok ( user_id)
244250}
245251
246252async fn find_user_by_gh_id ( mut conn : & AsyncPgConnection , gh_id : i32 ) -> QueryResult < Option < i32 > > {
0 commit comments