fix: critical bug fixes - routes UUID, image paths, favorites loading, bottom nav debounce

This commit is contained in:
2026-02-25 16:29:13 -05:00
parent c449083171
commit fd95df461b
14 changed files with 379 additions and 116 deletions

View File

@ -1,11 +1,14 @@
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi import APIRouter, Depends, HTTPException, status, Form, File, UploadFile
from sqlmodel import Session, select
from sqlalchemy.orm import joinedload
from typing import List
from typing import List, Optional
from uuid import UUID
from datetime import datetime
from app.core.database import get_session
from app.models.coupon import Coupon, CouponCreate, CouponUpdate
from app.models.coupon import Coupon
from app.models.user import User, UserRole
from app.api.deps import get_current_user
from app.services.image_handler import save_image, delete_image
router = APIRouter(prefix="/api/coupons", tags=["coupons"])
@ -27,7 +30,19 @@ async def list_coupons(
async def create_coupon(
*,
session: Session = Depends(get_session),
coupon_in: CouponCreate,
title: str = Form(...),
business_id: Optional[UUID] = Form(None),
description: Optional[str] = Form(None),
business_name: Optional[str] = Form(None),
business_address: Optional[str] = Form(None),
business_phone: Optional[str] = Form(None),
discount_percentage: Optional[int] = Form(None),
discount_amount: Optional[float] = Form(None),
category: Optional[str] = Form(None),
valid_from: Optional[datetime] = Form(None),
valid_until: Optional[datetime] = Form(None),
is_active: bool = Form(True),
image: Optional[UploadFile] = File(None),
current_user: User = Depends(get_current_user)
):
"""Create a new coupon (Promoters and Admins only)."""
@ -37,7 +52,25 @@ async def create_coupon(
detail="Only promoters and admins can create coupons"
)
db_coupon = Coupon.from_orm(coupon_in)
image_url = None
if image:
image_url = save_image(image, "coupons")
db_coupon = Coupon(
title=title,
business_id=business_id,
description=description,
business_name=business_name,
business_address=business_address,
business_phone=business_phone,
discount_percentage=discount_percentage,
discount_amount=discount_amount,
category=category,
valid_from=valid_from,
valid_until=valid_until,
is_active=is_active,
image_url=image_url
)
session.add(db_coupon)
session.commit()
session.refresh(db_coupon)
@ -47,8 +80,13 @@ async def create_coupon(
async def update_coupon(
*,
session: Session = Depends(get_session),
coupon_id: str,
coupon_in: CouponUpdate,
coupon_id: UUID,
title: Optional[str] = Form(None),
description: Optional[str] = Form(None),
discount_percentage: Optional[int] = Form(None),
valid_until: Optional[datetime] = Form(None),
is_active: Optional[bool] = Form(None),
image: Optional[UploadFile] = File(None),
current_user: User = Depends(get_current_user)
):
"""Update a coupon (Promoters and Admins only)."""
@ -62,9 +100,21 @@ async def update_coupon(
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)
if title is not None:
db_coupon.title = title
if description is not None:
db_coupon.description = description
if discount_percentage is not None:
db_coupon.discount_percentage = discount_percentage
if valid_until is not None:
db_coupon.valid_until = valid_until
if is_active is not None:
db_coupon.is_active = is_active
if image:
if db_coupon.image_url:
delete_image(db_coupon.image_url)
db_coupon.image_url = save_image(image, "coupons")
session.add(db_coupon)
session.commit()
@ -75,7 +125,7 @@ async def update_coupon(
async def delete_coupon(
*,
session: Session = Depends(get_session),
coupon_id: str,
coupon_id: UUID,
current_user: User = Depends(get_current_user)
):
"""Delete a coupon (Promoters and Admins only)."""
@ -89,6 +139,9 @@ async def delete_coupon(
if not db_coupon:
raise HTTPException(status_code=404, detail="Coupon not found")
if db_coupon.image_url:
delete_image(db_coupon.image_url)
session.delete(db_coupon)
session.commit()
return {"status": "success", "message": "Coupon deleted"}