Files
RelayOps/backend/app/api/routes/telegram.py
2026-06-07 02:32:28 +03:00

142 lines
4.7 KiB
Python

from fastapi import APIRouter, Depends, status
from sqlalchemy.orm import Session
from app.api.deps import (
get_current_user,
require_telegram_bot_secret,
get_telegram_service,
require_roles,
)
from app.core.config import settings
from app.db.session import get_db
from app.models.user import User
from app.schemas.action import ActionRead
from app.schemas.telegram import (
TelegramCommandIdentity,
TelegramLinkCodeRead,
TelegramLinkCompleteRequest,
TelegramLinkRead,
TelegramRestartRequest,
TelegramServicesCommandRead,
TelegramServicesQuery,
TelegramStatusCommandRead,
TelegramStatusRead,
TelegramTestMessageResponse,
)
from app.services.telegram_service import TelegramService
router = APIRouter()
@router.get("/status", response_model=TelegramStatusRead)
def get_telegram_status(
_: User = Depends(require_roles("admin")),
telegram_service: TelegramService = Depends(get_telegram_service),
db: Session = Depends(get_db),
) -> TelegramStatusRead:
enabled, linked_users_count = telegram_service.get_status_overview(db)
return TelegramStatusRead(
enabled=enabled,
mode=settings.telegram_mode,
linked_users_count=linked_users_count,
)
@router.post("/link", response_model=TelegramLinkCodeRead)
def create_telegram_link_code(
current_user: User = Depends(get_current_user),
telegram_service: TelegramService = Depends(get_telegram_service),
db: Session = Depends(get_db),
) -> TelegramLinkCodeRead:
return telegram_service.issue_link_code(db, current_user)
@router.get("/link/me", response_model=TelegramLinkRead | None)
def get_my_telegram_link(
current_user: User = Depends(get_current_user),
telegram_service: TelegramService = Depends(get_telegram_service),
db: Session = Depends(get_db),
) -> TelegramLinkRead | None:
link = telegram_service.get_link_for_user(db, current_user)
if link is None:
return None
return TelegramLinkRead.model_validate(link)
@router.delete("/link/{link_id}", response_model=TelegramTestMessageResponse)
def delete_telegram_link(
link_id: int,
current_user: User = Depends(get_current_user),
telegram_service: TelegramService = Depends(get_telegram_service),
db: Session = Depends(get_db),
) -> TelegramTestMessageResponse:
telegram_service.unlink(db, link_id, current_user)
return TelegramTestMessageResponse()
@router.post("/test-message", response_model=TelegramTestMessageResponse)
def send_telegram_test_message(
current_user: User = Depends(get_current_user),
telegram_service: TelegramService = Depends(get_telegram_service),
db: Session = Depends(get_db),
) -> TelegramTestMessageResponse:
telegram_service.send_test_message_for_user(db, current_user)
return TelegramTestMessageResponse()
@router.post("/bot/link/complete", response_model=TelegramLinkRead)
def complete_bot_link(
payload: TelegramLinkCompleteRequest,
_: str = Depends(require_telegram_bot_secret),
telegram_service: TelegramService = Depends(get_telegram_service),
db: Session = Depends(get_db),
) -> TelegramLinkRead:
link, _user = telegram_service.complete_link(
db,
link_code=payload.link_code,
telegram_user_id=payload.telegram_user_id,
chat_id=payload.chat_id,
)
return TelegramLinkRead.model_validate(link)
@router.post("/bot/status", response_model=TelegramStatusCommandRead)
def get_bot_status(
payload: TelegramCommandIdentity,
_: str = Depends(require_telegram_bot_secret),
telegram_service: TelegramService = Depends(get_telegram_service),
db: Session = Depends(get_db),
) -> TelegramStatusCommandRead:
return telegram_service.get_status_for_linked_user(db, payload.telegram_user_id)
@router.post("/bot/services", response_model=TelegramServicesCommandRead)
def get_bot_services(
payload: TelegramServicesQuery,
_: str = Depends(require_telegram_bot_secret),
telegram_service: TelegramService = Depends(get_telegram_service),
db: Session = Depends(get_db),
) -> TelegramServicesCommandRead:
return telegram_service.get_services_for_linked_user(
db,
payload.telegram_user_id,
payload.server_name,
)
@router.post("/bot/restart", response_model=ActionRead)
def restart_from_bot(
payload: TelegramRestartRequest,
_: str = Depends(require_telegram_bot_secret),
telegram_service: TelegramService = Depends(get_telegram_service),
db: Session = Depends(get_db),
) -> ActionRead:
action = telegram_service.restart_service_for_linked_user(
db,
telegram_user_id=payload.telegram_user_id,
server_name=payload.server_name,
service_name=payload.service_name,
)
return ActionRead.model_validate(action)