Files
astrololo/services/data/app/main.py
T
gitea 15964dd0df
build / build (push) Successful in 1m16s
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 11m11s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m40s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 30s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 20s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m38s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m38s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 26s
Testy / Kontrola składni wszystkich warstw (push) Successful in 21s
chore: wymuszenie nowego obrazu data/logic/presentation po incydencie z :latest
Komentarz-marker w main.py każdej z trzech usług — zmienia zawartość obrazu, więc
build.yaml wyprodukuje NOWE SHA-tagi z nowszym `created`. To odblokowuje
image-updatera (strategia newest-build), który utknął: wszystkie trzy usługi mają
w deployu tag `:latest`, którego build.yaml nigdy nie pcha (tylko SHA), więc nowe
pody wpadły w ImagePullBackOff. Nowy build z realnym SHA da updaterowi co promować
i przykryje `:latest` w kustomization — bez ręcznej zmiany w repo deploy.

UWAGA: samo to NIE wystarczy. W namespace astrololo zniknął pull-secret
`gitea-registry`, więc nawet z poprawnym tagiem nowe pody nie pobiorą obrazu.
Trzeba go odtworzyć (kopia działającego `gitea-registry-creds` z ns argocd) —
osobna, ręczna operacja, poza tym commitem.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 16:58:01 +02:00

43 lines
1.3 KiB
Python

"""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.
"""
# build-marker: 2026-07-25 wymuszenie nowego obrazu po incydencie z tagiem :latest
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()