from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List from ...core.database import get_db from ...models.models import MembershipTier from ...schemas import ( MembershipTierCreate, MembershipTierUpdate, MembershipTierResponse, MessageResponse ) from ...api.dependencies import get_current_active_user, get_admin_user, get_super_admin_user router = APIRouter() @router.get("/", response_model=List[MembershipTierResponse]) async def list_membership_tiers( skip: int = 0, limit: int = 100, show_inactive: bool = False, db: Session = Depends(get_db) ): """List all membership tiers""" query = db.query(MembershipTier) if not show_inactive: query = query.filter(MembershipTier.is_active == True) tiers = query.offset(skip).limit(limit).all() return tiers @router.get("/{tier_id}", response_model=MembershipTierResponse) async def get_membership_tier( tier_id: int, db: Session = Depends(get_db) ): """Get membership tier by ID""" tier = db.query(MembershipTier).filter(MembershipTier.id == tier_id).first() if not tier: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Membership tier not found" ) return tier @router.post("/", response_model=MembershipTierResponse, status_code=status.HTTP_201_CREATED) async def create_membership_tier( tier_data: MembershipTierCreate, current_user = Depends(get_super_admin_user), db: Session = Depends(get_db) ): """Create a new membership tier (super admin only)""" # Check if tier with same name exists existing_tier = db.query(MembershipTier).filter( MembershipTier.name == tier_data.name ).first() if existing_tier: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Membership tier with this name already exists" ) tier = MembershipTier(**tier_data.model_dump()) db.add(tier) db.commit() db.refresh(tier) return tier @router.put("/{tier_id}", response_model=MembershipTierResponse) async def update_membership_tier( tier_id: int, tier_update: MembershipTierUpdate, current_user = Depends(get_super_admin_user), db: Session = Depends(get_db) ): """Update membership tier (super admin only)""" tier = db.query(MembershipTier).filter(MembershipTier.id == tier_id).first() if not tier: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Membership tier not found" ) update_data = tier_update.model_dump(exclude_unset=True) for field, value in update_data.items(): setattr(tier, field, value) db.commit() db.refresh(tier) return tier @router.delete("/{tier_id}", response_model=MessageResponse) async def delete_membership_tier( tier_id: int, current_user = Depends(get_super_admin_user), db: Session = Depends(get_db) ): """Delete membership tier (super admin only)""" tier = db.query(MembershipTier).filter(MembershipTier.id == tier_id).first() if not tier: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Membership tier not found" ) db.delete(tier) db.commit() return {"message": "Membership tier deleted successfully"}