PupaClic commited on
Commit
28b4202
·
1 Parent(s): 229973a

feat(bidders): implement deletion of all barrier sizes associated with a bidder

Browse files
app/controllers/bidders.py CHANGED
@@ -469,42 +469,35 @@ def update_barrier_size_with_association(
469
  )
470
 
471
 
 
472
  @router.delete(
473
- "/barrier-sizes/{id}",
474
  status_code=status.HTTP_204_NO_CONTENT,
475
- summary="Delete a barrier size",
476
- response_description="Barrier size deleted successfully"
477
  )
478
- def delete_barrier_size(id: int, db: Session = Depends(get_db)):
479
- """Delete a barrier size and all its bidder associations"""
 
 
 
 
 
 
 
 
 
480
  try:
481
- logger.info(f"Deleting barrier size {id}")
482
-
483
- # Check if barrier size exists first
484
- from app.db.repositories.barrier_size_repo import get_barrier_size
485
- barrier_size = get_barrier_size(db, id)
486
- if not barrier_size:
487
- raise HTTPException(status_code=404, detail=f"Barrier size {id} not found")
488
 
489
- # Delete using the service method which handles associations properly
490
- success = barrier_size_service.delete(db, id)
491
- if not success:
492
- raise HTTPException(
493
- status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
494
- detail=f"Failed to delete barrier size {id}"
495
- )
496
-
497
- logger.info(f"Successfully deleted barrier size {id}")
498
  return None
499
- except HTTPException:
500
- raise
501
  except Exception as e:
502
- logger.error(f"Error deleting barrier size {id}: {e}")
503
- import traceback
504
- traceback.print_exc() # Print full traceback for debugging
505
  raise HTTPException(
506
  status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
507
- detail=f"Failed to delete barrier size: {str(e)}"
508
  )
509
 
510
  @router.delete(
 
469
  )
470
 
471
 
472
+
473
  @router.delete(
474
+ "/barrier-sizes/by-bidder/{bidder_id}",
475
  status_code=status.HTTP_204_NO_CONTENT,
476
+ summary="Delete all barrier sizes associated with a bidder",
477
+ response_description="All barrier sizes and associations for the bidder deleted successfully"
478
  )
479
+ def delete_barrier_sizes_by_bidder(bidder_id: int, db: Session = Depends(get_db)):
480
+ """
481
+ Delete all barrier sizes associated with a specific bidder.
482
+
483
+ This implements the two-step SQL logic:
484
+ 1. DELETE FROM BarrierSizes WHERE Id IN (SELECT BarrierSizeId FROM BiddersBarrierSizes WHERE BidderId = {bidder_id})
485
+ 2. DELETE FROM BiddersBarrierSizes WHERE BidderId = {bidder_id}
486
+
487
+ Parameters:
488
+ - bidder_id: The bidder ID to delete all barrier sizes for
489
+ """
490
  try:
491
+ logger.info(f"Deleting all barrier sizes for bidder {bidder_id}")
492
+ result = barrier_size_service.delete_all_by_bidder(db, bidder_id)
 
 
 
 
 
493
 
494
+ logger.info(f"Successfully deleted barrier sizes for bidder {bidder_id}: {result}")
 
 
 
 
 
 
 
 
495
  return None
 
 
496
  except Exception as e:
497
+ logger.error(f"Error deleting barrier sizes for bidder {bidder_id}: {e}")
 
 
498
  raise HTTPException(
499
  status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
500
+ detail="Failed to delete barrier sizes for bidder"
501
  )
502
 
503
  @router.delete(
app/services/barrier_size_service.py CHANGED
@@ -144,6 +144,56 @@ def delete_by_bidder_and_barrier_id(db: Session, bidder_id: int, barrier_size_id
144
  db.rollback()
145
  raise
146
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
  def create_barrier_with_association(
148
  db: Session,
149
  height: Optional[float] = None,
 
144
  db.rollback()
145
  raise
146
 
147
+ def delete_all_by_bidder(db: Session, bidder_id: int):
148
+ """
149
+ Delete all barrier sizes associated with a specific bidder.
150
+
151
+ Implements the two-step SQL logic:
152
+ 1. DELETE FROM BarrierSizes WHERE Id IN (SELECT BarrierSizeId FROM BiddersBarrierSizes WHERE BidderId = {bidder_id})
153
+ 2. DELETE FROM BiddersBarrierSizes WHERE BidderId = {bidder_id}
154
+
155
+ Args:
156
+ db: Database session
157
+ bidder_id: The bidder ID
158
+
159
+ Returns:
160
+ dict: Status of deletion operations
161
+ """
162
+ try:
163
+ bidders_barrier_repo = BiddersBarrierSizesRepository(db)
164
+
165
+ # Step 1: Get all barrier size IDs associated with this bidder
166
+ associations = bidders_barrier_repo.get_by_bidder_id(bidder_id)
167
+ barrier_size_ids = [assoc.BarrierSizeId for assoc in associations]
168
+
169
+ logger.info(f"Found {len(barrier_size_ids)} barrier sizes for bidder {bidder_id}: {barrier_size_ids}")
170
+
171
+ # Step 2: Delete all barrier sizes that are associated with this bidder
172
+ barrier_sizes_deleted = 0
173
+ for barrier_size_id in barrier_size_ids:
174
+ success = delete_barrier_size(db, barrier_size_id)
175
+ if success:
176
+ barrier_sizes_deleted += 1
177
+
178
+ # Step 3: Delete all associations for this bidder
179
+ associations_deleted = bidders_barrier_repo.delete_by_bidder_id(bidder_id)
180
+
181
+ result = {
182
+ "bidder_id": bidder_id,
183
+ "barrier_sizes_deleted": barrier_sizes_deleted,
184
+ "barrier_size_ids": barrier_size_ids,
185
+ "associations_deleted": associations_deleted,
186
+ "message": f"Deleted {barrier_sizes_deleted} barrier sizes and {associations_deleted} associations for bidder {bidder_id}"
187
+ }
188
+
189
+ logger.info(f"Delete all by bidder operation completed: {result}")
190
+ return result
191
+
192
+ except Exception as e:
193
+ logger.error(f"Error deleting all barrier sizes for bidder {bidder_id}: {e}")
194
+ db.rollback()
195
+ raise
196
+
197
  def create_barrier_with_association(
198
  db: Session,
199
  height: Optional[float] = None,