Source code for app.services.task_service

"""Public entry point for task operations.

``TaskService`` composes three focused mixins (see :mod:`app.services.task`)
so its read, write and points-by-task concerns live in separate modules
without changing the single DI-injected class that endpoints depend on:

* :class:`TaskQueryMixin` - read-only task lookups and listings.
* :class:`TaskMutationMixin` - the create/patch/delete/duplicate write path.
* :class:`TaskPointsMixin` - points-by-task read queries.
"""

from typing import Optional

from app.repository.game_params_repository import GameParamsRepository
from app.repository.game_repository import GameRepository
from app.repository.task_params_repository import TaskParamsRepository
from app.repository.task_repository import TaskRepository
from app.repository.user_points_repository import UserPointsRepository
from app.repository.user_repository import UserRepository
from app.services.base_service import BaseService
from app.services.strategy_definition_service import StrategyDefinitionService
from app.services.strategy_service import StrategyService
from app.services.task import TaskMutationMixin, TaskPointsMixin, TaskQueryMixin


[docs] class TaskService( BaseService, TaskQueryMixin, TaskMutationMixin, TaskPointsMixin, ): """ Service class for managing tasks. Attributes: strategy_service (StrategyService): Service instance for strategies. task_repository (TaskRepository): Repository instance for tasks. game_repository (GameRepository): Repository instance for games. user_repository (UserRepository): Repository instance for users. user_points_repository (UserPointsRepository): Repository instance for user points. game_params_repository (GameParamsRepository): Repository instance for game parameters. task_params_repository (TaskParamsRepository): Repository instance for task parameters. """
[docs] def __init__( self, strategy_service: StrategyService, task_repository: TaskRepository, game_repository: GameRepository, user_repository: UserRepository, user_points_repository: UserPointsRepository, game_params_repository: GameParamsRepository, task_params_repository: TaskParamsRepository, strategy_definition_service: Optional[StrategyDefinitionService] = None, ) -> None: """ Initializes the TaskService with the provided repositories and services. ``strategy_definition_service`` is optional so existing call sites and tests that don't exercise ``custom:`` strategyIds keep working. Required for :meth:`patch_task_by_id` to validate ``custom:`` ids against the persistent registry. """ self.strategy_service = strategy_service self.task_repository = task_repository self.game_repository = game_repository self.user_repository = user_repository self.user_points_repository = user_points_repository self.game_params_repository = game_params_repository self.task_params_repository = task_params_repository self.strategy_definition_service = strategy_definition_service super().__init__(task_repository)