80 lines
3.6 KiB
Python
80 lines
3.6 KiB
Python
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 {}
|