Add Personal account

This commit is contained in:
2026-01-14 21:54:24 +06:00
parent db2eddca4b
commit 011996d78d
7 changed files with 1125 additions and 4 deletions

View File

@@ -266,7 +266,7 @@ async def update_user_role(username: str, data: dict, user: dict = Depends(get_c
raise HTTPException(404, "Пользователь не найден")
new_role = data.get("role")
if new_role not in ["admin", "user"]:
if new_role not in ["admin", "user", "support"]:
raise HTTPException(400, "Неверная роль")
users[username]["role"] = new_role
@@ -274,6 +274,130 @@ async def update_user_role(username: str, data: dict, user: dict = Depends(get_c
return {"message": "Роль обновлена"}
# API для личного кабинета
@app.put("/api/profile/username")
async def update_username(data: dict, user: dict = Depends(get_current_user)):
"""Изменить имя пользователя"""
new_username = data.get("new_username", "").strip()
password = data.get("password", "")
if not new_username:
raise HTTPException(400, "Имя пользователя не может быть пустым")
if len(new_username) < 3:
raise HTTPException(400, "Имя пользователя должно быть не менее 3 символов")
users = load_users()
# Проверяем пароль
if not verify_password(password, users[user["username"]]["password"]):
raise HTTPException(400, "Неверный пароль")
# Проверяем, не занято ли новое имя
if new_username in users and new_username != user["username"]:
raise HTTPException(400, "Это имя пользователя уже занято")
# Сохраняем данные пользователя
old_username = user["username"]
user_data = users[old_username]
# Удаляем старую запись и создаём новую
del users[old_username]
user_data["username"] = new_username
users[new_username] = user_data
# Обновляем владельцев серверов
for server_dir in SERVERS_DIR.iterdir():
if server_dir.is_dir():
config = load_server_config(server_dir.name)
if config.get("owner") == old_username:
config["owner"] = new_username
save_server_config(server_dir.name, config)
# Обновляем доступы к серверам у других пользователей
for username, user_info in users.items():
if "servers" in user_info and old_username in user_info.get("servers", []):
user_info["servers"] = [new_username if s == old_username else s for s in user_info["servers"]]
save_users(users)
# Создаём новый токен
new_token = create_access_token({"sub": new_username, "role": user_data["role"]})
return {
"message": "Имя пользователя изменено",
"access_token": new_token,
"username": new_username
}
@app.put("/api/profile/password")
async def update_password(data: dict, user: dict = Depends(get_current_user)):
"""Изменить пароль"""
old_password = data.get("old_password", "")
new_password = data.get("new_password", "")
if not old_password or not new_password:
raise HTTPException(400, "Заполните все поля")
if len(new_password) < 6:
raise HTTPException(400, "Новый пароль должен быть не менее 6 символов")
users = load_users()
# Проверяем старый пароль
if not verify_password(old_password, users[user["username"]]["password"]):
raise HTTPException(400, "Неверный старый пароль")
# Устанавливаем новый пароль
users[user["username"]]["password"] = get_password_hash(new_password)
save_users(users)
return {"message": "Пароль изменён"}
@app.get("/api/profile/stats")
async def get_profile_stats(user: dict = Depends(get_current_user)):
"""Получить статистику профиля"""
users = load_users()
user_data = users.get(user["username"], {})
# Подсчитываем серверы пользователя
owned_servers = []
accessible_servers = []
for server_dir in SERVERS_DIR.iterdir():
if server_dir.is_dir():
config = load_server_config(server_dir.name)
if config.get("owner") == user["username"]:
owned_servers.append({
"name": server_dir.name,
"displayName": config.get("displayName", server_dir.name)
})
elif user["username"] in user_data.get("servers", []) or user["role"] == "admin":
accessible_servers.append({
"name": server_dir.name,
"displayName": config.get("displayName", server_dir.name)
})
# Подсчитываем тикеты
tickets = load_tickets()
user_tickets = [t for t in tickets.values() if t["author"] == user["username"]]
tickets_stats = {
"total": len(user_tickets),
"pending": len([t for t in user_tickets if t["status"] == "pending"]),
"in_progress": len([t for t in user_tickets if t["status"] == "in_progress"]),
"closed": len([t for t in user_tickets if t["status"] == "closed"])
}
return {
"username": user["username"],
"role": user["role"],
"owned_servers": owned_servers,
"accessible_servers": accessible_servers,
"tickets": tickets_stats,
"total_servers": len(owned_servers) + len(accessible_servers)
}
# API для серверов
@app.get("/api/servers")
async def get_servers(user: dict = Depends(get_current_user)):