From dfdee7512a9aae58dd839ff3dc8484fbb4e8b5f3 Mon Sep 17 00:00:00 2001 From: Yves Gugger Date: Tue, 16 Dec 2025 15:11:08 +0100 Subject: [PATCH] Add admin debug endpoints for listings --- backend/app/api/admin.py | 74 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/backend/app/api/admin.py b/backend/app/api/admin.py index c9b4729..24f5080 100644 --- a/backend/app/api/admin.py +++ b/backend/app/api/admin.py @@ -25,6 +25,7 @@ from app.models.newsletter import NewsletterSubscriber from app.models.tld_price import TLDPrice, TLDInfo from app.models.auction import DomainAuction from app.models.price_alert import PriceAlert +from app.models.listing import DomainListing from app.services.db_backup import create_backup, list_backups from app.services.ops_alerts import run_ops_alert_checks from app.models.ops_alert import OpsAlertEvent @@ -1445,3 +1446,76 @@ async def set_user_subscription( "old_tier": old_tier.value if old_tier else None, "new_tier": tier.value, } + + +# ============== Listing Debug Endpoints ============== + +@router.get("/listings/debug") +async def debug_listings( + domain: Optional[str] = None, + slug: Optional[str] = None, + db: Database = None, + _: User = Depends(require_admin), +): + """Debug listings - search by domain or slug (ignores status).""" + query = select(DomainListing) + + if domain: + query = query.where(DomainListing.domain.ilike(f"%{domain}%")) + if slug: + query = query.where(DomainListing.slug.ilike(f"%{slug}%")) + + query = query.order_by(desc(DomainListing.created_at)).limit(20) + + result = await db.execute(query) + listings = list(result.scalars().all()) + + return { + "count": len(listings), + "listings": [ + { + "id": l.id, + "domain": l.domain, + "slug": l.slug, + "status": l.status, + "is_verified": l.is_verified, + "verification_status": l.verification_status, + "public_url": l.public_url, + "created_at": str(l.created_at) if l.created_at else None, + "published_at": str(l.published_at) if l.published_at else None, + "user_id": l.user_id, + } + for l in listings + ] + } + + +@router.post("/listings/{listing_id}/force-activate") +async def force_activate_listing( + listing_id: int, + db: Database = None, + _: User = Depends(require_admin), +): + """Force-activate a listing (bypass DNS verification).""" + result = await db.execute( + select(DomainListing).where(DomainListing.id == listing_id) + ) + listing = result.scalar_one_or_none() + + if not listing: + raise HTTPException(status_code=404, detail="Listing not found") + + listing.status = "active" + listing.is_verified = True + listing.verification_status = "verified" + listing.published_at = datetime.utcnow() + + await db.commit() + + return { + "status": "activated", + "listing_id": listing.id, + "domain": listing.domain, + "slug": listing.slug, + "public_url": listing.public_url, + }