Telezab/backend/api.py

262 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from flask import jsonify, request, Blueprint
from flask_login import login_required
from frontend.dashboard import user_manager, event_manager, region_manager, system_manager
from utilities.database import db
from utilities.web_logger import WebLogger
bp_api = Blueprint('api', __name__, url_prefix='/telezab/rest/api')
web_logger = WebLogger(db)
@bp_api.route('/users', methods=['GET', 'POST'])
@login_required
def manage_users():
if request.method == 'GET':
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 20, type=int)
return jsonify(user_manager.get_users(page, per_page))
elif request.method == 'POST':
user_data = request.get_json()
try:
result, status_code = user_manager.add_user(user_data)
if status_code == 201:
web_logger.log_web_action(
action='Добавление пользователя Telegram',
details=f'Telegram ID: {user_data.get("chat_id")}, Username: {user_data.get("username")}'
)
return jsonify(result), status_code
except Exception as e:
return jsonify({'error': str(e)}), 500
@bp_api.route('/users/<int:chat_id>', methods=['GET'])
@login_required
def get_user(chat_id):
user = user_manager.get_user(chat_id)
if not user:
return jsonify({'error': 'Пользователь не найден'}), 404
return jsonify(user)
@bp_api.route('/users/<int:chat_id>/block', methods=['POST'])
@login_required
def block_user(chat_id):
user_info = user_manager.get_user(chat_id)
blocked = user_manager.toggle_block_user(chat_id)
if blocked is not None:
status = 'заблокирован' if blocked else 'разблокирован'
web_logger.log_web_action(
action=f'Блокировка/разблокировка пользователя Telegram',
details=f'Telegram ID: {chat_id}, Username: {user_info.get("username") if user_info else "неизвестно"}, Статус: {status}'
)
return jsonify({'status': 'updated', 'new_status': blocked})
else:
return jsonify({'status': 'error', 'message': 'User not found'}), 404
@bp_api.route('/users/<int:chat_id>', methods=['DELETE'])
@login_required
def delete_user(chat_id):
user_info = user_manager.get_user(chat_id)
if user_manager.delete_user(chat_id):
web_logger.log_web_action(
action='Удаление пользователя Telegram',
details=f'Telegram ID: {chat_id}, Username: {user_info.get("username") if user_info else "неизвестно"}'
)
return jsonify({'status': 'deleted'})
else:
return jsonify({'status': 'error', 'message': 'User not found'}), 404
@bp_api.route('/users/<int:chat_id>/log', methods=['POST'])
@login_required
def log_user_action(chat_id):
action = request.json.get('action')
if action:
event_manager.log_user_action(chat_id, action)
return jsonify({'message': 'Действие сохранено'}), 200
else:
return jsonify({'error': 'Не указано действие'}), 400
@bp_api.route('/users/search', methods=['GET'])
@login_required
def search_users():
telegram_id = request.args.get('telegram_id')
email = request.args.get('email')
users = user_manager.search_users(telegram_id, email)
return jsonify(users)
@bp_api.route('/user_events/<int:chat_id>', methods=['GET'])
@login_required
def handle_user_events(chat_id):
return event_manager.get_user_events(chat_id)
@bp_api.route('/regions', methods=['GET', 'POST', 'PUT', 'DELETE'])
@login_required
def manage_regions():
if request.method == 'POST':
region_data = request.get_json()
result = region_manager.add_region(region_data)
web_logger.log_web_action(
action='Добавление региона',
details=f'Название: {region_data.get("name")}, Номер: {region_data.get("number")}'
)
return jsonify(result)
elif request.method == 'PUT':
region_data = request.get_json()
if 'active' in region_data:
result = region_manager.update_region_status(region_data)
status = 'активирован' if region_data.get('active') else 'деактивирован'
web_logger.log_web_action(
action='Изменение статуса региона',
details=f'ID: {region_data.get("region_id")}, Статус: {status}'
)
return jsonify(result)
elif 'name' in region_data:
result = region_manager.update_region_name(region_data)
web_logger.log_web_action(
action='Изменение названия региона',
details=f'ID: {region_data.get("region_id")}, Новое название: {region_data.get("name")}'
)
return jsonify(result)
else:
return jsonify({'status': 'error', 'message': 'Некорректный запрос'}), 400
elif request.method == 'DELETE':
region_id = request.args.get('region_id')
region_info = region_manager.get_region(region_id)
result = region_manager.delete_region(region_id)
if result.get('status') == 'success':
web_logger.log_web_action(
action='Удаление региона',
details=f'ID: {region_id}, Название: {region_info.get("region_name") if region_info else "неизвестно"}'
)
return jsonify(result)
@bp_api.route('/regions/<region_id>/subscribers', methods=['GET'])
@login_required
def get_region_subscribers(region_id):
result, status_code = region_manager.get_region_subscribers(region_id)
return jsonify(result), status_code
@bp_api.route('/systems', methods=['GET'])
@login_required
def get_systems():
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 10, type=int)
sort_field = request.args.get('sort_field', 'system_id')
sort_order = request.args.get('sort_order', 'asc')
result = system_manager.get_systems(page, per_page, sort_field, sort_order)
return jsonify(result)
@bp_api.route('/systems', methods=['POST', 'PUT', 'DELETE'])
@login_required
def manage_systems():
if request.method == 'POST':
data = request.get_json()
result, status_code = system_manager.add_system(data)
if status_code == 201:
web_logger.log_web_action(
action='Добавление системы',
details=f'ID: {data.get("system_id")}, Название: {data.get("name")}'
)
return jsonify(result), status_code
elif request.method == 'PUT':
data = request.get_json()
system_info_before = system_manager.get_system(data.get('system_id'))
result, status_code = system_manager.update_system_name(data)
if status_code == 200:
web_logger.log_web_action(
action='Изменение названия системы',
details=f'ID: {data.get("system_id")}, Старое название: {system_info_before.get("name") if system_info_before else "неизвестно"}, Новое название: {data.get("name")}'
)
return jsonify(result), status_code
elif request.method == 'DELETE':
system_id = request.args.get('system_id')
system_info = system_manager.get_system(system_id)
result, status_code = system_manager.delete_system(system_id)
if status_code == 200:
web_logger.log_web_action(
action='Удаление системы',
details=f'ID: {system_id}, Название: {system_info.get("name") if system_info else "неизвестно"}'
)
return jsonify(result), status_code
@bp_api.route('/web_logs', methods=['GET'])
@login_required
def get_web_logs():
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 20, type=int)
ldap_user_id_filter = request.args.get('user_id', None, type=str)
action_filter = request.args.get('action', None, type=str)
logs_data = web_logger.get_web_action_logs(page, per_page, ldap_user_id_filter, action_filter)
return jsonify(logs_data)
#
# @bp_api.route('/systems', methods=['POST'])
# @login_required
# def add_system():
# data = request.get_json()
# result, status_code = system_manager.add_system(data)
# return jsonify(result), status_code
#
# @bp_api.route('/systems', methods=['PUT'])
# @login_required
# def update_system():
# data = request.get_json()
# result, status_code = system_manager.update_system_name(data)
# return jsonify(result), status_code
#
# @bp_api.route('/systems', methods=['DELETE'])
# @login_required
# def delete_system():
# system_id = request.args.get('system_id')
# result, status_code = system_manager.delete_system(system_id)
# return jsonify(result), status_code
@bp_api.route('/debug/log-level', methods=['POST'])
@login_required
def set_log_level():
from telezab import log_manager
try:
data = request.get_json()
component = data.get('component').lower()
level = data.get('level').upper()
success, message = log_manager.change_log_level(component, level)
if success:
return jsonify({'status': 'success', 'message': message}), 200
else:
return jsonify({'status': 'error', 'message': message}), 400
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500
@bp_api.route('/notifications', methods=['POST'])
def notification():
from utilities.notification_manager import NotificationManager
from utilities.telegram_utilities import extract_region_number, format_message
from backend_flask import app
try:
data = request.get_json()
app.logger.info(f"Получены данные уведомления: {data}")
region_id = extract_region_number(data.get("host"))
if region_id is None:
app.logger.error(f"Не удалось извлечь номер региона из host: {data.get('host')}")
return jsonify({"status": "error", "message": "Invalid host format"}), 400
app.logger.debug(f"Извлечён номер региона: {region_id}")
manager = NotificationManager(app.logger)
subscribers = manager.get_subscribers(region_id, data['severity'])
if manager.is_region_active(region_id):
message = format_message(data)
manager.send_notifications(subscribers, message)
return jsonify({"status": "success"}), 200
except Exception as e:
app.logger.error(f"Ошибка при обработке уведомления: {e}")
return jsonify({"status": "error", "message": "Внутренняя ошибка сервера"}), 500