"""Cart app action endpoints. Exposes write operations at ``/internal/actions/`` for cross-app callers (login handler) via the internal action client. """ from __future__ import annotations from quart import Blueprint, g, jsonify, request from shared.infrastructure.actions import ACTION_HEADER from shared.services.registry import services def register() -> Blueprint: bp = Blueprint("actions", __name__, url_prefix="/internal/actions") @bp.before_request async def _require_action_header(): if not request.headers.get(ACTION_HEADER): return jsonify({"error": "forbidden"}), 403 from shared.infrastructure.internal_auth import validate_internal_request if not validate_internal_request(): return jsonify({"error": "forbidden"}), 403 _handlers: dict[str, object] = {} @bp.post("/") async def handle_action(action_name: str): handler = _handlers.get(action_name) if handler is None: return jsonify({"error": "unknown action"}), 404 try: result = await handler() return jsonify(result) except Exception as exc: import logging logging.getLogger(__name__).exception("Action %s failed", action_name) return jsonify({"error": str(exc)}), 500 # --- adopt-cart-for-user --- async def _adopt_cart(): data = await request.get_json() await services.cart.adopt_cart_for_user( g.s, data["user_id"], data["session_id"], ) return {"ok": True} _handlers["adopt-cart-for-user"] = _adopt_cart # --- clear-cart-for-order --- async def _clear_cart_for_order(): """Soft-delete cart items after an order is paid. Called by orders service.""" from bp.cart.services.clear_cart_for_order import clear_cart_for_order from shared.models.order import Order data = await request.get_json() user_id = data.get("user_id") session_id = data.get("session_id") page_post_id = data.get("page_post_id") # Build a minimal order-like object with the fields clear_cart_for_order needs order = type("_Order", (), { "user_id": user_id, "session_id": session_id, })() await clear_cart_for_order(g.s, order, page_post_id=page_post_id) return {"ok": True} _handlers["clear-cart-for-order"] = _clear_cart_for_order return bp