Files
MessageGateway/app/models/message.py
Sergey Antropov b90def35ed Initial commit: Message Gateway project
- FastAPI приложение для отправки мониторинговых алертов в мессенджеры
- Поддержка Telegram и MAX/VK
- Интеграция с Grafana, Zabbix, AlertManager
- Автоматическое создание тикетов в Jira
- Управление группами мессенджеров через API
- Декораторы для авторизации и скрытия эндпоинтов
- Подробная документация в папке docs/

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-11-12 20:25:11 +03:00

196 lines
11 KiB
Python
Raw Permalink 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.

"""
Модели данных для отправки простых сообщений в Telegram.
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
from typing import Optional
from pydantic import BaseModel, Field
class SendMessageRequest(BaseModel):
"""Запрос на отправку текстового сообщения."""
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts", "devops"])
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123, 456])
text: str = Field(..., description="Текст сообщения", examples=["Привет! Это тестовое сообщение.", "<b>Важное уведомление</b>\n\nСистема работает нормально."])
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown", "MarkdownV2"])
disable_web_page_preview: bool = Field(True, description="Отключить превью ссылок", examples=[True, False])
model_config = {
"json_schema_extra": {
"examples": [
{
"tg_group": "monitoring",
"tg_thread_id": 0,
"text": "Привет! Это тестовое сообщение.",
"parse_mode": "HTML",
"disable_web_page_preview": True
},
{
"tg_group": "alerts",
"tg_thread_id": 123,
"text": "<b>Критическое уведомление</b>\n\nСистема недоступна!\n\n<i>Время: 2024-02-08 16:49:44</i>",
"parse_mode": "HTML",
"disable_web_page_preview": False
},
{
"tg_group": "monitoring",
"tg_thread_id": 0,
"text": "**Важное уведомление**\n\nСистема работает нормально.\n\n[Подробнее](https://example.com)",
"parse_mode": "Markdown",
"disable_web_page_preview": True
}
]
}
}
class SendPhotoRequest(BaseModel):
"""Запрос на отправку фото."""
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"])
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123])
photo: str = Field(..., description="URL фото или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/image.jpg", "https://grafana.example.com/render/dashboard-solo?panelId=1&width=1000&height=500"])
caption: Optional[str] = Field(None, description="Подпись к фото", examples=["График производительности", "<b>График CPU</b>\n\nВремя: 2024-02-08 16:49:44"])
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"])
model_config = {
"json_schema_extra": {
"examples": [
{
"tg_group": "monitoring",
"tg_thread_id": 0,
"photo": "https://example.com/image.jpg",
"caption": "Описание фото",
"parse_mode": "HTML"
},
{
"tg_group": "alerts",
"tg_thread_id": 123,
"photo": "https://grafana.example.com/render/dashboard-solo?panelId=1&width=1000&height=500",
"caption": "<b>График CPU</b>\n\n<i>Время: 2024-02-08 16:49:44</i>",
"parse_mode": "HTML"
}
]
}
}
class SendVideoRequest(BaseModel):
"""Запрос на отправку видео."""
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"])
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123])
video: str = Field(..., description="URL видео или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/video.mp4", "https://example.com/recording.webm"])
caption: Optional[str] = Field(None, description="Подпись к видео", examples=["Запись экрана", "<b>Запись работы системы</b>\n\nДлительность: 60 сек"])
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"])
duration: Optional[int] = Field(None, description="Длительность видео в секундах", examples=[60, 120, 300])
width: Optional[int] = Field(None, description="Ширина видео в пикселях", examples=[1280, 1920])
height: Optional[int] = Field(None, description="Высота видео в пикселях", examples=[720, 1080])
model_config = {
"json_schema_extra": {
"examples": [
{
"tg_group": "monitoring",
"tg_thread_id": 0,
"video": "https://example.com/video.mp4",
"caption": "Описание видео",
"parse_mode": "HTML",
"duration": 60,
"width": 1280,
"height": 720
},
{
"tg_group": "alerts",
"tg_thread_id": 123,
"video": "https://example.com/recording.webm",
"caption": "<b>Запись работы системы</b>\n\n<i>Длительность: 60 сек</i>",
"parse_mode": "HTML",
"duration": 60,
"width": 1920,
"height": 1080
}
]
}
}
class SendAudioRequest(BaseModel):
"""Запрос на отправку аудио."""
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"])
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123])
audio: str = Field(..., description="URL аудио файла или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/audio.mp3", "https://example.com/notification.ogg"])
caption: Optional[str] = Field(None, description="Подпись к аудио", examples=["Аудио уведомление", "<b>Аудио запись</b>\n\nДлительность: 3 мин"])
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"])
duration: Optional[int] = Field(None, description="Длительность аудио в секундах", examples=[180, 300])
performer: Optional[str] = Field(None, description="Исполнитель (для музыкальных файлов)", examples=["Artist Name", "System Notification"])
title: Optional[str] = Field(None, description="Название трека (для музыкальных файлов)", examples=["Song Title", "Alert Notification"])
model_config = {
"json_schema_extra": {
"examples": [
{
"tg_group": "monitoring",
"tg_thread_id": 0,
"audio": "https://example.com/audio.mp3",
"caption": "Описание аудио",
"parse_mode": "HTML",
"duration": 180,
"performer": "Artist Name",
"title": "Song Title"
},
{
"tg_group": "alerts",
"tg_thread_id": 123,
"audio": "https://example.com/notification.ogg",
"caption": "<b>Аудио уведомление</b>\n\n<i>Система работает нормально</i>",
"parse_mode": "HTML",
"duration": 30,
"performer": "System Notification",
"title": "Alert Notification"
}
]
}
}
class SendDocumentRequest(BaseModel):
"""Запрос на отправку документа."""
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"])
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123])
document: str = Field(..., description="URL документа или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/file.pdf", "https://example.com/report.xlsx"])
caption: Optional[str] = Field(None, description="Подпись к документу", examples=["Отчет за неделю", "<b>Отчет</b>\n\nДата: 2024-02-08"])
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"])
filename: Optional[str] = Field(None, description="Имя файла (если не указано, используется имя из URL)", examples=["document.pdf", "report_2024-02-08.xlsx"])
model_config = {
"json_schema_extra": {
"examples": [
{
"tg_group": "monitoring",
"tg_thread_id": 0,
"document": "https://example.com/file.pdf",
"caption": "Описание документа",
"parse_mode": "HTML",
"filename": "document.pdf"
},
{
"tg_group": "alerts",
"tg_thread_id": 123,
"document": "https://example.com/report.xlsx",
"caption": "<b>Отчет за неделю</b>\n\n<i>Дата: 2024-02-08</i>",
"parse_mode": "HTML",
"filename": "report_2024-02-08.xlsx"
},
{
"tg_group": "monitoring",
"tg_thread_id": 0,
"document": "https://example.com/logs.txt",
"caption": "Логи системы",
"parse_mode": "HTML",
"filename": "system_logs_2024-02-08.txt"
}
]
}
}