mirror of
https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot.git
synced 2026-03-02 16:20:49 +00:00
- 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
126 lines
3.9 KiB
Python
126 lines
3.9 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query, Response, Security, status
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.database.crud.welcome_text import (
|
|
count_welcome_texts,
|
|
create_welcome_text,
|
|
delete_welcome_text,
|
|
get_welcome_text_by_id,
|
|
list_welcome_texts,
|
|
update_welcome_text,
|
|
)
|
|
|
|
from ..dependencies import get_db_session, require_api_token
|
|
from ..schemas.welcome_texts import (
|
|
WelcomeTextCreateRequest,
|
|
WelcomeTextListResponse,
|
|
WelcomeTextResponse,
|
|
WelcomeTextUpdateRequest,
|
|
)
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
def _serialize(text) -> WelcomeTextResponse:
|
|
return WelcomeTextResponse(
|
|
id=text.id,
|
|
text=text.text_content,
|
|
is_active=text.is_active,
|
|
is_enabled=text.is_enabled,
|
|
created_by=text.created_by,
|
|
created_at=text.created_at,
|
|
updated_at=text.updated_at,
|
|
)
|
|
|
|
|
|
@router.get('', response_model=WelcomeTextListResponse)
|
|
async def list_welcome_texts_endpoint(
|
|
_: Any = Security(require_api_token),
|
|
db: AsyncSession = Depends(get_db_session),
|
|
limit: int = Query(50, ge=1, le=200),
|
|
offset: int = Query(0, ge=0),
|
|
include_inactive: bool = Query(True, description='Включать неактивные тексты'),
|
|
) -> WelcomeTextListResponse:
|
|
total = await count_welcome_texts(db, include_inactive=include_inactive)
|
|
records = await list_welcome_texts(
|
|
db,
|
|
limit=limit,
|
|
offset=offset,
|
|
include_inactive=include_inactive,
|
|
)
|
|
|
|
return WelcomeTextListResponse(
|
|
items=[_serialize(item) for item in records],
|
|
total=total,
|
|
limit=limit,
|
|
offset=offset,
|
|
)
|
|
|
|
|
|
@router.post('', response_model=WelcomeTextResponse, status_code=status.HTTP_201_CREATED)
|
|
async def create_welcome_text_endpoint(
|
|
payload: WelcomeTextCreateRequest,
|
|
token: Any = Security(require_api_token),
|
|
db: AsyncSession = Depends(get_db_session),
|
|
) -> WelcomeTextResponse:
|
|
created_by = getattr(token, 'id', None)
|
|
record = await create_welcome_text(
|
|
db,
|
|
text_content=payload.text,
|
|
created_by=created_by,
|
|
is_enabled=payload.is_enabled,
|
|
is_active=payload.is_active,
|
|
)
|
|
|
|
return _serialize(record)
|
|
|
|
|
|
@router.get('/{welcome_text_id}', response_model=WelcomeTextResponse)
|
|
async def get_welcome_text_endpoint(
|
|
welcome_text_id: int,
|
|
_: Any = Security(require_api_token),
|
|
db: AsyncSession = Depends(get_db_session),
|
|
) -> WelcomeTextResponse:
|
|
record = await get_welcome_text_by_id(db, welcome_text_id)
|
|
if not record:
|
|
raise HTTPException(status.HTTP_404_NOT_FOUND, 'Welcome text not found')
|
|
|
|
return _serialize(record)
|
|
|
|
|
|
@router.patch('/{welcome_text_id}', response_model=WelcomeTextResponse)
|
|
async def update_welcome_text_endpoint(
|
|
welcome_text_id: int,
|
|
payload: WelcomeTextUpdateRequest,
|
|
_: Any = Security(require_api_token),
|
|
db: AsyncSession = Depends(get_db_session),
|
|
) -> WelcomeTextResponse:
|
|
record = await get_welcome_text_by_id(db, welcome_text_id)
|
|
if not record:
|
|
raise HTTPException(status.HTTP_404_NOT_FOUND, 'Welcome text not found')
|
|
|
|
update_payload = payload.dict(exclude_unset=True)
|
|
if 'text' in update_payload:
|
|
update_payload['text_content'] = update_payload.pop('text')
|
|
updated = await update_welcome_text(db, record, **update_payload)
|
|
return _serialize(updated)
|
|
|
|
|
|
@router.delete('/{welcome_text_id}', status_code=status.HTTP_204_NO_CONTENT)
|
|
async def delete_welcome_text_endpoint(
|
|
welcome_text_id: int,
|
|
_: Any = Security(require_api_token),
|
|
db: AsyncSession = Depends(get_db_session),
|
|
) -> Response:
|
|
record = await get_welcome_text_by_id(db, welcome_text_id)
|
|
if not record:
|
|
raise HTTPException(status.HTTP_404_NOT_FOUND, 'Welcome text not found')
|
|
|
|
await delete_welcome_text(db, record)
|
|
return Response(status_code=status.HTTP_204_NO_CONTENT)
|