summaryrefslogtreecommitdiff
path: root/services/api/src/trading_api/main.py
blob: 05c6d2fe5fefec4ff716b935c2672533ffa5634c (plain)
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
"""Trading Platform REST API."""

import logging
from contextlib import asynccontextmanager

from fastapi import Depends, FastAPI
from fastapi.middleware.cors import CORSMiddleware
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.errors import RateLimitExceeded
from slowapi.util import get_remote_address

from shared.config import Settings
from shared.db import Database
from trading_api.dependencies.auth import verify_token
from trading_api.routers import orders, portfolio, strategies

logger = logging.getLogger(__name__)


@asynccontextmanager
async def lifespan(app: FastAPI):
    settings = Settings()
    if not settings.api_auth_token.get_secret_value():
        logger.warning("API_AUTH_TOKEN not set — authentication is disabled")
    app.state.db = Database(settings.database_url.get_secret_value())
    await app.state.db.connect()
    yield
    await app.state.db.close()


cfg = Settings()

limiter = Limiter(key_func=get_remote_address)

app = FastAPI(
    title="Trading Platform API",
    version="0.1.0",
    lifespan=lifespan,
)

app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)

app.add_middleware(
    CORSMiddleware,
    allow_origins=cfg.cors_origins.split(","),
    allow_methods=["GET", "POST"],
    allow_headers=["Authorization", "Content-Type"],
)

app.include_router(
    portfolio.router,
    prefix="/api/v1/portfolio",
    tags=["portfolio"],
    dependencies=[Depends(verify_token)],
)
app.include_router(
    orders.router,
    prefix="/api/v1/orders",
    tags=["orders"],
    dependencies=[Depends(verify_token)],
)
app.include_router(
    strategies.router,
    prefix="/api/v1/strategies",
    tags=["strategies"],
    dependencies=[Depends(verify_token)],
)


@app.get("/health")
async def health():
    return {"status": "ok"}