File size: 3,066 Bytes
cef045d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""OB1 2API — FastAPI application."""
import asyncio
import os
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import RedirectResponse

from .api import routes, admin
from .services.token_manager import OB1TokenManager
from .services.ob1_client import OB1Client
from .services.api_key_manager import ApiKeyManager
from .core.auth import init_auth
from .core.config import API_KEY
from .core import config as _config
from .core.logger import setup_logging, get_logger

setup_logging()
log = get_logger("main")

app = FastAPI(title="OB1 2API", version="1.0.0")

# Auto-refresh task handle
_auto_refresh_task: asyncio.Task | None = None

# Static files
_static_dir = os.path.join(os.path.dirname(__file__), "..", "static")
app.mount("/static", StaticFiles(directory=os.path.abspath(_static_dir)), name="static")

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

# Services
token_manager = OB1TokenManager()
ob1_client = OB1Client()
api_key_manager = ApiKeyManager()

# Init auth with key manager
init_auth(api_key_manager)

# Inject dependencies
routes.init(token_manager, ob1_client)
admin.init(token_manager, api_key_manager)

# Register routers
app.include_router(routes.router)
app.include_router(admin.login_router)
app.include_router(admin.router)


@app.on_event("startup")
async def startup():
    api_key_manager.load(default_key=API_KEY)
    token_manager.load()
    if token_manager.is_loaded:
        api_key = await token_manager.get_api_key()
        log.info("OB1 2API started — user=%s token=%s", token_manager.user_email, "valid" if api_key else "needs refresh")
    else:
        log.info("OB1 2API started (no credentials loaded)")
    # Periodic flush for api key stats
    asyncio.create_task(_periodic_flush())
    # Start auto-refresh if configured
    restart_auto_refresh()


async def _periodic_flush():
    while True:
        await asyncio.sleep(60)
        api_key_manager.flush()


async def _auto_refresh_loop(interval: int):
    """Periodically refresh all account tokens."""
    while True:
        await asyncio.sleep(interval * 60)
        log.info("Auto-refreshing all accounts (interval=%dm)", interval)
        await token_manager.refresh()


def restart_auto_refresh():
    """(Re)start the auto-refresh task based on current config."""
    global _auto_refresh_task
    if _auto_refresh_task and not _auto_refresh_task.done():
        _auto_refresh_task.cancel()
        _auto_refresh_task = None
    _config.reload()
    interval = _config.OB1_REFRESH_INTERVAL
    if interval and interval > 0:
        _auto_refresh_task = asyncio.create_task(_auto_refresh_loop(interval))
        log.info("Auto-refresh enabled: every %d minutes", interval)
    else:
        log.info("Auto-refresh disabled")


@app.on_event("shutdown")
async def shutdown():
    api_key_manager.flush()


@app.get("/")
async def root():
    return RedirectResponse("/static/login.html")