from supabase import create_client, Client from supabase.lib.client_options import ClientOptions from datetime import datetime, timezone import logging import traceback class DBManager: def __init__(self, logger: logging.Logger): self.logger = logger self.logger.log("Initializing DBManager...", level=logging.DEBUG) # 실제 Supabase URL과 KEY로 수정하세요. self.url: str = "http://146.56.101.199:8000" self.key: str = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE" self.client: Client = create_client(self.url, self.key) self.access_token = None self.refresh_token = None self.logger.log("DBManager initialized", level=logging.DEBUG) def update_client_with_token(self, access_token: str): self.logger.log("Entering update_client_with_token()", level=logging.DEBUG) try: options = ClientOptions(headers={"Authorization": f"Bearer {access_token}"}) self.client = create_client(self.url, self.key, options=options) self.logger.log("Client updated with JWT token", level=logging.DEBUG) except Exception as ex: self.logger.log(f"update_client_with_token error: {ex}", level=logging.ERROR, exc_info=True) self.logger.log("Exiting update_client_with_token()", level=logging.DEBUG) def login(self, email: str, password: str) -> dict: self.logger.log("Entering DBManager.login()", level=logging.DEBUG) try: response = self.client.auth.sign_in_with_password({"email": email, "password": password}) if response.session: if response.user.email_confirmed_at is None: self.logger.log("이메일 인증이 완료되지 않았습니다.", level=logging.WARNING) return {"error": "이메일 인증을 먼저 완료해 주세요."} self.access_token = response.session.access_token self.refresh_token = response.session.refresh_token self.update_client_with_token(self.access_token) user_info = { "id": response.user.id, "email": response.user.email, "nickname": response.user.user_metadata.get("nickname", "Unknown") } self.logger.log(f"로그인 성공: {user_info}", level=logging.DEBUG) self.logger.log("Exiting DBManager.login()", level=logging.DEBUG) return user_info else: self.logger.log("로그인 실패: 세션 없음", level=logging.WARNING) return {"error": "로그인 실패"} except Exception as e: self.logger.log(f"Login error: {e}", level=logging.ERROR, exc_info=True) return {"error": str(e)} def update_last_login(self, user_id: str): self.logger.log(f"Entering update_last_login(user_id={user_id})", level=logging.DEBUG) try: now_iso = datetime.now(timezone.utc).isoformat() self.client.table("users").update({"last_login": now_iso}).eq("id", user_id).execute() self.logger.log(f"Last login updated for user {user_id}", level=logging.INFO) except Exception as e: self.logger.log(f"update_last_login 에러: {e}", level=logging.ERROR, exc_info=True) self.logger.log("Exiting update_last_login()", level=logging.DEBUG) def get_markets(self) -> list: """ supabase의 'markets' 테이블에서 마켓 목록을 읽어와 반환합니다. """ self.logger.log("Entering DBManager.get_markets()", level=logging.DEBUG) try: response = self.client.table("markets").select("*").execute() markets = response.data if response.data else [] self.logger.log(f"Retrieved markets: {markets}", level=logging.DEBUG) return markets except Exception as e: self.logger.log(f"get_markets 에러: {e}", level=logging.ERROR, exc_info=True) return []