from enum import StrEnum class LegacyQueryName(StrEnum): PROJECTS = "projects" class LegacyResponseKey(StrEnum): STATUS = "status" COLUMNS = "columns" ROWS = "rows" ROW_COUNT = "row_count" DRY_RUN = "dry_run" CREATED = "created" UPDATED = "updated" SKIPPED = "skipped" ITEMS = "items" ACTION = "action" REASON = "reason" SOURCE = "source" PROJECT = "project" SYNC_RUN_CODE = "sync_run_code" SOURCE_QUERY = "source_query" FIELD_MAP = "field_map" LIMIT = "limit" class LegacyProjectField(StrEnum): ID = "id" CODE = "code" EXTERNAL_ID = "external_id" SOURCE_SYSTEM = "source_system" NAME = "name" OWNER = "owner" STATUS = "status" PROGRESS = "progress" PROGRESS_PERCENT = "progress_percent" START_DATE = "start_date" DUE_DATE = "due_date" BUDGET = "budget" BUDGET_AMOUNT = "budget_amount" ACTUAL_COST = "actual_cost" ACTUAL_AMOUNT = "actual_amount" DESCRIPTION = "description" class LegacySyncAction(StrEnum): CREATE = "create" UPDATE = "update" SKIPPED = "skipped" ALLOWLISTED_INLINE_SQL = "allowlisted_inline_sql" class LegacyQueryError(StrEnum): DATABASE_NOT_CONFIGURED = "LEGACY_DATABASE_URL is not configured" QUERY_NOT_ALLOWED = "Legacy query is not in the configured allowlist" PROJECT_QUERY_NOT_CONFIGURED = "LEGACY_PROJECT_QUERY is not configured. Configure it first." ONLY_SELECT_ALLOWED = "Only SELECT statements are allowed" FORBIDDEN_SQL_TOKEN = "Forbidden SQL token in readonly query" INVALID_LIMIT = "Invalid readonly query limit" APP_DB_UNAVAILABLE = "Application database session is not available" LEGACY_SYNC_RUN_CODE_PREFIX = "SYNC-PROJECTS" LEGACY_PROJECT_QUERY_SOURCE = "LEGACY_PROJECT_QUERY" LEGACY_SYNC_MISSING_ID_REASON = "missing external_id/code" LEGACY_PROJECT_SYNC_NOTE = "Project sync from readonly legacy MySQL" LEGACY_MYSQL_CONNECTION_FAILED_TEMPLATE = "MySQL connection failed: {error}" LEGACY_HEALTH_SQL = "SELECT 1" LEGACY_SELECT_PREFIX = "select" LEGACY_SQL_TRAILING_TERMINATOR = ";" LEGACY_LIMIT_MARKER = " limit " LEGACY_LIMIT_CLAUSE = " LIMIT :limit" LEGACY_PROJECT_CODE_TEMPLATE = "{prefix}-{external_id}" LEGACY_UNNAMED_PROJECT = "未命名项目"