| | """ |
| | KSTools Version Manager - 版本系統資料庫連接 |
| | 專門處理版本系統 (Project 2) 的資料庫操作 |
| | """ |
| |
|
| | import os |
| | from supabase import create_client, Client |
| | from typing import Optional |
| | import logging |
| |
|
| | logger = logging.getLogger(__name__) |
| |
|
| | class VersionDatabase: |
| | """版本系統 Supabase 資料庫客戶端""" |
| | |
| | def __init__(self): |
| | |
| | self.url: str = os.environ.get("SUPABASE_VERSION_URL", "") |
| | self.anon_key: str = os.environ.get("SUPABASE_VERSION_ANON_KEY", "") |
| | self.service_key: str = os.environ.get("SUPABASE_VERSION_SERVICE_KEY", "") |
| | self.client: Optional[Client] = None |
| | |
| | if self.url and self.service_key and not self.url.startswith('your-') and not self.service_key.startswith('your-'): |
| | try: |
| | self.client = create_client(self.url, self.service_key) |
| | logger.info("✅ Version System Supabase connection initialized") |
| | except Exception as e: |
| | logger.error(f"❌ Version System connection failed: {e}") |
| | self.client = None |
| | else: |
| | logger.warning("⚠️ Version System Supabase not configured") |
| | |
| | def get_client(self) -> Optional[Client]: |
| | """取得版本系統 Supabase 客戶端""" |
| | if not self.client: |
| | logger.error("❌ Version System Supabase client 未初始化") |
| | return self.client |
| | |
| | def is_connected(self) -> bool: |
| | """檢查版本系統是否連接成功""" |
| | connected = self.client is not None |
| | logger.info(f"🔍 Version System Supabase connection status: {'Connected' if connected else 'Not connected'}") |
| | return connected |
| | |
| | async def upload_file(self, file_path: str, file_data: bytes, content_type: str = 'application/zip') -> str: |
| | """上傳檔案到 Supabase Storage""" |
| | if not self.client: |
| | raise Exception("Version System Supabase client not initialized") |
| | |
| | try: |
| | |
| | response = self.client.storage.from_('plugin-releases').upload( |
| | file_path, |
| | file_data, |
| | file_options={"content-type": content_type} |
| | ) |
| |
|
| | |
| | if hasattr(response, 'error') and response.error: |
| | raise Exception(f"Upload failed: {response.error}") |
| |
|
| | |
| | url_response = self.client.storage.from_('plugin-releases').get_public_url(file_path) |
| |
|
| | |
| | if hasattr(url_response, 'public_url'): |
| | public_url = url_response.public_url |
| | elif isinstance(url_response, str): |
| | public_url = url_response |
| | else: |
| | public_url = str(url_response) |
| |
|
| | logger.info(f"✅ File uploaded successfully: {file_path} -> {public_url}") |
| | return public_url |
| | |
| | except Exception as e: |
| | logger.error(f"❌ File upload failed: {e}") |
| | raise |
| | |
| | def get_public_url(self, file_path: str) -> str: |
| | """取得檔案的公開 URL""" |
| | if not self.client: |
| | raise Exception("Version System Supabase client not initialized") |
| | |
| | return self.client.storage.from_('plugin-releases').get_public_url(file_path) |
| |
|
| | |
| | version_db = VersionDatabase() |