From 58cda2e5ffdf8db6abcba68faee13cf1e92fb6e5 Mon Sep 17 00:00:00 2001 From: Vladless Date: Sun, 22 Jun 2025 21:10:56 +0300 Subject: [PATCH] add get_all_by_field method --- api/main.py | 2 +- api/routes/base_crud.py | 15 +++++++++++++++ api/routes/gifts.py | 22 +++++++++++++++++++--- api/routes/keys.py | 2 +- api/routes/misc.py | 21 +++++++++++++++++++-- api/routes/referrals.py | 4 ++-- api/schemas/servers.py | 2 +- 7 files changed, 58 insertions(+), 10 deletions(-) diff --git a/api/main.py b/api/main.py index 21d15e7e..40c300fa 100644 --- a/api/main.py +++ b/api/main.py @@ -3,7 +3,7 @@ from api.routes import users, keys, coupons, servers, tariffs, gifts, referrals, app = FastAPI( title="SoloBot API (preAlpha)", - version="0.1", + version="0.1.1", docs_url="/api/docs", redoc_url="/api/redoc", openapi_url="/api/openapi.json" diff --git a/api/routes/base_crud.py b/api/routes/base_crud.py index 4e574ed2..d4a133e4 100644 --- a/api/routes/base_crud.py +++ b/api/routes/base_crud.py @@ -65,6 +65,21 @@ def generate_crud_router( raise HTTPException(status_code=404, detail=f"{model.__name__} not found") return obj + if "get_all_by_field" in enabled_methods: + @router.get(f"/all/{{{parameter_name}}}", response_model=list[schema_response]) + async def get_all_by_field( + value: Union[int, str] = Path(..., alias=parameter_name), + admin: Admin = Depends(verify_admin_token), + session: AsyncSession = Depends(get_session), + ): + field = getattr(model, identifier_field) + casted = _cast_identifier_type(field, value) + result = await session.execute(select(model).where(field == casted)) + objs = result.scalars().all() + if not objs: + raise HTTPException(status_code=404, detail=f"{model.__name__} not found") + return objs + if "create" in enabled_methods: @router.post("/", response_model=schema_response) async def create( diff --git a/api/routes/gifts.py b/api/routes/gifts.py index 6dc3ecbd..a55e07db 100644 --- a/api/routes/gifts.py +++ b/api/routes/gifts.py @@ -1,7 +1,11 @@ -from fastapi import APIRouter +from fastapi import APIRouter, Depends, Path, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select + from api.routes.base_crud import generate_crud_router from api.schemas import GiftBase, GiftResponse, GiftUpdate, GiftUsageResponse -from database.models import Gift, GiftUsage +from database.models import Gift, GiftUsage, Admin +from api.depends import get_session, verify_admin_token router = APIRouter() @@ -18,6 +22,19 @@ gift_router = generate_crud_router( router.include_router(gift_router, prefix="", tags=["Gifts"]) +@router.get("/by_tg_id/{tg_id}", response_model=list[GiftResponse], tags=["Gifts"]) +async def get_gifts_by_tg_id( + tg_id: int = Path(...), + admin: Admin = Depends(verify_admin_token), + session: AsyncSession = Depends(get_session), +): + result = await session.execute(select(Gift).where(Gift.sender_tg_id == tg_id)) + gifts = result.scalars().all() + if not gifts: + raise HTTPException(status_code=404, detail="Gifts not found") + return gifts + + gift_usage_router = generate_crud_router( model=GiftUsage, schema_response=GiftUsageResponse, @@ -28,4 +45,3 @@ gift_usage_router = generate_crud_router( ) router.include_router(gift_usage_router, prefix="/usages", tags=["GiftUsages"]) router.include_router(gift_usage_router, prefix="/usages", tags=["Gifts"]) - diff --git a/api/routes/keys.py b/api/routes/keys.py index 6c7e1222..7e403135 100644 --- a/api/routes/keys.py +++ b/api/routes/keys.py @@ -16,7 +16,7 @@ router = generate_crud_router( schema_update=KeyUpdate, identifier_field="tg_id", extra_get_by_email=True, - enabled_methods=["get_all", "get_one", "get_by_email"] + enabled_methods=["get_all", "get_one", "get_by_email", "get_all_by_field"] ) diff --git a/api/routes/misc.py b/api/routes/misc.py index 8b6b3cfd..cbd65c08 100644 --- a/api/routes/misc.py +++ b/api/routes/misc.py @@ -1,9 +1,12 @@ -from fastapi import APIRouter +from fastapi import APIRouter, Path, HTTPException, Depends +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select from api.routes.base_crud import generate_crud_router from database.models import ( Payment, Referral, Notification, - ManualBan, TemporaryData, BlockedUser, TrackingSource + ManualBan, TemporaryData, BlockedUser, TrackingSource, Admin ) +from api.depends import get_session, verify_admin_token from api.schemas import ( PaymentResponse, ReferralResponse, NotificationResponse, ManualBanResponse, TemporaryDataResponse, BlockedUserResponse, @@ -25,6 +28,20 @@ router.include_router( tags=["Payments"] ) + +@router.get("/payments/by_tg_id/{tg_id}", response_model=list[PaymentResponse], tags=["Payments"]) +async def get_payments_by_tg_id( + tg_id: int = Path(...), + admin: Admin = Depends(verify_admin_token), + session: AsyncSession = Depends(get_session), +): + result = await session.execute(select(Payment).where(Payment.tg_id == tg_id)) + payments = result.scalars().all() + if not payments: + raise HTTPException(status_code=404, detail="Payments not found") + return payments + + router.include_router( generate_crud_router( model=Referral, diff --git a/api/routes/referrals.py b/api/routes/referrals.py index 59b24c4d..75ca883e 100644 --- a/api/routes/referrals.py +++ b/api/routes/referrals.py @@ -8,6 +8,6 @@ router = generate_crud_router( schema_response=ReferralResponse, schema_create=None, schema_update=None, - identifier_field="referred_tg_id", - enabled_methods=["get_all", "get_one", "delete"] + identifier_field="referrer_tg_id", + enabled_methods=["get_all", "get_one", "delete", "get_all_by_field"] ) diff --git a/api/schemas/servers.py b/api/schemas/servers.py index 85f24173..e4065208 100644 --- a/api/schemas/servers.py +++ b/api/schemas/servers.py @@ -10,7 +10,7 @@ class ServerBase(BaseModel): inbound_id: str panel_type: str max_keys: Optional[int] = None - tariff_group: str + tariff_group: Optional[str] = "" enabled: bool = True