Implement workout item and set deletion endpoints, enhance API response handling for empty responses
This commit is contained in:
@@ -174,6 +174,16 @@ async def add_workout_set(item_id: str, payload: dict[str, Any], user: CurrentUs
|
||||
)
|
||||
|
||||
|
||||
@app.delete("/workout-items/{item_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
async def remove_workout_item(item_id: str, user: CurrentUser) -> None:
|
||||
await logic_request("DELETE", f"/internal/workout-items/{item_id}", user)
|
||||
|
||||
|
||||
@app.delete("/workout-items/{item_id}/sets/{set_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
async def remove_workout_set(item_id: str, set_id: str, user: CurrentUser) -> None:
|
||||
await logic_request("DELETE", f"/internal/workout-items/{item_id}/sets/{set_id}", user)
|
||||
|
||||
|
||||
@app.get("/analytics/progression")
|
||||
async def progression(
|
||||
user: CurrentUser,
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user