Finish security updates
Browse files
app.py
CHANGED
|
@@ -46,11 +46,9 @@ class RecipeUpdate(BaseModel):
|
|
| 46 |
ingredients: Optional[List[str]]
|
| 47 |
description: Optional[str]
|
| 48 |
instructions: Optional[str]
|
| 49 |
-
user_id: Optional[str]
|
| 50 |
|
| 51 |
class DeleteRecipeRequest(BaseModel):
|
| 52 |
id: str
|
| 53 |
-
user_id: str
|
| 54 |
|
| 55 |
security = HTTPBearer()
|
| 56 |
|
|
@@ -65,7 +63,7 @@ def verify_token(credentials: HTTPAuthorizationCredentials = Depends(security)):
|
|
| 65 |
)
|
| 66 |
return decoded
|
| 67 |
except Exception as e:
|
| 68 |
-
raise HTTPException(status_code=401, detail="Invalid or expired
|
| 69 |
|
| 70 |
@app.put("/supabase/add/recipe")
|
| 71 |
def add_recipe_to_supabase(recipe: Recipe, token_data=Depends(verify_token)):
|
|
@@ -126,14 +124,15 @@ async def get_recipe_by_id(id: str):
|
|
| 126 |
raise HTTPException(status_code=500, detail=str(e))
|
| 127 |
|
| 128 |
@app.delete("/supabase/delrecipe")
|
| 129 |
-
async def delete_recipe(data: DeleteRecipeRequest):
|
| 130 |
recipe = supabase.table("recipes").select("*").eq("id", data.id).single().execute()
|
|
|
|
| 131 |
|
| 132 |
if not recipe.data:
|
| 133 |
raise HTTPException(status_code=404, detail="Recipe not found")
|
| 134 |
|
| 135 |
-
if recipe.data["user_id"] !=
|
| 136 |
-
raise HTTPException(status_code=403, detail="
|
| 137 |
|
| 138 |
supabase.table("recipes").delete().eq("id", data.id).execute()
|
| 139 |
|
|
@@ -144,26 +143,23 @@ def status():
|
|
| 144 |
return {"status": "ok"}
|
| 145 |
|
| 146 |
@app.patch("/supabase/edit/recipe")
|
| 147 |
-
async def edit_recipe(request: Request, id: str, update: RecipeUpdate):
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
|
| 157 |
-
|
| 158 |
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
|
| 164 |
-
except Exception as e:
|
| 165 |
-
print("EXCEPTION:", e)
|
| 166 |
-
raise HTTPException(status_code=500, detail=str(e))
|
| 167 |
@app.get("/supabase/recipes/paged")
|
| 168 |
def get_recipes_paged(
|
| 169 |
limit: int = Query(12, ge=1),
|
|
|
|
| 46 |
ingredients: Optional[List[str]]
|
| 47 |
description: Optional[str]
|
| 48 |
instructions: Optional[str]
|
|
|
|
| 49 |
|
| 50 |
class DeleteRecipeRequest(BaseModel):
|
| 51 |
id: str
|
|
|
|
| 52 |
|
| 53 |
security = HTTPBearer()
|
| 54 |
|
|
|
|
| 63 |
)
|
| 64 |
return decoded
|
| 65 |
except Exception as e:
|
| 66 |
+
raise HTTPException(status_code=401, detail="Invalid or expired authorization")
|
| 67 |
|
| 68 |
@app.put("/supabase/add/recipe")
|
| 69 |
def add_recipe_to_supabase(recipe: Recipe, token_data=Depends(verify_token)):
|
|
|
|
| 124 |
raise HTTPException(status_code=500, detail=str(e))
|
| 125 |
|
| 126 |
@app.delete("/supabase/delrecipe")
|
| 127 |
+
async def delete_recipe(data: DeleteRecipeRequest, token_data=Depends(verify_token)):
|
| 128 |
recipe = supabase.table("recipes").select("*").eq("id", data.id).single().execute()
|
| 129 |
+
user_id = token_data['sub']
|
| 130 |
|
| 131 |
if not recipe.data:
|
| 132 |
raise HTTPException(status_code=404, detail="Recipe not found")
|
| 133 |
|
| 134 |
+
if recipe.data["user_id"] != user_id:
|
| 135 |
+
raise HTTPException(status_code=403, detail="Deletion Aborted: Authorization required not found to complete this interaction")
|
| 136 |
|
| 137 |
supabase.table("recipes").delete().eq("id", data.id).execute()
|
| 138 |
|
|
|
|
| 143 |
return {"status": "ok"}
|
| 144 |
|
| 145 |
@app.patch("/supabase/edit/recipe")
|
| 146 |
+
async def edit_recipe(request: Request, id: str, update: RecipeUpdate, token_data=Depends(verify_token)):
|
| 147 |
+
user_id = token_data['sub']
|
| 148 |
+
update_dict = update.dict(exclude_none=True)
|
| 149 |
+
if not update_dict:
|
| 150 |
+
raise HTTPException(status_code=400, detail="No fields provided to update.")
|
| 151 |
|
| 152 |
+
ownership_check = supabase.table("recipes").select("user_id").eq("id", id).single().execute()
|
| 153 |
+
if ownership_check.data["user_id"] != user_id:
|
| 154 |
+
raise HTTPException(status_code=403, detail="Edit Aborted: Authorization required not found to complete this interaction")
|
| 155 |
|
| 156 |
+
response = supabase.table("recipes").update(update_dict).eq("id", id).execute()
|
| 157 |
|
| 158 |
+
return JSONResponse(content={
|
| 159 |
+
"message": "Recipe updated successfully.",
|
| 160 |
+
"data": response.data
|
| 161 |
+
})
|
| 162 |
|
|
|
|
|
|
|
|
|
|
| 163 |
@app.get("/supabase/recipes/paged")
|
| 164 |
def get_recipes_paged(
|
| 165 |
limit: int = Query(12, ge=1),
|