94 lines
3.3 KiB
Python
94 lines
3.3 KiB
Python
"""Сервис для работы с каналами."""
|
||
from typing import List, Optional
|
||
from sqlalchemy import select
|
||
from app.models.channel import Channel, BotChannel
|
||
from app.models.bot import Bot
|
||
from app.db.session import async_session_maker
|
||
|
||
class ChannelService:
|
||
"""Сервис для работы с каналами."""
|
||
|
||
@staticmethod
|
||
async def get_user_channels(user_id: int) -> List[Channel]:
|
||
"""Получает список каналов пользователя."""
|
||
async with async_session_maker() as session:
|
||
stmt = select(Channel).where(Channel.owner_id == user_id)
|
||
result = await session.execute(stmt)
|
||
return list(result.scalars().all())
|
||
|
||
@staticmethod
|
||
async def get_channel(channel_id: int) -> Optional[Channel]:
|
||
"""Получает канал по ID."""
|
||
async with async_session_maker() as session:
|
||
stmt = select(Channel).where(Channel.id == channel_id)
|
||
result = await session.execute(stmt)
|
||
return result.scalars().first()
|
||
|
||
@staticmethod
|
||
async def get_bot_channels(bot_id: int) -> List[Channel]:
|
||
"""Получает список каналов бота."""
|
||
async with async_session_maker() as session:
|
||
stmt = select(Channel).where(Channel.bot_id == bot_id)
|
||
result = await session.execute(stmt)
|
||
return list(result.scalars().all())
|
||
|
||
@staticmethod
|
||
async def add_channel(
|
||
owner_id: int,
|
||
bot_id: int,
|
||
chat_id: int,
|
||
title: Optional[str] = None,
|
||
username: Optional[str] = None
|
||
) -> Channel:
|
||
"""Добавляет новый канал."""
|
||
async with async_session_maker() as session:
|
||
channel = Channel(
|
||
owner_id=owner_id,
|
||
bot_id=bot_id,
|
||
chat_id=chat_id,
|
||
title=title,
|
||
username=username
|
||
)
|
||
session.add(channel)
|
||
await session.commit()
|
||
await session.refresh(channel)
|
||
return channel
|
||
|
||
@staticmethod
|
||
async def update_channel(
|
||
channel_id: int,
|
||
title: Optional[str] = None,
|
||
username: Optional[str] = None
|
||
) -> bool:
|
||
"""Обновляет данные канала."""
|
||
async with async_session_maker() as session:
|
||
stmt = select(Channel).where(Channel.id == channel_id)
|
||
result = await session.execute(stmt)
|
||
channel = result.scalars().first()
|
||
|
||
if not channel:
|
||
return False
|
||
|
||
if title is not None:
|
||
channel.title = title
|
||
if username is not None:
|
||
channel.username = username
|
||
|
||
await session.commit()
|
||
return True
|
||
|
||
@staticmethod
|
||
async def delete_channel(channel_id: int) -> bool:
|
||
"""Удаляет канал."""
|
||
async with async_session_maker() as session:
|
||
stmt = select(Channel).where(Channel.id == channel_id)
|
||
result = await session.execute(stmt)
|
||
channel = result.scalars().first()
|
||
|
||
if not channel:
|
||
return False
|
||
|
||
await session.delete(channel)
|
||
await session.commit()
|
||
return True
|