""" Tier Management Endpoints for Mitai Jinkendo Admin-only CRUD for subscription tiers. """ from fastapi import APIRouter, HTTPException, Depends from db import get_db, get_cursor, r2d from auth import require_admin router = APIRouter(prefix="/api/tiers", tags=["tiers"]) @router.get("") def list_tiers(session: dict = Depends(require_admin)): """Admin: List all tiers.""" with get_db() as conn: cur = get_cursor(conn) cur.execute(""" SELECT * FROM tiers ORDER BY sort_order """) return [r2d(r) for r in cur.fetchall()] @router.post("") def create_tier(data: dict, session: dict = Depends(require_admin)): """ Admin: Create new tier. Required fields: - id: Tier ID (e.g., 'enterprise') - name: Display name - price_monthly_cents, price_yearly_cents: Prices (NULL for free tiers) """ tier_id = data.get('id', '').strip() name = data.get('name', '').strip() description = data.get('description', '') price_monthly_cents = data.get('price_monthly_cents') price_yearly_cents = data.get('price_yearly_cents') sort_order = data.get('sort_order', 99) if not tier_id or not name: raise HTTPException(400, "ID und Name fehlen") with get_db() as conn: cur = get_cursor(conn) # Check if ID already exists cur.execute("SELECT id FROM tiers WHERE id = %s", (tier_id,)) if cur.fetchone(): raise HTTPException(400, f"Tier '{tier_id}' existiert bereits") # Create tier cur.execute(""" INSERT INTO tiers ( id, name, description, price_monthly_cents, price_yearly_cents, sort_order ) VALUES (%s, %s, %s, %s, %s, %s) """, (tier_id, name, description, price_monthly_cents, price_yearly_cents, sort_order)) conn.commit() return {"ok": True, "id": tier_id} @router.put("/{tier_id}") def update_tier(tier_id: str, data: dict, session: dict = Depends(require_admin)): """Admin: Update tier.""" with get_db() as conn: cur = get_cursor(conn) updates = [] values = [] if 'name' in data: updates.append('name = %s') values.append(data['name']) if 'description' in data: updates.append('description = %s') values.append(data['description']) if 'price_monthly_cents' in data: updates.append('price_monthly_cents = %s') values.append(data['price_monthly_cents']) if 'price_yearly_cents' in data: updates.append('price_yearly_cents = %s') values.append(data['price_yearly_cents']) if 'active' in data: updates.append('active = %s') values.append(data['active']) if 'sort_order' in data: updates.append('sort_order = %s') values.append(data['sort_order']) if not updates: return {"ok": True} updates.append('updated = CURRENT_TIMESTAMP') values.append(tier_id) cur.execute( f"UPDATE tiers SET {', '.join(updates)} WHERE id = %s", values ) conn.commit() return {"ok": True} @router.delete("/{tier_id}") def delete_tier(tier_id: str, session: dict = Depends(require_admin)): """Admin: Delete tier (soft-delete: set active=false).""" with get_db() as conn: cur = get_cursor(conn) cur.execute("UPDATE tiers SET active = false WHERE id = %s", (tier_id,)) conn.commit() return {"ok": True}