Files
remnawave-bedolaga-telegram…/app/webapi/routes/ban_notifications.py
c0mrade 9a2aea038a chore: add uv package manager and ruff linter configuration
- Add pyproject.toml with uv and ruff configuration
- Pin Python version to 3.13 via .python-version
- Add Makefile commands: lint, format, fix
- Apply ruff formatting to entire codebase
- Remove unused imports (base64 in yookassa/simple_subscription)
- Update .gitignore for new config files
2026-01-24 17:45:27 +03:00

139 lines
5.7 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.

"""
API эндпоинты для приема уведомлений от ban системы
"""
from __future__ import annotations
import logging
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from app.services.ban_notification_service import ban_notification_service
from app.webapi.dependencies import get_db_session, require_api_token
from app.webapi.schemas.ban_notifications import (
BanNotificationRequest,
BanNotificationResponse,
)
logger = logging.getLogger(__name__)
router = APIRouter()
@router.post(
'/send',
response_model=BanNotificationResponse,
summary='Отправить уведомление от ban системы',
description=(
'Эндпоинт для отправки уведомлений пользователям от системы мониторинга ban. '
'Поддерживает уведомления о блокировке, разблокировке и предупреждения.'
),
)
async def send_ban_notification(
request: BanNotificationRequest,
db: AsyncSession = Depends(get_db_session),
_token=Depends(require_api_token),
) -> BanNotificationResponse:
"""
Отправить уведомление пользователю от ban системы
- **punishment**: Уведомление о блокировке за превышение лимита устройств
- **enabled**: Уведомление о снятии блокировки
- **warning**: Предупреждение пользователю
Требует API ключ в заголовке X-API-Key или Authorization: Bearer <token>
"""
logger.info(
f"Получен запрос на отправку уведомления типа '{request.notification_type}' "
f'для пользователя {request.username} ({request.user_identifier}), '
f'node_name={request.node_name!r}'
)
try:
if request.notification_type == 'punishment':
if request.ip_count is None or request.limit is None or request.ban_minutes is None:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Для типа 'punishment' требуются поля: ip_count, limit, ban_minutes",
)
success, message, telegram_id = await ban_notification_service.send_punishment_notification(
db=db,
user_identifier=request.user_identifier,
username=request.username,
ip_count=request.ip_count,
limit=request.limit,
ban_minutes=request.ban_minutes,
node_name=request.node_name,
)
elif request.notification_type == 'enabled':
success, message, telegram_id = await ban_notification_service.send_enabled_notification(
db=db,
user_identifier=request.user_identifier,
username=request.username,
)
elif request.notification_type == 'warning':
if not request.warning_message:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, detail="Для типа 'warning' требуется поле: warning_message"
)
success, message, telegram_id = await ban_notification_service.send_warning_notification(
db=db,
user_identifier=request.user_identifier,
username=request.username,
warning_message=request.warning_message,
)
elif request.notification_type == 'network_wifi':
if request.ban_minutes is None:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Для типа 'network_wifi' требуется поле: ban_minutes",
)
success, message, telegram_id = await ban_notification_service.send_network_wifi_notification(
db=db,
user_identifier=request.user_identifier,
username=request.username,
ban_minutes=request.ban_minutes,
network_type=request.network_type,
node_name=request.node_name,
)
elif request.notification_type == 'network_mobile':
if request.ban_minutes is None:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Для типа 'network_mobile' требуется поле: ban_minutes",
)
success, message, telegram_id = await ban_notification_service.send_network_mobile_notification(
db=db,
user_identifier=request.user_identifier,
username=request.username,
ban_minutes=request.ban_minutes,
network_type=request.network_type,
node_name=request.node_name,
)
else:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f'Неизвестный тип уведомления: {request.notification_type}',
)
return BanNotificationResponse(success=success, message=message, telegram_id=telegram_id, sent=success)
except HTTPException:
raise
except Exception as e:
logger.exception(f'Ошибка при отправке уведомления: {e}')
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f'Внутренняя ошибка сервера: {e!s}'
)