This commit is contained in:
2026-03-01 01:03:00 +03:00
parent 29504c5502
commit b8a5569ab9
9 changed files with 373 additions and 15 deletions
@@ -36,6 +36,30 @@ class ResidentsDAO:
result = await self.session.execute(select(Resident))
return list(result.scalars().all())
async def search_by_room_number(self, room_number: int) -> list[Resident]:
from dutylog.infrastructure.database.models.room import Room
result = await self.session.execute(
select(Resident)
.join(Room, Resident.room == Room.id)
.where(Room.number == room_number)
)
return list(result.scalars().all())
async def search_by_name(self, query: str) -> list[Resident]:
result = await self.session.execute(
select(Resident).where(Resident.real_name.ilike(f"%{query}%"))
)
return list(result.scalars().all())
async def get_busy_residents_with_users(self) -> list[tuple[Resident, int]]:
result = await self.session.execute(
select(Resident)
.where(Resident.is_busy == True)
.where(Resident.user_entity.is_not(None))
)
residents = result.scalars().all()
return [(r, r.user_entity) for r in residents if r.user_entity]
async def create(self, resident: Resident) -> Resident:
self.session.add(resident)
await self.session.commit()
@@ -74,5 +74,32 @@ class ResidentsRepository:
async def get_all_residents(self) -> list[Resident]:
return await self.residents_dao.get_all()
async def search_residents(
self, query: str, users_repository
) -> tuple[list[Resident], str]:
if query.isdigit():
room_number = int(query)
residents = await self.residents_dao.search_by_room_number(room_number)
if residents:
return residents, f"комнате {room_number}"
residents = await self.residents_dao.search_by_name(query)
if residents:
return residents, f"имени '{query}'"
busy_residents_data = await self.residents_dao.get_busy_residents_with_users()
matched_residents = []
for resident, user_id in busy_residents_data:
user = await users_repository.get_user_by_id(user_id)
if user and user.username:
if query.lower() in user.username.lower():
matched_residents.append(resident)
if matched_residents:
return matched_residents, f"username '@{query}'"
return [], query
async def delete_resident(self, resident_id: int) -> None:
await self.residents_dao.delete(resident_id)