diff --git a/app/api/marketplace.py b/app/api/marketplace.py index 855c737..e48065b 100644 --- a/app/api/marketplace.py +++ b/app/api/marketplace.py @@ -80,3 +80,75 @@ async def update_item_price( """Обновить цену предмета на торговой площадке""" from app.services.marketplace import MarketplaceService return await MarketplaceService().update_item_price(username, item_id, new_price) + +@router.get("/items/by-seller/{username}") +async def get_items_by_seller( + username: str, + server_ip: Optional[str] = None, + page: int = Query(1, ge=1), + limit: int = Query(20, ge=1, le=100) +): + """Получить все товары, выставленные конкретным игроком""" + from app.services.marketplace import MarketplaceService + return await MarketplaceService().list_items_by_seller( + username=username, + server_ip=server_ip, + page=page, + limit=limit + ) + +@router.get("/items/me") +async def get_my_items( + username: str = Query(...), + server_ip: Optional[str] = None, + page: int = Query(1, ge=1), + limit: int = Query(20, ge=1, le=100) +): + """Получить мои лоты на торговой площадке""" + from app.services.marketplace import MarketplaceService + return await MarketplaceService().list_items_by_seller( + username=username, + server_ip=server_ip, + page=page, + limit=limit + ) + +@router.get("/operations/all") +async def get_all_marketplace_operations( + server_ip: Optional[str] = None, + player_name: Optional[str] = None, + status: Optional[str] = None, + op_type: Optional[str] = None, + page: int = Query(1, ge=1), + limit: int = Query(20, ge=1, le=100), +): + """Получить все операции маркетплейса (опционально: по игроку/статусу/типу)""" + from app.services.marketplace import MarketplaceService + return await MarketplaceService().list_operations( + server_ip=server_ip, + player_name=player_name, + status=status, + op_type=op_type, + page=page, + limit=limit + ) + +@router.get("/operations/by-player/{username}") +async def get_operations_by_player( + username: str, + server_ip: Optional[str] = None, + status: Optional[str] = None, + op_type: Optional[str] = None, + page: int = Query(1, ge=1), + limit: int = Query(20, ge=1, le=100), +): + """Получить операции маркетплейса конкретного игрока""" + from app.services.marketplace import MarketplaceService + return await MarketplaceService().list_operations( + server_ip=server_ip, + player_name=username, + status=status, + op_type=op_type, + page=page, + limit=limit + ) \ No newline at end of file diff --git a/app/services/marketplace.py b/app/services/marketplace.py index 81f1c1a..86fc5bc 100644 --- a/app/services/marketplace.py +++ b/app/services/marketplace.py @@ -247,6 +247,42 @@ class MarketplaceService: "operation_id": operation_id, "message": "Предмет снят с продажи и будет возвращен в ваш инвентарь" } + + async def list_items_by_seller( + self, + username: str, + server_ip: str = None, + page: int = 1, + limit: int = 20 + ): + """Получить товары, выставленные конкретным продавцом""" + query = { + "seller_name": username + } + + if server_ip: + query["server_ip"] = server_ip + + total = await marketplace_collection.count_documents(query) + + items_cursor = ( + marketplace_collection + .find(query) + .sort("created_at", -1) + .skip((page - 1) * limit) + .limit(limit) + ) + + items = await items_cursor.to_list(limit) + + serialized_items = [_serialize_mongodb_doc(item) for item in items] + + return { + "items": serialized_items, + "total": total, + "page": page, + "pages": (total + limit - 1) // limit + } async def update_item_price(self, username: str, item_id: str, new_price: int): """Обновить цену предмета на торговой площадке""" @@ -276,3 +312,44 @@ class MarketplaceService: "status": "success", "message": f"Цена предмета обновлена на {new_price} монет" } + + async def list_operations( + self, + server_ip: str = None, + player_name: str = None, + status: str = None, + op_type: str = None, + page: int = 1, + limit: int = 20 + ): + """Получить операции маркетплейса (все или по игроку)""" + query = {} + + if server_ip: + query["server_ip"] = server_ip + if player_name: + query["player_name"] = player_name + if status: + query["status"] = status + if op_type: + query["type"] = op_type + + total = await marketplace_operations.count_documents(query) + + cursor = ( + marketplace_operations + .find(query) + .sort("created_at", -1) + .skip((page - 1) * limit) + .limit(limit) + ) + + ops = await cursor.to_list(limit) + serialized_ops = _serialize_mongodb_doc(ops) + + return { + "operations": serialized_ops, + "total": total, + "page": page, + "pages": (total + limit - 1) // limit + }