"""Celery sync tasks for Slack users/channels.""" from celery.utils.log import get_task_logger from sqlmodel import Session from app.celery_app import celery_app from app.core.db import get_engine from app.managers.sync import sync_channel_list, sync_user_list from app.managers.team import get_all_teams logger = get_task_logger(__name__) @celery_app.task( name="app.tasks.sync.sync_slack_users_task", autoretry_for=(Exception,), retry_backoff=True, retry_jitter=True, max_retries=3, ) def sync_slack_users_task(team_name: str) -> None: logger.info("[%s] User sync started", team_name) try: engine = get_engine() with Session(engine) as session: sync_user_list(session, team_name) logger.info("[%s] User sync finished", team_name) except Exception as e: logger.exception("[%s] User sync failed: %s", team_name, e) raise @celery_app.task( name="app.tasks.sync.sync_slack_channels_task", autoretry_for=(Exception,), retry_backoff=True, retry_jitter=True, max_retries=3, ) def sync_slack_channels_task(team_name: str) -> None: logger.info("[%s] Channel sync started", team_name) try: engine = get_engine() with Session(engine) as session: sync_channel_list(session, team_name) logger.info("[%s] Channel sync finished", team_name) except Exception as e: logger.exception("[%s] Channel sync failed: %s", team_name, e) raise @celery_app.task(name="app.tasks.sync.run_sync_for_all_teams_task") def run_sync_for_all_teams_task() -> None: logger.info("Scheduled sync started: fetching team list") engine = get_engine() with Session(engine) as session: teams = get_all_teams(session) if not teams: logger.warning("No teams found, sync skipped") return logger.info("Dispatching sync tasks for %d team(s): %s", len(teams), [t.team_name for t in teams]) for team in teams: sync_slack_users_task.delay(team.team_name) sync_slack_channels_task.delay(team.team_name) logger.info("All sync tasks dispatched")