Universal Git Analyzer V16 OOP final
This commit is contained in:
122
storage.py
Normal file
122
storage.py
Normal 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)
|
||||
Reference in New Issue
Block a user