d16456cb92
# 사용자별 격리 - JWT 토큰에 uid 추가 (auth.get_uid 헬퍼) - PostgreSQL — exchange_credentials/automation_config/trades/signal_events 에 user_id BIGINT - SQLite user_settings 테이블 신설 (글로벌 settings 는 옛 호환) - 모든 DB 함수 시그니처에 user_id 인자 추가 — 다른 사용자 데이터 절대 접근 불가 - alert_state — 모든 dict key 가 (user_id, ...) tuple 로 계층화 - core_logic alert_loop — 활성 사용자 순회 + 각자 settings/symbol/텔레그램 적용 - ensure_user_defaults() / ensure_user_automation() — 첫 사용 시 자동 시드 # 사용자 관리 (admin only) - users_db: delete_user / admin_reset_password / set_role - /api/users POST DELETE PUT password PUT role (본인 강등 / 마지막 admin 보호) - /admin/users 페이지 — 등록/삭제/role 토글/비번 reset 모달 - 사이드바 adminOnly 필터 — admin role 만 메뉴 노출 # 대시보드 개선 - 모바일 / 범례 토글 (모바일 60 캔들, 데스크톱 200) - 트레이드 이력: open 트레이드 실시간 PnL% (Binance ticker 호출 + 방향별 계산) - 메트릭 카드 분리 (실거래 vs 실시간 open) # 안정성 - api.ts: error.detail array/object 안전 처리 ([object Object] 방지) - Chart.tsx: Plotly yaxis title 객체 형태 + 모바일 height 동적 조정 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
"""
|
|
알림 스레드용 mutable state — 사용자별 격리.
|
|
모든 key 는 (user_id, ...) tuple 로 시작. 사용자별 alert_symbol 도 별도 dict.
|
|
|
|
FastAPI 프로세스 lifetime 동안 sys.modules 캐싱으로 보존.
|
|
옛 글로벌 변수 (alert_symbol, last_report_date) 는 backward-compat 으로 남김.
|
|
"""
|
|
import threading
|
|
|
|
# (user_id, interval, key) 별 마지막 알림 시각 (cooldown)
|
|
last_alert = {}
|
|
|
|
# (user_id, interval, key) 별 마지막 발사 candle open_time
|
|
last_fired_candle = {}
|
|
|
|
# (user_id, interval) 별 진입 추적 — value = entry_record dict or None
|
|
long_entry = {}
|
|
short_entry = {}
|
|
|
|
# 사용자별 pending forming candle 감시 — element = {"user_id", "interval", "direction", ...}
|
|
pending_groups = []
|
|
|
|
# (user_id, interval) tuple 셋 — 초기 silent sync 완료 표시
|
|
synced_intervals = set()
|
|
|
|
# (user_id, interval, sig) 별 forming candle 연속 True 카운트
|
|
signal_seen_count = {}
|
|
|
|
# 사용자별 monitored symbol — { user_id: "BTCUSDT" }
|
|
alert_symbol_by_user = {}
|
|
|
|
# 사용자별 마지막 일일 리포트 발송 일자 — { user_id: "YYYY-MM-DD" }
|
|
last_report_date_by_user = {}
|
|
|
|
# 옛 글로벌 (legacy, 미사용 — 일부 옛 코드 참조 위해 남김)
|
|
alert_symbol = "BTCUSDT"
|
|
alert_interval = "5m"
|
|
last_report_date = None
|
|
|
|
alert_lock = threading.Lock()
|
|
alert_started = False
|
|
daily_report_started = False
|