Исходный код EJIO.user.repository
## /user/repository.py
from threading import Lock
from typing import Callable, Any
from .model import User
__all__ = [
'UserRepository',
]
[документация]
class UserRepository:
"""
Внутренний репозиторий управления коллекцией пользователей в ОЗУ.
Обеспечивает потокобезопасные CRUD и SQL-подобные операции выборки.
"""
__slots__ = ('_lock', '_storage')
def __init__(self) -> None:
self._lock: Lock = Lock()
# Карта соответствия: {user_id: User_dict}
self._storage: dict[str, dict[str, Any]] = {}
[документация]
def add(self, user: User) -> None:
with self._lock:
self._storage[user.id] = user.to_dict()
[документация]
def get_by_id(self, user_id: str) -> User | None:
with self._lock:
data = self._storage.get(user_id)
return User.from_dict(data) if data else None
[документация]
def get_by_login(self, login: str) -> User | None:
"""Ищет пользователя по уникальному логину (регистронезависимо)."""
with self._lock:
target = login.strip().lower()
for data in self._storage.values():
if data["login"].lower() == target:
return User.from_dict(data)
return None
[документация]
def get_all(self) -> list[User]:
with self._lock:
return [User.from_dict(data) for data in self._storage.values()]
[документация]
def get_all_raw(self) -> list[dict[str, Any]]:
with self._lock:
return [u for u in self._storage.values()]
[документация]
def filter(self, predicate: Callable[[User], bool]) -> list[User]:
"""
Выполняет продвинутую фильтрацию пользователей на основе лямбда-предиката.
Аналог SQL WHERE.
"""
with self._lock:
results = []
for data in self._storage.values():
user_obj = User.from_dict(data)
if predicate(user_obj):
results.append(user_obj)
return results
[документация]
def load_raw_list(self, raw_list: list[dict[str, Any]]) -> None:
"""Быстрая атомарная заливка сырых словарей из файла конфигурации."""
with self._lock:
for data in raw_list:
self._storage[data["id"]] = data
[документация]
def remove(self, user_id: str) -> None:
with self._lock:
if user_id in self._storage:
del self._storage[user_id]
[документация]
def clear(self) -> None:
with self._lock:
self._storage.clear()