func()

in internal/service/user_external_login/user_center_login_service.go [69:139]


func (us *UserCenterLoginService) ExternalLogin(
	ctx context.Context, userCenter plugin.UserCenter, basicUserInfo *plugin.UserCenterBasicUserInfo) (
	resp *schema.UserExternalLoginResp, err error) {
	if len(basicUserInfo.ExternalID) == 0 {
		return &schema.UserExternalLoginResp{
			ErrTitle: translator.Tr(handler.GetLangByCtx(ctx), reason.UserAccessDenied),
			ErrMsg:   translator.Tr(handler.GetLangByCtx(ctx), reason.UserExternalLoginMissingUserID),
		}, nil
	}

	if len(basicUserInfo.Email) > 0 {
		// check whether site allow register or not
		siteInfo, err := us.siteInfoCommonService.GetSiteLogin(ctx)
		if err != nil {
			return nil, err
		}
		if !checker.EmailInAllowEmailDomain(basicUserInfo.Email, siteInfo.AllowEmailDomains) {
			log.Debugf("email domain not allowed: %s", basicUserInfo.Email)
			return &schema.UserExternalLoginResp{
				ErrTitle: translator.Tr(handler.GetLangByCtx(ctx), reason.UserAccessDenied),
				ErrMsg:   translator.Tr(handler.GetLangByCtx(ctx), reason.EmailIllegalDomainError),
			}, nil
		}
	}

	oldExternalLoginUserInfo, exist, err := us.userExternalLoginRepo.GetByExternalID(ctx,
		userCenter.Info().SlugName, basicUserInfo.ExternalID)
	if err != nil {
		return nil, err
	}
	if exist {
		// if user is already a member, login directly
		oldUserInfo, exist, err := us.userRepo.GetByUserID(ctx, oldExternalLoginUserInfo.UserID)
		if err != nil {
			return nil, err
		}
		if exist {
			// if user is deleted, do not allow login
			if oldUserInfo.Status == entity.UserStatusDeleted {
				return &schema.UserExternalLoginResp{
					ErrTitle: translator.Tr(handler.GetLangByCtx(ctx), reason.UserAccessDenied),
					ErrMsg:   translator.Tr(handler.GetLangByCtx(ctx), reason.UserPageAccessDenied),
				}, nil
			}
			if err := us.userRepo.UpdateLastLoginDate(ctx, oldUserInfo.ID); err != nil {
				log.Errorf("update user last login date failed: %v", err)
			}
			accessToken, _, err := us.userCommonService.CacheLoginUserInfo(
				ctx, oldUserInfo.ID, oldUserInfo.MailStatus, oldUserInfo.Status, oldExternalLoginUserInfo.ExternalID)
			return &schema.UserExternalLoginResp{AccessToken: accessToken}, err
		}
	}

	// cache external user info, waiting for user enter email address.
	if userCenter.Description().MustAuthEmailEnabled && len(basicUserInfo.Email) == 0 {
		return &schema.UserExternalLoginResp{ErrMsg: "Requires authorized email to login"}, nil
	}

	oldUserInfo, err := us.registerNewUser(ctx, userCenter.Info().SlugName, basicUserInfo)
	if err != nil {
		return nil, err
	}

	if err := us.activeUser(ctx, oldUserInfo); err != nil {
		return nil, err
	}

	accessToken, _, err := us.userCommonService.CacheLoginUserInfo(
		ctx, oldUserInfo.ID, oldUserInfo.MailStatus, oldUserInfo.Status, oldExternalLoginUserInfo.ExternalID)
	return &schema.UserExternalLoginResp{AccessToken: accessToken}, err
}