"""Dependencies for guilds."""
from __future__ import annotations
from typing import TYPE_CHECKING
from sqlalchemy import select
from sqlalchemy.orm import joinedload, noload, selectinload
from byte_bot.server.domain.db.models import AllowedUsersConfig, ForumConfig, GitHubConfig, Guild, SOTagsConfig
from byte_bot.server.domain.guilds.services import (
AllowedUsersConfigService,
ForumConfigService,
GitHubConfigService,
GuildsService,
SOTagsConfigService,
)
from byte_bot.server.lib import log
if TYPE_CHECKING:
from collections.abc import AsyncGenerator
from sqlalchemy.ext.asyncio import AsyncSession
__all__ = (
"provides_allowed_users_config_service",
"provides_forum_config_service",
"provides_github_config_service",
"provides_guilds_service",
"provides_sotags_config_service",
)
logger = log.get_logger()
[docs]
async def provides_guilds_service(db_session: AsyncSession) -> AsyncGenerator[GuildsService, None]:
"""Construct Guilds-based repository and service objects for the request.
Args:
db_session (AsyncSession): SQLAlchemy AsyncSession
Yields:
GuildsService: GuildConfig-based service
"""
async with GuildsService.new(
session=db_session,
statement=select(Guild)
.order_by(Guild.guild_name)
.options(
selectinload(Guild.github_config).options(
joinedload(GitHubConfig.guild, innerjoin=True).options(noload("*")),
),
selectinload(Guild.sotags_configs).options(
joinedload(SOTagsConfig.guild, innerjoin=True).options(noload("*")),
),
selectinload(Guild.allowed_users).options(
joinedload(AllowedUsersConfig.guild, innerjoin=True).options(noload("*")),
),
selectinload(Guild.forum_config).options(
joinedload(ForumConfig.guild, innerjoin=True).options(noload("*")),
),
),
) as service:
try:
yield service # type: ignore[misc]
finally:
...
[docs]
async def provides_github_config_service(db_session: AsyncSession) -> AsyncGenerator[GitHubConfigService, None]: # type: ignore[misc]
"""Construct GitHubConfig-based repository and service objects for the request.
Args:
db_session (AsyncSession): SQLAlchemy AsyncSession
Yields:
GitHubConfigService: GitHubConfig-based service
"""
async with GuildsService.new(
session=db_session,
statement=select(Guild)
.order_by(Guild.guild_name)
.options(
selectinload(Guild.github_config).options(
joinedload(GitHubConfig.guild, innerjoin=True).options(noload("*")),
),
selectinload(Guild.sotags_configs).options(
joinedload(SOTagsConfig.guild, innerjoin=True).options(noload("*")),
),
selectinload(Guild.allowed_users).options(
joinedload(AllowedUsersConfig.guild, innerjoin=True).options(noload("*")),
),
),
) as service:
try:
yield service # type: ignore[misc]
finally:
...
[docs]
async def provides_allowed_users_config_service(
db_session: AsyncSession,
) -> AsyncGenerator[AllowedUsersConfigService, None]:
"""Construct AllowedUsersConfig-based repository and service objects for the request.
Args:
db_session (AsyncSession): SQLAlchemy AsyncSession
Yields:
AllowedUsersConfigService: AllowedUsersConfig-based service
"""
async with AllowedUsersConfigService.new(
session=db_session,
statement=select(AllowedUsersConfig)
.order_by(AllowedUsersConfig.user_id)
.options(
selectinload(AllowedUsersConfig.guild).options(noload("*")),
),
) as service:
try:
yield service # type: ignore[misc]
finally:
...
[docs]
async def provides_forum_config_service(db_session: AsyncSession) -> AsyncGenerator[ForumConfigService, None]:
"""Construct ForumConfig-based repository and service objects for the request.
Args:
db_session (AsyncSession): SQLAlchemy AsyncSession
Yields:
ForumConfigService: ForumConfig-based service
"""
async with ForumConfigService.new(
session=db_session,
statement=select(ForumConfig)
.order_by(ForumConfig.help_forum)
.options(
selectinload(ForumConfig.guild).options(noload("*")),
),
) as service:
try:
yield service # type: ignore[misc]
finally:
...