feat: new endpoints for users and updated models

This commit is contained in:
2025-07-18 02:58:22 +05:00
parent 733977f56e
commit 2e59d03784
10 changed files with 351 additions and 1 deletions

View File

@ -2,6 +2,16 @@ from fastapi import APIRouter, HTTPException, Body, Response
from app.models.user import UserCreate, UserLogin
from app.models.request import ValidateRequest
from app.services.auth import AuthService
from app.db.database import users_collection, sessions_collection
from datetime import datetime
import json
from fastapi import HTTPException
from datetime import datetime, timedelta
from app.models.server.event import PlayerEvent, OnlinePlayersUpdate
from app.models.server.playtime import PlayerSession, PlayerPlaytime
from app.services.coins import CoinsService
coins_service = CoinsService()
router = APIRouter(
tags=["Users"]
@ -45,3 +55,65 @@ async def join_server(request_data: dict = Body(...)):
@router.get("/sessionserver/session/minecraft/hasJoined")
async def has_joined(username: str, serverId: str):
return await AuthService().has_joined(username, serverId)
@router.get("/users/{username}/coins")
async def get_user_coins(username: str):
coins_data = await coins_service.get_player_coins(username)
if not coins_data:
raise HTTPException(status_code=404, detail="User not found")
return coins_data
@router.get("/users")
async def get_users():
"""Получение списка всех пользователей"""
users = await users_collection.find().to_list(1000)
# Исключаем чувствительные данные перед отправкой
safe_users = []
for user in users:
safe_users.append({
"username": user["username"],
"uuid": user["uuid"],
"skin_url": user.get("skin_url"),
"cloak_url": user.get("cloak_url"),
"coins": user.get("coins", 0),
"total_time_played": user.get("total_time_played", 0),
"is_active": user.get("is_active", True)
})
return {"users": safe_users, "count": len(safe_users)}
@router.get("/users/{uuid}")
async def get_user_by_uuid(uuid: str):
"""Получение пользователя по UUID"""
user = await users_collection.find_one({"uuid": uuid})
if not user:
# Пробуем разные форматы UUID
if '-' in uuid:
user = await users_collection.find_one({"uuid": uuid.replace('-', '')})
else:
formatted_uuid = f"{uuid[:8]}-{uuid[8:12]}-{uuid[12:16]}-{uuid[16:20]}-{uuid[20:]}"
user = await users_collection.find_one({"uuid": formatted_uuid})
if not user:
raise HTTPException(status_code=404, detail="User not found")
# Исключаем чувствительные данные
safe_user = {
"username": user["username"],
"uuid": user["uuid"],
"skin_url": user.get("skin_url"),
"cloak_url": user.get("cloak_url"),
"coins": user.get("coins", 0),
"total_time_played": user.get("total_time_played", 0),
"is_active": user.get("is_active", True),
"created_at": user.get("created_at")
}
if "total_time_played" in safe_user:
total_time = safe_user["total_time_played"]
hours, remainder = divmod(total_time, 3600)
minutes, seconds = divmod(remainder, 60)
safe_user["total_time_formatted"] = f"{hours}ч {minutes}м {seconds}с"
return safe_user