Initial commit: SIBU 2.0 MISSION
This commit is contained in:
94
backend/app/api/coupons.py
Normal file
94
backend/app/api/coupons.py
Normal file
@ -0,0 +1,94 @@
|
||||
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"}
|
||||
Reference in New Issue
Block a user