This commit is contained in:
2026-02-27 17:30:40 +03:00
parent e9098f7bc1
commit 7385fb09c0
5 changed files with 160 additions and 1 deletions
+2 -1
View File
@@ -10,7 +10,7 @@ from dishka.integrations.aiogram import setup_dishka
from dutylog.application.bot.user_handlers import router as user_router from dutylog.application.bot.user_handlers import router as user_router
from dutylog.application.bot.user_dialogs import main_menu_dialog from dutylog.application.bot.user_dialogs import main_menu_dialog
from dutylog.infrastructure.ioc import ConfigProvider, DatabaseProvider, DAOProvider from dutylog.infrastructure.ioc import ConfigProvider, DatabaseProvider, DAOProvider, RepositoryProvider
from dutylog.infrastructure.utils.config import load_config from dutylog.infrastructure.utils.config import load_config
@@ -29,6 +29,7 @@ async def main():
ConfigProvider(), ConfigProvider(),
DatabaseProvider(), DatabaseProvider(),
DAOProvider(), DAOProvider(),
RepositoryProvider(),
) )
dp.include_router(user_router) dp.include_router(user_router)
@@ -0,0 +1,75 @@
from dutylog.infrastructure.database.dao.hours_transactions_dao import HoursTransactionsDAO
from dutylog.infrastructure.database.dao.users_dao import UsersDAO
from dutylog.infrastructure.database.models.hours_transaction import HoursTransaction, TransactionType
from dutylog.infrastructure.database.models.user import User
class HoursTransactionsRepository:
def __init__(
self,
transactions_dao: HoursTransactionsDAO,
users_dao: UsersDAO,
):
self.transactions_dao = transactions_dao
self.users_dao = users_dao
async def add_hours(
self,
user_id: int,
amount: int,
admin_id: int | None = None,
is_active: bool = True,
) -> tuple[HoursTransaction, User | None]:
transaction = HoursTransaction(
user_id=user_id,
transaction_type=TransactionType.INCREASE.value,
amount=amount,
admin_id=admin_id,
)
transaction = await self.transactions_dao.create(transaction)
user = await self.users_dao.get_by_id(user_id)
if user:
if is_active:
new_hours = user.active_hours + amount
user = await self.users_dao.update(user_id, active_hours=new_hours)
else:
new_hours = user.inactive_hours + amount
user = await self.users_dao.update(user_id, inactive_hours=new_hours)
return transaction, user
async def remove_hours(
self,
user_id: int,
amount: int,
admin_id: int | None = None,
is_active: bool = True,
) -> tuple[HoursTransaction, User | None]:
transaction = HoursTransaction(
user_id=user_id,
transaction_type=TransactionType.DECREASE.value,
amount=amount,
admin_id=admin_id,
)
transaction = await self.transactions_dao.create(transaction)
user = await self.users_dao.get_by_id(user_id)
if user:
if is_active:
new_hours = max(0, user.active_hours - amount)
user = await self.users_dao.update(user_id, active_hours=new_hours)
else:
new_hours = max(0, user.inactive_hours - amount)
user = await self.users_dao.update(user_id, inactive_hours=new_hours)
return transaction, user
async def get_user_history(self, user_id: int) -> list[HoursTransaction]:
return await self.transactions_dao.get_by_user_id(user_id)
async def get_all_transactions(self) -> list[HoursTransaction]:
return await self.transactions_dao.get_all()
async def get_transaction_by_id(self, transaction_id: int) -> HoursTransaction | None:
return await self.transactions_dao.get_by_id(transaction_id)
@@ -0,0 +1,66 @@
from dutylog.infrastructure.database.dao.users_dao import UsersDAO
from dutylog.infrastructure.database.models.user import User
class UsersRepository:
def __init__(self, users_dao: UsersDAO):
self.users_dao = users_dao
async def get_or_create_user(
self,
user_id: int,
username: str | None = None,
first_name: str | None = None,
last_name: str | None = None,
) -> User:
user = await self.users_dao.get_by_id(user_id)
if not user:
user = User(
id=user_id,
username=username,
first_name=first_name,
last_name=last_name,
)
user = await self.users_dao.create(user)
return user
async def update_user_info(
self,
user_id: int,
username: str | None = None,
first_name: str | None = None,
last_name: str | None = None,
) -> User | None:
return await self.users_dao.update(
user_id,
username=username,
first_name=first_name,
last_name=last_name,
)
async def set_admin_status(self, user_id: int, is_admin: bool) -> User | None:
return await self.users_dao.update(user_id, is_admin=is_admin)
async def add_active_hours(self, user_id: int, hours: int) -> User | None:
user = await self.users_dao.get_by_id(user_id)
if user:
new_hours = user.active_hours + hours
return await self.users_dao.update(user_id, active_hours=new_hours)
return None
async def add_inactive_hours(self, user_id: int, hours: int) -> User | None:
user = await self.users_dao.get_by_id(user_id)
if user:
new_hours = user.inactive_hours + hours
return await self.users_dao.update(user_id, inactive_hours=new_hours)
return None
async def get_all_admins(self) -> list[User]:
all_users = await self.users_dao.get_all()
return [user for user in all_users if user.is_admin]
async def get_user_by_id(self, user_id: int) -> User | None:
return await self.users_dao.get_by_id(user_id)
async def get_all_users(self) -> list[User]:
return await self.users_dao.get_all()
+17
View File
@@ -6,6 +6,8 @@ from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker
from dutylog.infrastructure.database.config import create_engine, create_session_maker from dutylog.infrastructure.database.config import create_engine, create_session_maker
from dutylog.infrastructure.database.dao.users_dao import UsersDAO from dutylog.infrastructure.database.dao.users_dao import UsersDAO
from dutylog.infrastructure.database.dao.hours_transactions_dao import HoursTransactionsDAO from dutylog.infrastructure.database.dao.hours_transactions_dao import HoursTransactionsDAO
from dutylog.infrastructure.database.repositories.users_repository import UsersRepository
from dutylog.infrastructure.database.repositories.hours_transactions_repository import HoursTransactionsRepository
from dutylog.infrastructure.utils.config import Config, load_config from dutylog.infrastructure.utils.config import Config, load_config
@@ -42,3 +44,18 @@ class DAOProvider(Provider):
return HoursTransactionsDAO(session) return HoursTransactionsDAO(session)
class RepositoryProvider(Provider):
@provide(scope=Scope.REQUEST)
def get_users_repository(self, users_dao: UsersDAO) -> UsersRepository:
return UsersRepository(users_dao)
@provide(scope=Scope.REQUEST)
def get_hours_transactions_repository(
self,
transactions_dao: HoursTransactionsDAO,
users_dao: UsersDAO,
) -> HoursTransactionsRepository:
return HoursTransactionsRepository(transactions_dao, users_dao)