diff --git a/api/main.py b/api/main.py index 40c300fa..cf4ace22 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.1", + version="0.1.2", docs_url="/api/docs", redoc_url="/api/redoc", openapi_url="/api/openapi.json" diff --git a/api/routes/keys.py b/api/routes/keys.py index 7e403135..d35ce2e0 100644 --- a/api/routes/keys.py +++ b/api/routes/keys.py @@ -2,7 +2,7 @@ from fastapi import Depends, HTTPException, Path from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select -from database.models import Key, Admin +from database.models import Key, Admin, Tariff from api.schemas.keys import KeyBase, KeyResponse, KeyUpdate from api.routes.base_crud import generate_crud_router from api.depends import get_session, verify_admin_token @@ -47,3 +47,23 @@ async def delete_key_by_email( except Exception as e: logger.error(f"[API] Ошибка при удалении ключа: {e}") raise HTTPException(status_code=500, detail="Ошибка при удалении ключа") + + +@router.get("/routers/{tg_id}", response_model=list[KeyResponse]) +async def get_router_keys_by_tg_id( + tg_id: int = Path(..., description="Telegram ID пользователя"), + session: AsyncSession = Depends(get_session), + admin: Admin = Depends(verify_admin_token), +): + tariffs_result = await session.execute( + select(Tariff.id).where(Tariff.group_code == "routers") + ) + tariff_ids = [row[0] for row in tariffs_result.all()] + if not tariff_ids: + return [] + + keys_result = await session.execute( + select(Key).where(Key.tg_id == tg_id, Key.tariff_id.in_(tariff_ids)) + ) + keys = keys_result.scalars().all() + return keys diff --git a/api/routes/misc.py b/api/routes/misc.py index cbd65c08..11e7bd0b 100644 --- a/api/routes/misc.py +++ b/api/routes/misc.py @@ -25,7 +25,8 @@ router.include_router( enabled_methods=["get_all", "get_one", "delete"] ), prefix="/payments", - tags=["Payments"] + tags=["Payments"], + dependencies=[Depends(verify_admin_token)] ) @@ -52,7 +53,8 @@ router.include_router( enabled_methods=["get_all", "get_one", "delete"] ), prefix="/referrals", - tags=["Referrals"] + tags=["Referrals"], + dependencies=[Depends(verify_admin_token)] ) router.include_router( @@ -65,7 +67,8 @@ router.include_router( enabled_methods=["get_all", "get_one", "delete"] ), prefix="/notifications", - tags=["Notifications"] + tags=["Notifications"], + dependencies=[Depends(verify_admin_token)] ) @@ -79,10 +82,10 @@ router.include_router( enabled_methods=["get_all", "get_one", "delete"] ), prefix="/manual-bans", - tags=["Bans"] + tags=["Bans"], + dependencies=[Depends(verify_admin_token)] ) - router.include_router( generate_crud_router( model=BlockedUser, @@ -93,10 +96,10 @@ router.include_router( enabled_methods=["get_all", "get_one", "delete"] ), prefix="/blocked-users", - tags=["Bans"] + tags=["Bans"], + dependencies=[Depends(verify_admin_token)] ) - router.include_router( generate_crud_router( model=TemporaryData, @@ -107,10 +110,10 @@ router.include_router( enabled_methods=["get_all", "get_one", "delete"] ), prefix="/temporary-data", - tags=["TemporaryData"] + tags=["TemporaryData"], + dependencies=[Depends(verify_admin_token)] ) - router.include_router( generate_crud_router( model=TrackingSource, @@ -121,5 +124,6 @@ router.include_router( enabled_methods=["get_all", "get_one", "delete"] ), prefix="/tracking-sources", - tags=["TrackingSources"] + tags=["TrackingSources"], + dependencies=[Depends(verify_admin_token)] ) diff --git a/api/routes/referrals.py b/api/routes/referrals.py index 75ca883e..5c69cc12 100644 --- a/api/routes/referrals.py +++ b/api/routes/referrals.py @@ -1,7 +1,10 @@ -from fastapi import APIRouter +from fastapi import Depends, HTTPException, Query from api.routes.base_crud import generate_crud_router from api.schemas import ReferralResponse -from database.models import Referral +from database.models import Referral, Admin +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, delete +from api.depends import get_session, verify_admin_token router = generate_crud_router( model=Referral, @@ -9,5 +12,26 @@ router = generate_crud_router( schema_create=None, schema_update=None, identifier_field="referrer_tg_id", - enabled_methods=["get_all", "get_one", "delete", "get_all_by_field"] + enabled_methods=["get_all", "get_one", "get_all_by_field"] ) + + +@router.delete("/one") +async def delete_one_referral( + referrer_tg_id: int = Query(..., description="ID пригласившего"), + referred_tg_id: int = Query(..., description="ID приглашённого"), + admin: Admin = Depends(verify_admin_token), + session: AsyncSession = Depends(get_session) +): + result = await session.execute( + select(Referral).where( + Referral.referrer_tg_id == referrer_tg_id, + Referral.referred_tg_id == referred_tg_id + ) + ) + obj = result.scalar_one_or_none() + if not obj: + raise HTTPException(status_code=404, detail="Referral not found") + await session.delete(obj) + await session.commit() + return {"status": "deleted_one"} \ No newline at end of file diff --git a/api/schemas/gifts.py b/api/schemas/gifts.py index e8bdf1a5..d1958c1b 100644 --- a/api/schemas/gifts.py +++ b/api/schemas/gifts.py @@ -6,7 +6,7 @@ from datetime import datetime class GiftBase(BaseModel): sender_tg_id: int recipient_tg_id: Optional[int] = None - selected_months: int + selected_months: Optional[int] = None expiry_time: datetime gift_link: str is_used: bool = False diff --git a/database/models.py b/database/models.py index 60891fa2..df4dec38 100644 --- a/database/models.py +++ b/database/models.py @@ -13,6 +13,7 @@ from sqlalchemy import ( Text, ) import secrets +import uuid from sqlalchemy.orm import Mapped, declarative_base, mapped_column Base = declarative_base() @@ -150,7 +151,7 @@ class Notification(DictLikeMixin, Base): class Gift(DictLikeMixin, Base): __tablename__ = "gifts" - gift_id = Column(String, primary_key=True) + gift_id = Column(String, primary_key=True, default=lambda: uuid.uuid4().hex) sender_tg_id = Column(BigInteger, ForeignKey("users.tg_id")) recipient_tg_id = Column(BigInteger, ForeignKey("users.tg_id"), nullable=True) selected_months = Column(Integer)