Update routes/users.py
Browse files- 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"),
|