From f720b51c602db0920f4f5c44d892db103c827e8e Mon Sep 17 00:00:00 2001 From: DIKER0K Date: Sun, 7 Dec 2025 14:52:40 +0500 Subject: [PATCH] add endpoint create bonus --- app/api/bonuses.py | 8 +++++++- app/models/bonus.py | 11 +++++++++++ app/services/bonus.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/app/api/bonuses.py b/app/api/bonuses.py index 6ee9387..dbd909f 100644 --- a/app/api/bonuses.py +++ b/app/api/bonuses.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Query, Body from fastapi import HTTPException from datetime import datetime, timedelta -from app.models.bonus import PurchaseBonus +from app.models.bonus import CreateBonusType, PurchaseBonus import uuid router = APIRouter( @@ -9,6 +9,12 @@ router = APIRouter( tags=["Bonuses"] ) +@router.post("/create") +async def create_bonus_type(bonus: CreateBonusType): + """Создание нового типа бонуса (админ)""" + from app.services.bonus import BonusService + return await BonusService().create_bonus_type(bonus) + @router.get("/effects") async def get_user_effects(username: str): """Получить активные эффекты пользователя для плагина""" diff --git a/app/models/bonus.py b/app/models/bonus.py index f4987e1..e44a9f0 100644 --- a/app/models/bonus.py +++ b/app/models/bonus.py @@ -2,6 +2,17 @@ from pydantic import BaseModel from typing import Optional, List from datetime import datetime +class CreateBonusType(BaseModel): + name: str + description: str + effect_type: str + base_effect_value: float + effect_increment: float + price: int + upgrade_price: int + duration: int # в секундах + max_level: int = 0 + class PurchaseBonus(BaseModel): username: str bonus_type_id: str diff --git a/app/services/bonus.py b/app/services/bonus.py index 3d77899..efd5715 100644 --- a/app/services/bonus.py +++ b/app/services/bonus.py @@ -10,6 +10,37 @@ bonus_types_collection = db.bonus_types user_bonuses_collection = db.user_bonuses class BonusService: + + async def create_bonus_type(self, bonus_data): + """Создание нового типа бонуса""" + bonus_id = str(uuid.uuid4()) + + bonus = { + "id": bonus_id, + "name": bonus_data.name, + "description": bonus_data.description, + "effect_type": bonus_data.effect_type, + "base_effect_value": bonus_data.base_effect_value, + "effect_increment": bonus_data.effect_increment, + "price": bonus_data.price, + "upgrade_price": bonus_data.upgrade_price, + "duration": bonus_data.duration, + "max_level": bonus_data.max_level + } + + # Проверка на дубликат имени + existing = await bonus_types_collection.find_one({"name": bonus_data.name}) + if existing: + raise HTTPException(status_code=400, detail="Бонус с таким именем уже существует") + + await bonus_types_collection.insert_one(bonus) + + return { + "status": "success", + "message": "Тип бонуса успешно создан", + "bonus_id": bonus_id + } + async def get_user_active_effects(self, username: str): """Получить активные эффекты пользователя для плагина""" from app.db.database import users_collection