diff --git a/api/main.py b/api/main.py index 31189984..83a052ed 100644 --- a/api/main.py +++ b/api/main.py @@ -1,15 +1,14 @@ from fastapi import FastAPI -from api.routes import users, keys, coupons, servers, tariffs, gifts, referrals, misc +from api.routes import coupons, gifts, keys, misc, referrals, servers, settings, tariffs, users app = FastAPI( title="SoloBot API (preAlpha)", - version="0.2.0", - docs_url="/api/docs", - redoc_url="/api/redoc", - openapi_url="/api/openapi.json" + version="0.3.0", + docs_url="/api/docs", + redoc_url="/api/redoc", + openapi_url="/api/openapi.json", ) - app.include_router(users.router, prefix="/api/users", tags=["Users"]) app.include_router(keys.router, prefix="/api/keys", tags=["Keys"]) app.include_router(coupons.router, prefix="/api/coupons", tags=["Coupons"]) @@ -17,6 +16,7 @@ app.include_router(servers.router, prefix="/api/servers", tags=["Servers"]) app.include_router(tariffs.router, prefix="/api/tariffs", tags=["Tariffs"]) app.include_router(gifts.router, prefix="/api/gifts", tags=["Gifts"]) app.include_router(referrals.router, prefix="/api/referrals", tags=["Referrals"]) +app.include_router(settings.router, prefix="/api/settings", tags=["Settings"]) app.include_router(misc.router, prefix="/api") diff --git a/api/routes/settings.py b/api/routes/settings.py new file mode 100644 index 00000000..94616134 --- /dev/null +++ b/api/routes/settings.py @@ -0,0 +1,66 @@ +from fastapi import APIRouter, Depends, HTTPException, Query +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from api.depends import get_session, verify_admin_token +from api.schemas.settings import SettingResponse, SettingUpsert +from database.models import Setting +from database.settings import set_setting + + +router = APIRouter() + + +@router.get("/", response_model=list[SettingResponse]) +async def get_all_settings( + admin=Depends(verify_admin_token), + session: AsyncSession = Depends(get_session), +): + result = await session.execute(select(Setting)) + return result.scalars().all() + + +@router.get("/{key}", response_model=SettingResponse) +async def get_setting_by_key( + key: str, + admin=Depends(verify_admin_token), + session: AsyncSession = Depends(get_session), +): + result = await session.execute(select(Setting).where(Setting.key == key)) + obj = result.scalar_one_or_none() + if not obj: + raise HTTPException(status_code=404, detail="Setting not found") + return obj + + +@router.post("/{key}", response_model=SettingResponse) +async def upsert_setting( + key: str, + payload: SettingUpsert, + admin=Depends(verify_admin_token), + session: AsyncSession = Depends(get_session), +): + obj = await set_setting( + session=session, + key=key, + value=payload.value, + description=payload.description, + ) + await session.commit() + await session.refresh(obj) + return obj + + +@router.delete("/{key}", response_model=dict) +async def delete_setting( + key: str, + admin=Depends(verify_admin_token), + session: AsyncSession = Depends(get_session), +): + result = await session.execute(select(Setting).where(Setting.key == key)) + obj = result.scalar_one_or_none() + if not obj: + raise HTTPException(status_code=404, detail="Setting not found") + await session.delete(obj) + await session.commit() + return {"detail": "Setting deleted"} diff --git a/api/schemas/__init__.py b/api/schemas/__init__.py index 41ae1020..dabb5fbc 100644 --- a/api/schemas/__init__.py +++ b/api/schemas/__init__.py @@ -1,6 +1,7 @@ from .coupons import CouponBase, CouponResponse, CouponUpdate, CouponUsageResponse from .gifts import GiftBase, GiftResponse, GiftUpdate, GiftUsageResponse from .keys import KeyDetailsResponse, KeyResponse +from .settings import SettingResponse, SettingUpsert from .misc import ( BlockedUserResponse, ManualBanResponse, diff --git a/api/schemas/settings.py b/api/schemas/settings.py new file mode 100644 index 00000000..e41d1cd0 --- /dev/null +++ b/api/schemas/settings.py @@ -0,0 +1,20 @@ +from datetime import datetime +from typing import Any + +from pydantic import BaseModel + + +class SettingUpsert(BaseModel): + value: Any | None = None + description: str | None = None + + +class SettingResponse(BaseModel): + key: str + value: Any | None = None + description: str | None = None + created_at: datetime | None = None + updated_at: datetime | None = None + + class Config: + from_attributes = True diff --git a/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so b/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so index 4431cc14..28493a3c 100644 Binary files a/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so and b/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so differ