Add Personal account
This commit is contained in:
126
backend/main.py
126
backend/main.py
@@ -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)):
|
||||
|
||||
Reference in New Issue
Block a user