Implement workout item and set deletion endpoints, enhance API response handling for empty responses

This commit is contained in:
Artem Kashaev
2026-05-28 14:08:15 +05:00
parent 2f5fd2f3d4
commit c17c65fcfa
5 changed files with 431 additions and 56 deletions
+55
View File
@@ -323,6 +323,61 @@ def add_workout_set(
return workout_set
@app.delete(
"/internal/workout-items/{item_id}",
dependencies=[InternalAuth],
status_code=status.HTTP_204_NO_CONTENT,
)
def delete_workout_item(item_id: uuid.UUID, db: Db, user_id: CurrentUserId) -> None:
item = db.scalar(
select(WorkoutItem)
.join(Workout)
.where(WorkoutItem.id == item_id, Workout.user_id == user_id)
)
if not item:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Workout item not found")
workout = db.get(Workout, item.workout_id)
if workout and workout.finished_at:
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Workout already finished")
workout_id = item.workout_id
db.delete(item)
db.flush()
recalculate_workout_calories(db, workout_id)
db.commit()
@app.delete(
"/internal/workout-items/{item_id}/sets/{set_id}",
dependencies=[InternalAuth],
status_code=status.HTTP_204_NO_CONTENT,
)
def delete_workout_set(
item_id: uuid.UUID, set_id: uuid.UUID, db: Db, user_id: CurrentUserId
) -> None:
ws = db.scalar(
select(WorkoutSet)
.join(WorkoutItem)
.join(Workout)
.where(
WorkoutSet.id == set_id,
WorkoutItem.id == item_id,
Workout.user_id == user_id,
)
)
if not ws:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Set not found")
workout = db.scalar(
select(Workout).join(WorkoutItem).where(WorkoutItem.id == item_id)
)
if workout and workout.finished_at:
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Workout already finished")
db.delete(ws)
db.flush()
if workout:
recalculate_workout_calories(db, workout.id)
db.commit()
def estimate_set_calories(item: WorkoutItem, payload: WorkoutSetCreate) -> float:
if item.exercise and item.exercise.default_calories_per_minute and payload.duration_seconds:
return round(