package com.games.gateway.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 统一的 redis key 管理工具类（方便后续的维护和查找）
 *
 * @Author zzhan
 * @Date 2021/9/24
 * @Version 1.0
 */
@Slf4j
@Service
public class RedisKeyUtils {

    /**
     * ip+path限流计数检查key
     *
     * @param ip
     * @param path
     * @return
     */
    public String ipPathLimitCheckKey(String ip, String path) {
        return "gateway:ip:path:limit:check:".concat(path).concat(":").concat(ip);
    }

    /**
     * ip+path缓存配置key
     *
     * @param path
     * @return
     */
    public String ipPathLimitSetKey(String path) {
        return "gateway:ip:path:limit:set:".concat(path);
    }


    /**
     * path白名单key
     *
     * @return
     */
    public String pathWhiteKey() {
        return "gateway:path:white";
    }

    /**
     * ip 每分钟最大访问次数限制
     *
     * @return
     */
    public String ipLimiterKey(String ip) {
        return "gateway:ipLimiter:" + ip;
    }

    /**
     * path 每分钟最大访问次数限制
     *
     * @return
     */
    public String pathLimiterKey(String path) {
        return "gateway:pathLimiter:" + path;
    }

    /**
     * 频繁token撞库对应IP限制次数限制 1小时
     *
     * @return
     */
    public String tokenCsIpLimiterKey() {
        return "gateway:tokenCsIpLimiter";
    }

    /**
     * path限流计数检查key
     *
     * @param path
     * @return
     */
    public String pathLimitCheckKey(String path) {
        return "gateway:limiter:path:check:" + path;
    }

    /**
     * ip限流计算检查key
     *
     * @param ip
     * @return
     */
    public String ipLimitCheckKey(String ip) {
        return "gateway:limiter:ip:check:" + ip;
    }

    /**
     * 频繁token撞库对应IP限制计算检查 1小时
     *
     * @param ip
     * @return
     */
    public String tokenCsIpLimitCheckKey(String ip) {
        return "gateway:limiter:tokenCsIp:check:" + ip;
    }

    /**
     * 频繁token撞库对应IP黑名单 set
     *
     * @return
     */
    public String ipBlackKey() {
        return "gateway:ipBlack:";
    }

    /**
     * token限流计算检查key
     *
     * @param token
     * @return
     */
    public String tokenLimitCheckKey(String token) {
        return "gateway:limiter:token:check:" + token;
    }

    /**
     * token每分钟最大访问次数限制
     *
     * @param token
     * @return
     */
    public String tokenLimiterKey(String token) {
        return "gateway:tokenLimiter:" + token;
    }

    /**
     * token撞库的统计次数
     *
     * @return
     */
    public String tokenCsLimiterKey() {
        return "gateway:token:csCount";
    }

    /**
     * token撞库的ip set
     *
     * @return
     */
    public String tokenCsIpKey() {
        return "gateway:token:cs:ip";
    }

}
