package com.lightinit.hsdatagateway.modules.sys.interceptor;

import com.lightinit.hsdatagateway.common.network.IpUtils;
import com.lightinit.hsdatagateway.common.utils.CacheUtils;
import com.lightinit.hsdatagateway.common.utils.SpringContextHolder;
import com.lightinit.hsdatagateway.modules.gateway.service.BlackWhiteListService;
import com.google.common.base.Strings;
import org.springframework.web.servlet.HandlerInterceptor;

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

/**
 * @ClassName: BlackWhiteInterceptor
 * @Description: 黑白名单拦截器
 * @Author: yangrui
 * @Date 2019/3/6 上午10:34
 * @Version V1.0
 **/
public class BlackWhiteInterceptor implements HandlerInterceptor {

    /**
     * 黑名单value
     */
    public static final String TYPE_NAME = "black";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        String type = validateType();
        String ip = IpUtils.getIp(request);

        if (Strings.isNullOrEmpty(ip)) {
            return false;
        }

        // 根据type从缓存中获取名单列表
        List<String> list = (List<String>) CacheUtils.get(type);

        // 如果从缓存中查询为空 不排除项目初始化缓存失败 需从数据库再取一次并加入缓存
        BlackWhiteListService service = SpringContextHolder.getBean(BlackWhiteListService.class);
        if (list == null || list.isEmpty()) {
            list = service.findIpByType(TYPE_NAME.equals(type) ? "黑名单":"白名单");
            CacheUtils.put(type, list);
        }

        if (TYPE_NAME.equals(type)) {
            // 启用黑名单 如果为空 则放过请求 如果不为空 查看ip是否在黑名单中
            if ((list != null && !list.isEmpty()) && list.contains(ip)) {
                return false;
            }
        } else {
            // 启用白名单 如果为空 返回false 如果不为空 查看ip是否在白名单中
            if ((list == null || list.isEmpty()) || !list.contains(ip)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 验证启用的哪种名单
     * @return
     */
    public String validateType() {
        String type = (String) CacheUtils.get("blackWhite");
        if (Strings.isNullOrEmpty(type)) {
            type = TYPE_NAME;
        }
        return type;
    }
}
