142 lines
4.7 KiB
Python
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)
|