"""Warstwa BAZODANOWA — usługa HTTP. Jedyne zadanie: przyjąć znormalizowane zapytanie z warstwy logicznej, wyszukać dane (w Excelu z cache lub w SQL) i zwrócić je w górę. Nie zna warstwy logicznej ani prezentacji. """ from __future__ import annotations from contextlib import asynccontextmanager from fastapi import FastAPI from app import link_crypto, security from app.config import settings from app.models import HealthInfo, SearchQuery, SearchResult from app.providers.factory import build_provider provider = build_provider(settings) @asynccontextmanager async def lifespan(app: FastAPI): provider.warmup() # zbuduj/odśwież indeks i cache przy starcie yield app = FastAPI(title="astrololo · warstwa bazodanowa", lifespan=lifespan) security.install(app, "danych") # token międzywarstwowy (LOG-32) # Szyfrowanie łącza od logiki. PO `security.install`, żeby także odmowa # tokenowa wracała zaszyfrowana — inaczej klient nie umiałby jej odczytać. link_crypto.install(app, link_crypto.ENV_LOGIC_DATA, "danych") @app.post("/search", response_model=SearchResult) def search(query: SearchQuery) -> SearchResult: return provider.search(query) @app.get("/health", response_model=HealthInfo) def health() -> HealthInfo: return provider.health()