ResourceInjector.java 2.53 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.exception.ClientEndExceptions;
import com.infoloop.tianting.service.client.ExampleServiceRpcClient;
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 ExampleServiceRpcClient exampleServiceRpcClient;

    @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;
        }

        /*
          注入TestExampleDb
         */
        if (pathVariables.containsKey(PathVariableResourceConstants.TEST_EXAMPLE_DB_ID_PATH_VARIABLE)) {
            final var idStr = pathVariables.get(PathVariableResourceConstants.TEST_EXAMPLE_DB_ID_PATH_VARIABLE);
            final var id = Convert.toInt(idStr, 0);
            if (id <= 0) {
                throw ClientEndExceptions.ResourceNotFound.build("示例不存在");
            }
            final var response = exampleServiceRpcClient.getTestExampleDbById(id);
            if (response == null) {
                throw ClientEndExceptions.ResourceNotFound.build("示例不存在");
            }
            httpServletRequest.setAttribute(PathVariableResourceConstants.INJECTED_TEST_EXAMPLE_DB, response);
        }


        return true;
    }
}