Files
KisStock/backend/app/core/startup.py

69 lines
2.7 KiB
Python

import logging
import asyncio
from sqlalchemy import select
from app.db.database import SessionLocal
from app.db.models import ApiSettings
from app.core.config import settings
from app.services.kis_auth import kis_auth
from app.services.sync_service import sync_service
from app.services.telegram_service import telegram_service
logger = logging.getLogger(__name__)
async def check_kis_connectivity(db_session, settings_obj):
if not settings_obj.appKey or not settings_obj.appSecret:
logger.warning(">> [KIS] Credentials NOT FOUND in DB.")
return False
logger.info(">> [KIS] Attempting Authentication...")
try:
token = await kis_auth.get_access_token(db_session)
masked_token = token[:10] + "..." if token else "None"
logger.info(f" [OK] Access Token Valid ({masked_token})")
return True
except Exception as e:
logger.error(f" [FAILED] KIS Auth Failed: {e}")
return False
async def check_telegram_connectivity(settings_obj, is_startup=False):
if settings_obj.useTelegram and settings_obj.telegramToken and settings_obj.telegramChatId:
logger.info(">> [Telegram] Integration Enabled.")
if is_startup:
msg = "🚀 <b>BatchuKis 배취키스</b> 시스템이 시작되었습니다.\n자동매매 엔진이 가동 중입니다."
await telegram_service.send_message(settings_obj.telegramToken, settings_obj.telegramChatId, msg)
return True
else:
# logger.debug(">> [Telegram] Disabled or missing config.")
return False
async def run_startup_sequence():
"""
Executes the Phase 1~4 startup sequence.
"""
logger.info("=== Starting System Initialization Sequence ===")
async with SessionLocal() as db_session:
# Phase 1: Load Settings
stmt = select(ApiSettings).where(ApiSettings.id == 1)
result = await db_session.execute(stmt)
settings_obj = result.scalar_one_or_none()
if not settings_obj:
settings_obj = ApiSettings(id=1)
db_session.add(settings_obj)
await db_session.commit()
logger.info("Created Default ApiSettings.")
# Phase 2: KIS & Telegram
await check_kis_connectivity(db_session, settings_obj)
await check_telegram_connectivity(settings_obj, is_startup=True)
# Phase 3: Data Sync
logger.info(">> [Phase 3] Syncing Account & Master Data...")
await sync_service.sync_account(db_session)
from app.services.master_service import master_service
await master_service.sync_master_data(db_session)
logger.info("=== System Initialization Complete ===")