Universal Git Analyzer V16 OOP final

This commit is contained in:
2026-05-26 10:23:22 +03:00
commit b94ce5089d
14 changed files with 1392 additions and 0 deletions

122
storage.py Normal file
View File

@@ -0,0 +1,122 @@
import json
import os
import hashlib
class UserProfile:
"""Объект пользователя системы.
Хранит логин, хэш пароля и список сохранённых репозиториев.
Используется как логическая модель для диаграммы классов.
"""
def __init__(self, login, password_hash="", repositories=None):
self.login = login
self.password_hash = password_hash
self.repositories = repositories or []
def to_dict(self):
return {
"password": self.password_hash,
"repositories": self.repositories,
}
class StorageManager:
"""Класс локального хранилища.
Отвечает за регистрацию, вход, сохранение и удаление ссылок.
Данные хранятся в JSON-файле рядом с программой.
"""
def __init__(self, data_file="users_data.json"):
self.data_file = data_file
def _load(self):
if not os.path.exists(self.data_file):
return {"users": {}}
try:
with open(self.data_file, "r", encoding="utf-8") as f:
return json.load(f)
except Exception:
return {"users": {}}
def _save(self, data):
with open(self.data_file, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def _hash_password(self, password):
return hashlib.sha256(password.encode("utf-8")).hexdigest()
def register_user(self, login, password):
data = self._load()
if login in data["users"]:
return False, "Такой пользователь уже существует"
user = UserProfile(
login=login,
password_hash=self._hash_password(password),
repositories=[],
)
data["users"][login] = user.to_dict()
self._save(data)
return True, "Профиль создан"
def check_user(self, login, password):
data = self._load()
user = data["users"].get(login)
if not user:
return False
return user.get("password") == self._hash_password(password)
def get_repositories(self, login):
data = self._load()
return data["users"].get(login, {}).get("repositories", [])
def add_repository(self, login, link):
data = self._load()
repos = data["users"].setdefault(
login,
{"password": "", "repositories": []},
).setdefault("repositories", [])
if link in repos:
return False
repos.append(link)
self._save(data)
return True
def delete_repository(self, login, link):
data = self._load()
repos = data["users"].get(login, {}).get("repositories", [])
if link in repos:
repos.remove(link)
self._save(data)
return True
return False
# Обратная совместимость: если старый код где-то импортирует функции,
# они всё равно работают через объект StorageManager.
_default_storage = StorageManager()
def register_user(login, password):
return _default_storage.register_user(login, password)
def check_user(login, password):
return _default_storage.check_user(login, password)
def get_repositories(login):
return _default_storage.get_repositories(login)
def add_repository(login, link):
return _default_storage.add_repository(login, link)
def delete_repository(login, link):
return _default_storage.delete_repository(login, link)