summaryrefslogtreecommitdiff
path: root/src/srht_contrib/api/dependencies.py
blob: 8449380f2301c81ea75b69e2dcdf66a227a751a4 (plain) (blame)
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
from __future__ import annotations

from fastapi import Depends, Header, HTTPException, Request, status
from sqlalchemy.orm import Session

from srht_contrib.config import Settings
from srht_contrib.db import get_db_session
from srht_contrib.jobs.poller import PollerService
from srht_contrib.utils.identity import ActorIdentityResolver


def get_db(request: Request):
    yield from get_db_session(request)


def get_settings(request: Request) -> Settings:
    settings = getattr(request.app.state, "settings", None)
    if settings is None:
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Settings not configured.")
    return settings


def get_actor_identity_resolver(request: Request) -> ActorIdentityResolver:
    resolver = getattr(request.app.state, "actor_identity_resolver", None)
    if resolver is None:
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail="Actor identity resolver not configured.",
        )
    return resolver


def get_poller(request: Request) -> PollerService:
    poller = getattr(request.app.state, "poller", None)
    if poller is None:
        raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Poller not configured.")
    return poller


def require_api_key(
    x_api_key: str | None = Header(default=None, alias="X-API-Key"),
    settings: Settings = Depends(get_settings),
) -> None:
    if not settings.api_key or x_api_key != settings.api_key:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid API key.")