add: api for rate control
This commit is contained in:
28
api/config.py
Normal file
28
api/config.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from flask import Blueprint, jsonify, request
|
||||
|
||||
from api import require_auth, rate_limits
|
||||
import re
|
||||
config_bp = Blueprint('config', __name__, url_prefix='/api/config')
|
||||
|
||||
RATE_LIMIT_REGEX = re.compile(r'^\d+\s?(per\s|/)\s?(second|minute|hour|day)$')
|
||||
|
||||
def is_valid_rate_limit(limit):
|
||||
return bool(RATE_LIMIT_REGEX.match(limit))
|
||||
@config_bp.route('/limits', methods=['GET'])
|
||||
@require_auth(roles=['admin'])
|
||||
def limits():
|
||||
return jsonify(rate_limits), 200
|
||||
|
||||
@config_bp.route('/limits', methods=['PUT'])
|
||||
@require_auth(roles=['admin'])
|
||||
def update_limits():
|
||||
data = request.json
|
||||
if not data or 'endpoint' not in data or 'method' not in data or 'new_limit' not in data:
|
||||
return jsonify({'error': 'Bad request'}), 400
|
||||
key = f"{data['endpoint']} : {data['method']}"
|
||||
if key not in rate_limits:
|
||||
return jsonify({'error': 'endpoint not fount'}), 404
|
||||
if is_valid_rate_limit(data['new_limit']):
|
||||
rate_limits[key] = data['new_limit']
|
||||
return jsonify({"message": "updated"}), 200
|
||||
return jsonify({'error': 'Invalid value'}), 400
|
||||
Reference in New Issue
Block a user