diff --git a/bp/post/admin/routes.py b/bp/post/admin/routes.py index 362b2f0..a895659 100644 --- a/bp/post/admin/routes.py +++ b/bp/post/admin/routes.py @@ -191,7 +191,7 @@ def register(): @require_admin async def calendar_view(slug: str, calendar_id: int): """Show calendar month view for browsing entries""" - from shared.models.calendars import Calendar + from shared.models.calendars import Calendar # TODO: service method when admin UI is reworked from sqlalchemy import select from datetime import datetime, timezone from quart import request @@ -273,7 +273,7 @@ def register(): @require_admin async def entries(slug: str): from ..services.entry_associations import get_post_entry_ids - from shared.models.calendars import Calendar + from shared.models.calendars import Calendar # TODO: service method when admin UI is reworked from sqlalchemy import select post_id = g.post_data["post"]["id"] @@ -309,7 +309,7 @@ def register(): @require_admin async def toggle_entry(slug: str, entry_id: int): from ..services.entry_associations import toggle_entry_association, get_post_entry_ids, get_associated_entries - from shared.models.calendars import Calendar + from shared.models.calendars import Calendar # TODO: service method when admin UI is reworked from sqlalchemy import select from quart import jsonify diff --git a/bp/post/services/markets.py b/bp/post/services/markets.py index 948d986..c825bb8 100644 --- a/bp/post/services/markets.py +++ b/bp/post/services/markets.py @@ -6,11 +6,9 @@ import unicodedata from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from shared.models.market_place import MarketPlace from shared.models.page_config import PageConfig -from shared.browser.app.utils import utcnow +from shared.contracts.dtos import MarketPlaceDTO from shared.services.registry import services -from shared.services.relationships import attach_child, detach_child class MarketError(ValueError): @@ -30,7 +28,7 @@ def slugify(value: str, max_len: int = 255) -> str: return value or "market" -async def create_market(sess: AsyncSession, post_id: int, name: str) -> MarketPlace: +async def create_market(sess: AsyncSession, post_id: int, name: str) -> MarketPlaceDTO: name = (name or "").strip() if not name: raise MarketError("Market name must not be empty.") @@ -49,25 +47,10 @@ async def create_market(sess: AsyncSession, post_id: int, name: str) -> MarketPl if pc is None or not (pc.features or {}).get("market"): raise MarketError("Market feature is not enabled for this page. Enable it in page settings first.") - # Look for existing (including soft-deleted) - existing = (await sess.execute( - select(MarketPlace).where(MarketPlace.container_type == "page", MarketPlace.container_id == post_id, MarketPlace.slug == slug) - )).scalar_one_or_none() - - if existing: - if existing.deleted_at is not None: - existing.deleted_at = None # revive - existing.name = name - await sess.flush() - await attach_child(sess, "page", post_id, "market", existing.id) - return existing - raise MarketError(f'Market with slug "{slug}" already exists for this page.') - - market = MarketPlace(container_type="page", container_id=post_id, name=name, slug=slug) - sess.add(market) - await sess.flush() - await attach_child(sess, "page", post_id, "market", market.id) - return market + try: + return await services.market.create_marketplace(sess, "page", post_id, name, slug) + except ValueError as e: + raise MarketError(str(e)) from e async def soft_delete_market(sess: AsyncSession, post_slug: str, market_slug: str) -> bool: @@ -75,22 +58,4 @@ async def soft_delete_market(sess: AsyncSession, post_slug: str, market_slug: st if not post: return False - market = ( - await sess.execute( - select(MarketPlace) - .where( - MarketPlace.container_type == "page", - MarketPlace.container_id == post.id, - MarketPlace.slug == market_slug, - MarketPlace.deleted_at.is_(None), - ) - ) - ).scalar_one_or_none() - - if not market: - return False - - market.deleted_at = utcnow() - await sess.flush() - await detach_child(sess, "page", market.container_id, "market", market.id) - return True + return await services.market.soft_delete_marketplace(sess, "page", post.id, market_slug) diff --git a/shared b/shared index 9cba422..b3a0e99 160000 --- a/shared +++ b/shared @@ -1 +1 @@ -Subproject commit 9cba422aa9c072db4bbb2662315d66ea011bd19e +Subproject commit b3a0e9922ac403caf54805b13fff652503b5d07d