11use {
22 crate :: {
33 account:: {
4- lib:: { authorize_github, save_token } ,
4+ lib:: { authorize_github, store_token } ,
55 signup:: { do_signup, signup_with_email, SignupMethod } ,
66 } ,
77 cli:: CommandResult ,
@@ -14,12 +14,16 @@ use {
1414 log:: debug,
1515 reqwest:: { Client , StatusCode } ,
1616 smbcloud_model:: {
17- account:: { ErrorCode , GithubInfo , SmbAuthorization , User } ,
17+ account:: {
18+ ErrorCode as AccountErrorCode , ErrorCode :: EmailNotFound , ErrorCode :: EmailUnverified ,
19+ ErrorCode :: GithubNotLinked , ErrorCode :: PasswordNotSet , GithubInfo , SmbAuthorization ,
20+ User ,
21+ } ,
1822 forgot:: { Param , UserUpdatePassword } ,
19- login:: { LoginArgs , LoginParams , UserParam } ,
23+ login:: { AccountStatus , LoginArgs , LoginParams , UserParam } ,
2024 signup:: { GithubEmail , Provider , SignupGithubParams , SignupUserGithub } ,
2125 } ,
22- smbcloud_network:: environment:: Environment ,
26+ smbcloud_network:: { environment:: Environment , network :: request_login } ,
2327 smbcloud_networking:: {
2428 constants:: {
2529 PATH_LINK_GITHUB_ACCOUNT , PATH_RESEND_CONFIRMATION , PATH_RESET_PASSWORD_INSTRUCTIONS ,
@@ -91,16 +95,14 @@ async fn process_authorization(env: Environment, auth: SmbAuthorization) -> Resu
9195 if let Some ( error_code) = auth. error_code {
9296 debug ! ( "{}" , error_code) ;
9397 match error_code {
94- ErrorCode :: EmailNotFound => {
95- return create_new_account ( env, auth. user_email , auth. user_info ) . await
96- }
97- ErrorCode :: EmailUnverified => return send_email_verification ( env, auth. user ) . await ,
98- ErrorCode :: PasswordNotSet => {
98+ EmailNotFound => return create_new_account ( env, auth. user_email , auth. user_info ) . await ,
99+ EmailUnverified => return send_email_verification ( env, auth. user ) . await ,
100+ PasswordNotSet => {
99101 // Only for email and password login
100102 let error = anyhow ! ( "Password not set." ) ;
101103 return Err ( error) ;
102104 }
103- ErrorCode :: GithubNotLinked => return connect_github_account ( env, auth) . await ,
105+ GithubNotLinked => return connect_github_account ( env, auth) . await ,
104106 }
105107 }
106108
@@ -299,7 +301,7 @@ async fn login_with_email(env: Environment) -> Result<CommandResult> {
299301 match check_email ( env, & username) . await {
300302 Ok ( auth) => {
301303 // Only continue with password input if email is found and confirmed.
302- if let Some ( _ ) = auth. error_code {
304+ if auth. error_code . is_some ( ) {
303305 // Check if email is in the database, unconfirmed. Only presents password input if email is found and confirmed.
304306 let spinner = Spinner :: new (
305307 spinners:: Spinners :: SimpleDotsScrolling ,
@@ -339,43 +341,28 @@ async fn do_process_login(env: Environment, args: LoginArgs) -> Result<CommandRe
339341 } ,
340342 } ;
341343
342- let response = match Client :: new ( )
344+ let builder = Client :: new ( )
343345 . post ( build_smb_login_url ( env) )
344- . json ( & login_params)
345- . send ( )
346- . await
347- {
346+ . json ( & login_params) ;
347+
348+ let account_status = match request_login ( builder) . await {
348349 Ok ( response) => response,
349350 Err ( _) => return Err ( anyhow ! ( fail_message( "Check your internet connection." ) ) ) ,
350351 } ;
351352
352- match response. status ( ) {
353- StatusCode :: OK => {
354- // Login successful
355- save_token ( env, & response) . await ?;
353+ match account_status {
354+ AccountStatus :: Ready { access_token } => {
355+ store_token ( env, access_token) . await ?;
356356 Ok ( CommandResult {
357357 spinner,
358358 symbol : succeed_symbol ( ) ,
359359 msg : succeed_message ( "You are logged in!" ) ,
360360 } )
361361 }
362- StatusCode :: NOT_FOUND => {
363- // Account not found and we show signup option
364- Ok ( CommandResult {
365- spinner,
366- symbol : fail_symbol ( ) ,
367- msg : fail_message ( "Account not found. Please signup!" ) ,
368- } )
369- }
370- StatusCode :: UNPROCESSABLE_ENTITY => {
371- // Account found but email not verified / password not set
372- let result: SmbAuthorization = response. json ( ) . await ?;
373- // println!("Result: {:#?}", &result);
374- after_checking_email_step ( & env, spinner, result, None ) . await
362+ AccountStatus :: NotFound => Err ( anyhow ! ( fail_message( "Check your internet connection." ) ) ) ,
363+ AccountStatus :: Incomplete { status } => {
364+ action_on_account_status ( & env, spinner, status, None , None ) . await
375365 }
376- _ => Err ( anyhow ! ( fail_message(
377- "Login failed. Check your username and password."
378- ) ) ) ,
379366 }
380367}
381368
@@ -389,7 +376,7 @@ async fn after_checking_email_step(
389376 Some ( error_code) => {
390377 debug ! ( "{}" , error_code) ;
391378 match error_code {
392- ErrorCode :: EmailNotFound => {
379+ EmailNotFound => {
393380 spinner. stop_and_persist (
394381 & succeed_symbol ( ) ,
395382 succeed_message (
@@ -398,14 +385,14 @@ async fn after_checking_email_step(
398385 ) ;
399386 signup_with_email ( env. to_owned ( ) , username) . await
400387 }
401- ErrorCode :: EmailUnverified => {
388+ EmailUnverified => {
402389 spinner. stop_and_persist (
403390 & succeed_symbol ( ) ,
404391 succeed_message ( "Email not verified. Please verify your email." ) ,
405392 ) ;
406393 send_email_verification ( * env, result. user ) . await
407394 }
408- ErrorCode :: PasswordNotSet => {
395+ PasswordNotSet => {
409396 spinner. stop_and_persist (
410397 & succeed_symbol ( ) ,
411398 succeed_message ( "Password not set. Please reset your password." ) ,
@@ -422,6 +409,42 @@ async fn after_checking_email_step(
422409 }
423410}
424411
412+ async fn action_on_account_status (
413+ env : & Environment ,
414+ mut spinner : Spinner ,
415+ error_code : AccountErrorCode ,
416+ username : Option < String > ,
417+ user : Option < User > ,
418+ ) -> Result < CommandResult > {
419+ match error_code {
420+ EmailNotFound => {
421+ spinner. stop_and_persist (
422+ & succeed_symbol ( ) ,
423+ succeed_message ( "Account not found. Please continue with setting up your account." ) ,
424+ ) ;
425+ signup_with_email ( env. to_owned ( ) , username) . await
426+ }
427+ EmailUnverified => {
428+ spinner. stop_and_persist (
429+ & succeed_symbol ( ) ,
430+ succeed_message ( "Email not verified. Please verify your email." ) ,
431+ ) ;
432+ send_email_verification ( * env, user) . await
433+ }
434+ PasswordNotSet => {
435+ spinner. stop_and_persist (
436+ & succeed_symbol ( ) ,
437+ succeed_message ( "Password not set. Please reset your password." ) ,
438+ ) ;
439+ send_reset_password ( * env, user) . await
440+ }
441+ _ => {
442+ spinner. stop_and_persist ( & fail_symbol ( ) , fail_message ( "An error occurred." ) ) ;
443+ Err ( anyhow ! ( "Idk what happened." ) )
444+ }
445+ }
446+ }
447+
425448async fn send_reset_password ( env : Environment , user : Option < User > ) -> Result < CommandResult > {
426449 // Return early if user is null
427450 if let Some ( user) = user {
0 commit comments