habulaj commited on
Commit
417d30a
·
verified ·
1 Parent(s): c6bd2df

Update routes/users.py

Browse files
Files changed (1) hide show
  1. routes/users.py +80 -1
routes/users.py CHANGED
@@ -216,7 +216,86 @@ async def update_user(
216
  except Exception as e:
217
  logger.error(f"❌ Erro ao atualizar usuário: {str(e)}")
218
  raise HTTPException(status_code=500, detail="Erro interno do servidor")
219
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
  @router.get("/admin/user")
221
  async def get_user_name(
222
  user_id: str = Query(..., description="ID do usuário"),
 
216
  except Exception as e:
217
  logger.error(f"❌ Erro ao atualizar usuário: {str(e)}")
218
  raise HTTPException(status_code=500, detail="Erro interno do servidor")
219
+
220
+ @router.delete("/admin/delete-feed")
221
+ async def delete_feed(
222
+ feed_id: int = Query(..., description="ID do feed a ser deletado"),
223
+ user_token: str = Header(None, alias="User-key")
224
+ ):
225
+ """
226
+ Deleta um feed, seus portfolios relacionados e as imagens no bucket.
227
+ """
228
+ try:
229
+ await verify_admin_token(user_token)
230
+
231
+ headers = SUPABASE_ROLE_HEADERS.copy()
232
+ headers["Accept"] = "application/json"
233
+
234
+ async with aiohttp.ClientSession() as session:
235
+ # Buscar o feed pelo ID
236
+ feed_query = f"{SUPABASE_URL}/rest/v1/Feeds?select=portfolios&limit=1&id=eq.{feed_id}"
237
+ async with session.get(feed_query, headers=headers) as feed_response:
238
+ if feed_response.status != 200:
239
+ raise HTTPException(status_code=feed_response.status, detail="Erro ao buscar feed")
240
+
241
+ feed_data = await feed_response.json()
242
+ if not feed_data:
243
+ raise HTTPException(status_code=404, detail="Feed não encontrado")
244
+
245
+ portfolio_ids = feed_data[0].get("portfolios", [])
246
+ if not isinstance(portfolio_ids, list):
247
+ import json
248
+ portfolio_ids = json.loads(portfolio_ids) # Caso venha como string JSON
249
+
250
+ # Buscar os portfolios para pegar os URLs das imagens
251
+ image_urls = []
252
+ if portfolio_ids:
253
+ ids_str = ",".join([str(pid) for pid in portfolio_ids])
254
+ portfolio_query = f"{SUPABASE_URL}/rest/v1/Portfolio?select=id,image_url&id=in.({ids_str})"
255
+ async with session.get(portfolio_query, headers=headers) as portfolio_response:
256
+ if portfolio_response.status == 200:
257
+ portfolio_data = await portfolio_response.json()
258
+ image_urls = [item["image_url"] for item in portfolio_data if "image_url" in item]
259
+
260
+ # Deletar os portfolios
261
+ if portfolio_ids:
262
+ delete_portfolios_url = f"{SUPABASE_URL}/rest/v1/Portfolio?id=in.({','.join(map(str, portfolio_ids))})"
263
+ async with session.delete(delete_portfolios_url, headers=headers) as delete_response:
264
+ if delete_response.status != 204:
265
+ raise HTTPException(status_code=delete_response.status, detail="Erro ao deletar portfolios")
266
+
267
+ # Deletar imagens do bucket Supabase Storage
268
+ async def delete_image_from_storage(image_url: str):
269
+ from urllib.parse import urlparse
270
+ path = urlparse(image_url).path
271
+ # Extraindo bucket e key
272
+ parts = path.strip("/").split("/")
273
+ if len(parts) < 3:
274
+ return
275
+ bucket_id = parts[1]
276
+ file_key = "/".join(parts[2:])
277
+ delete_url = f"{SUPABASE_URL}/storage/v1/object/{bucket_id}/{file_key}"
278
+ async with session.delete(delete_url, headers=headers) as delete_img_response:
279
+ if delete_img_response.status not in (200, 204):
280
+ logger.warning(f"❌ Falha ao deletar imagem: {file_key}")
281
+
282
+ await asyncio.gather(*[delete_image_from_storage(url) for url in image_urls])
283
+
284
+ # Deletar o feed
285
+ delete_feed_url = f"{SUPABASE_URL}/rest/v1/Feeds?id=eq.{feed_id}"
286
+ async with session.delete(delete_feed_url, headers=headers) as delete_feed_response:
287
+ if delete_feed_response.status != 204:
288
+ raise HTTPException(status_code=delete_feed_response.status, detail="Erro ao deletar feed")
289
+
290
+ logger.info(f"✅ Feed {feed_id} e portfolios relacionados deletados com sucesso.")
291
+ return {"message": f"Feed {feed_id} e portfolios deletados com sucesso."}
292
+
293
+ except HTTPException as he:
294
+ raise he
295
+ except Exception as e:
296
+ logger.error(f"❌ Erro ao deletar feed: {str(e)}")
297
+ raise HTTPException(status_code=500, detail="Erro interno do servidor")
298
+
299
  @router.get("/admin/user")
300
  async def get_user_name(
301
  user_id: str = Query(..., description="ID do usuário"),