from typing import List, Dict import logging class SupabaseForbiddenWordManager: def __init__(self, logger, supabase_manager, user_id: str): self.logger = logger self.supabase_manager = supabase_manager self.user_id = user_id # 최초 로딩 후 캐시 저장 self._forbidden_words_cache = self._load_forbidden_words_from_supabase() def _load_forbidden_words_from_supabase(self) -> Dict[str, Dict]: """ Supabase의 user_banned_words 테이블에서 사용자 금지어 목록을 조회하여, {금지어: {등급, 키프리스 데이터}} 형태의 딕셔너리로 반환합니다. """ words = self.supabase_manager.fetch_banned_words(self.user_id) # 딕셔너리 컴프리헨션 사용 forbidden_dict = { record.get("banned_word"): { "grade": record.get("grade"), "kipris_data": record.get("kipris_data", {}) } for record in words if record.get("banned_word") and record.get("grade") } # self.logger.log(f"Loaded forbidden words: {forbidden_dict}", level=logging.DEBUG) return forbidden_dict def refresh_forbidden_words(self) -> None: """ Supabase에서 금지어 목록을 다시 불러와 캐시를 갱신합니다. 사용자가 금지어 관리 테이블에서 작업한 후, 이 메서드를 호출하면 최신 금지어 데이터를 반영할 수 있습니다. """ self._forbidden_words_cache = self._load_forbidden_words_from_supabase() self.logger.log("Forbidden words cache refreshed.", level=logging.DEBUG) def is_word_forbidden(self, word: str) -> bool: """ 단어가 금지어 목록에 존재하며, 등급이 "비허용"이면 True를 반환합니다. (해당 단어는 최종 상품명에서 제외되어야 합니다.) """ word_data = self._forbidden_words_cache.get(word) if word_data and word_data.get("grade") == "비허용": self.logger.log(f"Word '{word}' is forbidden with grade 비허용.", level=logging.DEBUG) return True return False def check_forbidden_grade(self, words: List[str]) -> bool: """ 전달받은 단어 리스트 중 하나라도 등급이 "금지"인 단어가 있으면 True를 반환합니다. (최종 상품명에 [금지상품] 접두어를 붙이는 용도) """ for word in words: word_data = self._forbidden_words_cache.get(word) if word_data and word_data.get("grade") == "금지": self.logger.log(f"Word '{word}' is forbidden with grade 금지.", level=logging.DEBUG) return True return False def get_forbidden_grade_words(self, words: List[str]) -> List[str]: """ 전달받은 단어 리스트 중에서 등급이 "금지"인 단어들을 리스트로 반환합니다. """ forbidden = [] for word in words: word_data = self._forbidden_words_cache.get(word) if word_data and word_data.get("grade") == "금지": self.logger.log(f"Word '{word}' is forbidden with grade 금지.", level=logging.DEBUG) forbidden.append(word) return forbidden def get_kipris_data(self, word: str) -> Dict: """ 단어의 키프리스 검증 데이터를 반환합니다. """ word_data = self._forbidden_words_cache.get(word) return word_data.get("kipris_data", {}) if word_data else {}