kstools-license-manager / app /models /version_database.py
KyrosDev's picture
清理版本管理系統測試代碼
79f9175
"""
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:
# 上傳到 plugin-releases bucket
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
url_response = self.client.storage.from_('plugin-releases').get_public_url(file_path)
# 確保返回正確的 URL 字串
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()