<?php 

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Redis;

class CheckRequest
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $action = $request->route()->getAction(); // 获取路由信息
        $routeActionName = '';

        if (isset($action['controller'])) {
           $controller = class_basename($action['controller']);
           list($routeControllerName, $routeActionName) = explode('@', $controller);
        }

        $prevent_resubmit = Config('config.prevent_resubmit_api'); // 防止重复提交接口

        // 对AJAX POST请求添加Redis锁,防止重复提交
    	if (in_array($routeActionName, $prevent_resubmit) && $request->ajax() && $request->isMethod('post')) { 
            $referer = $_SERVER['HTTP_REFERER']; // 来源页面
            $sale_id = $request->user->userId;   // 操作人ID
            $key     = $routeActionName.'_'.md5($referer.'/'.$sale_id); // 设置表单页面key
 
            // Redis::incr($key); // 计数器
            // $count = Redis::get($key);

            // if ($count > 1) return abort(501, '请勿重新提交!'); // 501服务器不支持当前请求

            $lock = Redis::set($key, 1, "nx", "ex", 2); // 2秒内重复点击提交按钮无效

            if (!$lock) return abort(501, '请勿重新提交!');

            $response = $next($request);

            return $response;
        }

        return $next($request);
    }

}