ResourceInjector.java 6.23 KB
package com.infoloop.tianting.intercepter;

import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.strategy.SaStrategy;
import cn.hutool.core.convert.Convert;
import com.infoloop.tianting.constant.PathVariableResourceConstants;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.exception.ClientEndExceptions;
import com.infoloop.tianting.service.client.ClientInventoryServiceRpcClient;
import com.infoloop.tianting.service.client.MealOrderServiceRpcClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.NonNull;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.HandlerMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ResourceInjector implements HandlerInterceptor {

    private final MealOrderServiceRpcClient mealOrderServiceRpcClient;

    private final ClientInventoryServiceRpcClient clientInventoryServiceRpcClient;

    @Override
    @SuppressWarnings("unchecked")
    public boolean preHandle(@NonNull final HttpServletRequest httpServletRequest, @NonNull final HttpServletResponse httpServletResponse, @NonNull final Object handler) {
        boolean isHandler = handler instanceof HandlerMethod;
        if (!isHandler) {
            return true;
        }
        final var method = ((HandlerMethod) handler).getMethod();
        if (SaStrategy.instance.isAnnotationPresent.apply(method, SaIgnore.class)) {
            return true;
        }
        final var pathVariables = (Map<String, Object>) httpServletRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
        if (pathVariables == null) {
            return true;
        }

        /*
          注入MpAccount
         */
        if (pathVariables.containsKey(PathVariableResourceConstants.MP_ACCOUNT_ID_PATH_VARIABLE)) {
            final var idStr = pathVariables.get(PathVariableResourceConstants.MP_ACCOUNT_ID_PATH_VARIABLE);
            final var id = Convert.toInt(idStr, 0);
            if (id <= 0) {
                throw ClientEndExceptions.ResourceNotFound.build("小程序用户不存在");
            }
            final var response = mealOrderServiceRpcClient.getMpAccountById(LoginContextHolder.getEnterpriseId(), id);
            if (response == null) {
                log.info("Resource not found; id:{}", id);
                throw ClientEndExceptions.ResourceNotFound.build("小程序用户不存在");
            }
            httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_MP_ACCOUNT, response);
        }

        /*
          注入Client
         */
        if (pathVariables.containsKey(PathVariableResourceConstants.CLIENT_ID_PATH_VARIABLE)) {
            final var idStr = pathVariables.get(PathVariableResourceConstants.CLIENT_ID_PATH_VARIABLE);
            final var id = Convert.toInt(idStr, 0);
            if (id <= 0) {
                throw ClientEndExceptions.ResourceNotFound.build("项目点不存在");
            }
            final var response = clientInventoryServiceRpcClient.getClientById(LoginContextHolder.getEnterpriseId(), id);
            if (response == null) {
                log.info("Resource not found; id:{}", id);
                throw ClientEndExceptions.ResourceNotFound.build("项目点不存在");
            }
            httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_CLIENT, response.getClient());
        }

        /*
          注入Diner
         */
        if (pathVariables.containsKey(PathVariableResourceConstants.DINER_ID_PATH_VARIABLE)) {
            final var idStr = pathVariables.get(PathVariableResourceConstants.DINER_ID_PATH_VARIABLE);
            final var id = Convert.toInt(idStr, 0);
            if (id <= 0) {
                throw ClientEndExceptions.ResourceNotFound.build("就餐人不存在");
            }
            final var response = mealOrderServiceRpcClient.getDinerById(LoginContextHolder.getEnterpriseId(), id);
            if (response == null) {
                log.info("Resource not found; id:{}", id);
                throw ClientEndExceptions.ResourceNotFound.build("就餐人不存在");
            }
            httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_DINER, response);
        }

        /*
          注入GradeClass
         */
        if (pathVariables.containsKey(PathVariableResourceConstants.GRADE_CLASS_ID_PATH_VARIABLE)) {
            final var idStr = pathVariables.get(PathVariableResourceConstants.GRADE_CLASS_ID_PATH_VARIABLE);
            final var id = Convert.toInt(idStr, 0);
            if (id <= 0) {
                throw ClientEndExceptions.ResourceNotFound.build("年级班级不存在");
            }
            final var response = mealOrderServiceRpcClient.getGradeClassById(LoginContextHolder.getEnterpriseId(), id);
            if (response == null) {
                log.info("Resource not found; id:{}", id);
                throw ClientEndExceptions.ResourceNotFound.build("年级班级不存在");
            }
            httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_GRADE_CLASS, response);
        }

        /*
          注入MealOrder
         */
        if (pathVariables.containsKey(PathVariableResourceConstants.MEAL_ORDER_ID_PATH_VARIABLE)) {
            final var idStr = pathVariables.get(PathVariableResourceConstants.MEAL_ORDER_ID_PATH_VARIABLE);
            final var id = Convert.toInt(idStr, 0);
            if (id <= 0) {
                throw ClientEndExceptions.ResourceNotFound.build("订餐记录不存在");
            }
            final var response = mealOrderServiceRpcClient.getMealOrderById(LoginContextHolder.getEnterpriseId(), id);
            if (response == null) {
                log.info("Resource not found; id:{}", id);
                throw ClientEndExceptions.ResourceNotFound.build("订餐记录不存在");
            }
            httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_MEAL_ORDER, response);
        }
        return true;
    }
}