GET /orders (filtre: purchase_round_id, route_id, payment_status)
giver admin en oversigt pr. ordre med deltagerinfo, vinlinjer og
beregnet total. POST /orders/{id}/mark-paid registrerer betalingen
(payment_status=paid, paid_at) og udløser mail-event #3
(payment_confirmed) — afviser med 409 hvis ordren allerede er betalt.
Udtrukket render/send/log-logikken fra 8a's _send_order_confirmation
til en delt app/services/order_mail.py::send_order_event_mail,
parameteriseret over MailEventType, så order_confirmed og
payment_confirmed ikke længere duplikerer den samme kode. Som med
order_confirmed er mail-afsendelsen best-effort: en manglende
skabelon eller afsenderkonfiguration blokerer aldrig selve
betalingsregistreringen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
38 lines
1 KiB
Python
38 lines
1 KiB
Python
from fastapi import FastAPI
|
|
from fastapi.staticfiles import StaticFiles
|
|
from sqlalchemy import text
|
|
|
|
from app.db import SessionDep
|
|
from app.routers import (
|
|
auth,
|
|
mail_logs,
|
|
mail_templates,
|
|
orders,
|
|
participants,
|
|
public_orders,
|
|
public_site,
|
|
purchase_rounds,
|
|
webhooks,
|
|
wine_categories,
|
|
wine_offerings,
|
|
)
|
|
|
|
app = FastAPI(title="Vinindkøb Admin API")
|
|
app.mount("/static", StaticFiles(directory="app/static"), name="static")
|
|
app.include_router(auth.router)
|
|
app.include_router(participants.router)
|
|
app.include_router(purchase_rounds.router)
|
|
app.include_router(wine_offerings.router)
|
|
app.include_router(wine_categories.router)
|
|
app.include_router(mail_templates.router)
|
|
app.include_router(mail_logs.router)
|
|
app.include_router(orders.router)
|
|
app.include_router(webhooks.router)
|
|
app.include_router(public_orders.router)
|
|
app.include_router(public_site.router)
|
|
|
|
|
|
@app.get("/health")
|
|
def health(session: SessionDep) -> dict:
|
|
session.exec(text("SELECT 1"))
|
|
return {"status": "ok", "database": "ok"}
|