refactoring
This commit is contained in:
82
app/services/skin.py
Normal file
82
app/services/skin.py
Normal file
@ -0,0 +1,82 @@
|
||||
from fastapi import HTTPException, UploadFile
|
||||
from datetime import datetime
|
||||
from app.db.database import users_collection
|
||||
from app.core.config import FILES_URL
|
||||
|
||||
class SkinService:
|
||||
async def set_skin(self, username: str, skin_file: UploadFile, skin_model: str = "classic"):
|
||||
"""Установка или замена скина через загрузку файла"""
|
||||
# Проверяем тип файла
|
||||
if not skin_file.content_type.startswith('image/'):
|
||||
raise HTTPException(status_code=400, detail="File must be an image")
|
||||
|
||||
# Проверяем размер файла (максимум 2MB)
|
||||
max_size = 2 * 1024 * 1024 # 2MB
|
||||
contents = await skin_file.read()
|
||||
if len(contents) > max_size:
|
||||
raise HTTPException(status_code=400, detail="File too large (max 2MB)")
|
||||
|
||||
# Удаляем старый скин, если есть
|
||||
user = await users_collection.find_one({"username": username})
|
||||
if user and user.get("skin_url"):
|
||||
from urllib.parse import urlparse
|
||||
import os
|
||||
old_url = user["skin_url"]
|
||||
# Получаем имя файла из url
|
||||
old_filename = os.path.basename(urlparse(old_url).path)
|
||||
old_path = os.path.join("app/static/skins", old_filename)
|
||||
print(f"Trying to delete old skin at: {old_path}")
|
||||
if os.path.exists(old_path):
|
||||
try:
|
||||
os.remove(old_path)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Создаем папку для скинов, если ее нет
|
||||
from pathlib import Path
|
||||
skin_dir = Path("app/static/skins")
|
||||
skin_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Генерируем имя файла
|
||||
skin_filename = f"{username}_{int(datetime.now().timestamp())}.png"
|
||||
skin_path = skin_dir / skin_filename
|
||||
|
||||
# Сохраняем файл
|
||||
with open(skin_path, "wb") as f:
|
||||
f.write(contents)
|
||||
|
||||
# Обновляем запись пользователя
|
||||
result = await users_collection.update_one(
|
||||
{"username": username},
|
||||
{"$set": {
|
||||
"skin_url": f"{FILES_URL}/skins/{skin_filename}",
|
||||
"skin_model": skin_model
|
||||
}}
|
||||
)
|
||||
|
||||
if result.modified_count == 0:
|
||||
raise HTTPException(status_code=404, detail="User not found")
|
||||
return {"status": "success"}
|
||||
|
||||
async def remove_skin(self, username: str):
|
||||
"""Удаление скина"""
|
||||
user = await users_collection.find_one({"username": username})
|
||||
if not user:
|
||||
raise HTTPException(status_code=404, detail="User not found")
|
||||
|
||||
# Удаляем файл скина, если он существует
|
||||
if user.get("skin_url") and user["skin_url"].startswith("/skins/"):
|
||||
import os
|
||||
try:
|
||||
os.remove(f"skins/{user['skin_url'].split('/')[-1]}")
|
||||
except:
|
||||
pass
|
||||
|
||||
result = await users_collection.update_one(
|
||||
{"username": username},
|
||||
{"$unset": {
|
||||
"skin_url": "",
|
||||
"skin_model": ""
|
||||
}}
|
||||
)
|
||||
return {"status": "success"}
|
Reference in New Issue
Block a user