Decouple all cross-app service calls to HTTP endpoints
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m0s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m0s
Replace every direct cross-app services.* call with HTTP-based communication: call_action() for writes, fetch_data() for reads. Each app now registers only its own domain service. Infrastructure: - shared/infrastructure/actions.py — POST client for /internal/actions/ - shared/infrastructure/data_client.py — GET client for /internal/data/ - shared/contracts/dtos.py — dto_to_dict/dto_from_dict serialization Action endpoints (writes): - events: 8 handlers (ticket adjust, claim/confirm, toggle, adopt) - market: 2 handlers (create/soft-delete marketplace) - cart: 1 handler (adopt cart for user) Data endpoints (reads): - blog: 4 (post-by-slug/id, posts-by-ids, search-posts) - events: 10 (pending entries/tickets, entries/tickets for page/order, entry-ids, associated-entries, calendars, visible-entries-for-period) - market: 1 (marketplaces-for-container) - cart: 1 (cart-summary) Service registration cleanup: - blog→blog+federation, events→calendar+federation, market→market+federation, cart→cart only, federation→federation only, account→nothing - Stubs reduced to minimal StubFederationService Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -8,7 +8,7 @@ from sqlalchemy import select
|
||||
from shared.models.market import CartItem
|
||||
from shared.models.order import Order
|
||||
from shared.models.market_place import MarketPlace
|
||||
from shared.services.registry import services
|
||||
from shared.infrastructure.actions import call_action
|
||||
from .services import (
|
||||
current_cart_identity,
|
||||
get_cart,
|
||||
@@ -91,13 +91,12 @@ def register(url_prefix: str) -> Blueprint:
|
||||
tt_raw = (form.get("ticket_type_id") or "").strip()
|
||||
ticket_type_id = int(tt_raw) if tt_raw else None
|
||||
|
||||
await services.calendar.adjust_ticket_quantity(
|
||||
g.s, entry_id, count,
|
||||
user_id=ident["user_id"],
|
||||
session_id=ident["session_id"],
|
||||
ticket_type_id=ticket_type_id,
|
||||
)
|
||||
await g.s.flush()
|
||||
await call_action("events", "adjust-ticket-quantity", payload={
|
||||
"entry_id": entry_id, "count": count,
|
||||
"user_id": ident["user_id"],
|
||||
"session_id": ident["session_id"],
|
||||
"ticket_type_id": ticket_type_id,
|
||||
})
|
||||
|
||||
resp = await make_response("", 200)
|
||||
resp.headers["HX-Refresh"] = "true"
|
||||
@@ -256,13 +255,17 @@ def register(url_prefix: str) -> Blueprint:
|
||||
|
||||
# Resolve page/market slugs so product links render correctly
|
||||
if order.page_config:
|
||||
post = await services.blog.get_post_by_id(g.s, order.page_config.container_id)
|
||||
from shared.infrastructure.data_client import fetch_data
|
||||
from shared.contracts.dtos import CalendarEntryDTO, TicketDTO, dto_from_dict
|
||||
post = await fetch_data("blog", "post-by-id",
|
||||
params={"id": order.page_config.container_id},
|
||||
required=False)
|
||||
if post:
|
||||
g.page_slug = post.slug
|
||||
g.page_slug = post["slug"]
|
||||
result = await g.s.execute(
|
||||
select(MarketPlace).where(
|
||||
MarketPlace.container_type == "page",
|
||||
MarketPlace.container_id == post.id,
|
||||
MarketPlace.container_id == post["id"],
|
||||
MarketPlace.deleted_at.is_(None),
|
||||
).limit(1)
|
||||
)
|
||||
@@ -278,8 +281,14 @@ def register(url_prefix: str) -> Blueprint:
|
||||
|
||||
status = (order.status or "pending").lower()
|
||||
|
||||
calendar_entries = await services.calendar.get_entries_for_order(g.s, order.id)
|
||||
order_tickets = await services.calendar.get_tickets_for_order(g.s, order.id)
|
||||
from shared.infrastructure.data_client import fetch_data
|
||||
from shared.contracts.dtos import CalendarEntryDTO, TicketDTO, dto_from_dict
|
||||
raw_entries = await fetch_data("events", "entries-for-order",
|
||||
params={"order_id": order.id}, required=False) or []
|
||||
calendar_entries = [dto_from_dict(CalendarEntryDTO, e) for e in raw_entries]
|
||||
raw_tickets = await fetch_data("events", "tickets-for-order",
|
||||
params={"order_id": order.id}, required=False) or []
|
||||
order_tickets = [dto_from_dict(TicketDTO, t) for t in raw_tickets]
|
||||
await g.s.flush()
|
||||
|
||||
html = await render_template(
|
||||
|
||||
Reference in New Issue
Block a user