LoginServiceImpl.java 3.18 KB
package com.infoloop.tianting.service.impl;

import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.infoloop.tianting.COperatorServiceProtoRpcGrpc;
import com.infoloop.tianting.clientcustomerservice.GetClientCustomerByIdRpcRequest;
import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcResponse;
import com.infoloop.tianting.constant.CommonConstants;
import com.infoloop.tianting.exception.ClientEndExceptions;
import com.infoloop.tianting.exception.ErrorCodeEnum;
import com.infoloop.tianting.model.dto.PermissionDTO.LoginDto;
import com.infoloop.tianting.service.ClientCustomerService;
import com.infoloop.tianting.service.LoginService;
import com.infoloop.tianting.service.WxMiniProgramService;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import com.infoloop.tianting.service.client.OperatorServiceRpcClient;
import com.infoloop.tianting.service.client.WxMiniProgramClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class LoginServiceImpl implements LoginService {

  private final ClientCustomerServiceRpcClient clientCustomerServiceRpcClient;
  private final OperatorServiceRpcClient operatorServiceRpcClient;
  private final WxMiniProgramClient wxMiniProgramClient;

  @Override
  public SaTokenInfo login(LoginDto loginDto) {
    if (loginDto.isShouldLoginWithOpenCode()) {
      final var wxUserOpenIdDto = wxMiniProgramClient.getUserOpenIdByCode(loginDto.getOpenCode());
      StpUtil.login(wxUserOpenIdDto.getOpenid(), SaLoginModel.create()
          .setExtra(CommonConstants.ENTERPRISE_ID, loginDto.getEnterpriseId())
          .setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
          .build());
      return StpUtil.getTokenInfo();
    }
    else if (loginDto.isShouldLoginWithHisCustomerId()){
        final var customer = clientCustomerServiceRpcClient.getClientCustomerByHISCustomerId(
            loginDto.getHisCustomerId()).getResponse();
      if (customer.getId() == 0) {
        throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
      }
      StpUtil.login(customer.getId(), SaLoginModel.create()
          .setExtra(CommonConstants.ENTERPRISE_ID, customer.getEnterpriseId())
          .setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
          .build());
      return StpUtil.getTokenInfo();
    }
    else {
      final var operator = operatorServiceRpcClient.getCOperatorByMobileOrEmail(
          loginDto.getOperatorPhone());
      if (operator.getId() == 0) {
        throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
      }
      StpUtil.login(operator.getId(), SaLoginModel.create()
          .setExtra(CommonConstants.ENTERPRISE_ID, operator.getEnterpriseId())
          .setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
          .build());
      return StpUtil.getTokenInfo();
    }
    }

}