95 lines
3.0 KiB
Python
95 lines
3.0 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlmodel import Session, select
|
|
from sqlalchemy.orm import joinedload
|
|
from typing import List
|
|
from app.core.database import get_session
|
|
from app.models.coupon import Coupon, CouponCreate, CouponUpdate
|
|
from app.models.user import User, UserRole
|
|
from app.api.deps import get_current_user
|
|
|
|
router = APIRouter(prefix="/api/coupons", tags=["coupons"])
|
|
|
|
@router.get("", response_model=List[Coupon])
|
|
async def list_coupons(
|
|
*,
|
|
session: Session = Depends(get_session),
|
|
active_only: bool = True
|
|
):
|
|
"""List all coupons."""
|
|
statement = select(Coupon).options(joinedload(Coupon.business))
|
|
if active_only:
|
|
statement = statement.where(Coupon.is_active)
|
|
|
|
coupons = session.exec(statement).all()
|
|
return coupons
|
|
|
|
@router.post("", response_model=Coupon)
|
|
async def create_coupon(
|
|
*,
|
|
session: Session = Depends(get_session),
|
|
coupon_in: CouponCreate,
|
|
current_user: User = Depends(get_current_user)
|
|
):
|
|
"""Create a new coupon (Promoters and Admins only)."""
|
|
if current_user.role not in [UserRole.ADMIN, UserRole.PROMOTER]:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_403_FORBIDDEN,
|
|
detail="Only promoters and admins can create coupons"
|
|
)
|
|
|
|
db_coupon = Coupon.from_orm(coupon_in)
|
|
session.add(db_coupon)
|
|
session.commit()
|
|
session.refresh(db_coupon)
|
|
return db_coupon
|
|
|
|
@router.patch("/{coupon_id}", response_model=Coupon)
|
|
async def update_coupon(
|
|
*,
|
|
session: Session = Depends(get_session),
|
|
coupon_id: str,
|
|
coupon_in: CouponUpdate,
|
|
current_user: User = Depends(get_current_user)
|
|
):
|
|
"""Update a coupon (Promoters and Admins only)."""
|
|
if current_user.role not in [UserRole.ADMIN, UserRole.PROMOTER]:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_403_FORBIDDEN,
|
|
detail="Only promoters and admins can update coupons"
|
|
)
|
|
|
|
db_coupon = session.get(Coupon, coupon_id)
|
|
if not db_coupon:
|
|
raise HTTPException(status_code=404, detail="Coupon not found")
|
|
|
|
coupon_data = coupon_in.dict(exclude_unset=True)
|
|
for key, value in coupon_data.items():
|
|
setattr(db_coupon, key, value)
|
|
|
|
session.add(db_coupon)
|
|
session.commit()
|
|
session.refresh(db_coupon)
|
|
return db_coupon
|
|
|
|
@router.delete("/{coupon_id}")
|
|
async def delete_coupon(
|
|
*,
|
|
session: Session = Depends(get_session),
|
|
coupon_id: str,
|
|
current_user: User = Depends(get_current_user)
|
|
):
|
|
"""Delete a coupon (Promoters and Admins only)."""
|
|
if current_user.role not in [UserRole.ADMIN, UserRole.PROMOTER]:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_403_FORBIDDEN,
|
|
detail="Only promoters and admins can delete coupons"
|
|
)
|
|
|
|
db_coupon = session.get(Coupon, coupon_id)
|
|
if not db_coupon:
|
|
raise HTTPException(status_code=404, detail="Coupon not found")
|
|
|
|
session.delete(db_coupon)
|
|
session.commit()
|
|
return {"status": "success", "message": "Coupon deleted"}
|