catalog.py 4.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from fastapi import APIRouter, Depends, HTTPException
  2. from typing import List, Optional
  3. import db
  4. import schemas
  5. import auth_utils
  6. import json
  7. from dependencies import require_admin
  8. router = APIRouter(tags=["catalog"])
  9. @router.get("/materials", response_model=List[schemas.MaterialBase])
  10. async def get_materials():
  11. rows = db.execute_query("SELECT * FROM materials WHERE is_active = TRUE")
  12. for r in rows:
  13. if r.get('available_colors') and isinstance(r['available_colors'], str):
  14. try: r['available_colors'] = json.loads(r['available_colors'])
  15. except: r['available_colors'] = []
  16. return rows
  17. @router.get("/services", response_model=List[schemas.ServiceBase])
  18. async def get_services():
  19. return db.execute_query("SELECT * FROM services WHERE is_active = TRUE")
  20. @router.get("/admin/materials", response_model=List[schemas.MaterialBase])
  21. async def admin_get_materials(admin: dict = Depends(require_admin)):
  22. rows = db.execute_query("SELECT * FROM materials ORDER BY id DESC")
  23. for r in rows:
  24. if r.get('available_colors') and isinstance(r['available_colors'], str):
  25. try: r['available_colors'] = json.loads(r['available_colors'])
  26. except: r['available_colors'] = []
  27. return rows
  28. @router.post("/admin/materials")
  29. async def admin_create_material(data: schemas.MaterialCreate, admin: dict = Depends(require_admin)):
  30. colors_json = json.dumps(data.available_colors) if data.available_colors else None
  31. query = "INSERT INTO materials (name_en, name_ru, name_ua, name_me, desc_en, desc_ru, desc_ua, desc_me, long_desc_en, long_desc_ru, long_desc_ua, long_desc_me, price_per_cm3, available_colors, is_active) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
  32. params = (data.name_en, data.name_ru, data.name_ua, data.name_me, data.desc_en, data.desc_ru, data.desc_ua, data.desc_me, data.long_desc_en, data.long_desc_ru, data.long_desc_ua, data.long_desc_me, data.price_per_cm3, colors_json, data.is_active)
  33. mat_id = db.execute_commit(query, params)
  34. return {"id": mat_id}
  35. @router.patch("/admin/materials/{mat_id}")
  36. async def admin_update_material(mat_id: int, data: schemas.MaterialUpdate, admin: dict = Depends(require_admin)):
  37. update_fields = []
  38. params = []
  39. for field, value in data.dict(exclude_unset=True).items():
  40. update_fields.append(f"{field} = %s")
  41. if isinstance(value, list):
  42. params.append(json.dumps(value))
  43. else:
  44. params.append(value)
  45. if update_fields:
  46. query = f"UPDATE materials SET {', '.join(update_fields)} WHERE id = %s"
  47. params.append(mat_id)
  48. db.execute_commit(query, tuple(params))
  49. return {"id": mat_id}
  50. @router.delete("/admin/materials/{mat_id}")
  51. async def admin_delete_material(mat_id: int, admin: dict = Depends(require_admin)):
  52. db.execute_commit("DELETE FROM materials WHERE id = %s", (mat_id,))
  53. return {"id": mat_id, "status": "deleted"}
  54. @router.get("/admin/services", response_model=List[schemas.ServiceBase])
  55. async def admin_get_services(admin: dict = Depends(require_admin)):
  56. return db.execute_query("SELECT * FROM services ORDER BY id DESC")
  57. @router.post("/admin/services")
  58. async def admin_create_service(data: schemas.ServiceCreate, admin: dict = Depends(require_admin)):
  59. query = "INSERT INTO services (name_en, name_ru, name_ua, name_me, desc_en, desc_ru, desc_ua, desc_me, tech_type, is_active) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
  60. srv_id = db.execute_commit(query, (data.name_en, data.name_ru, data.name_ua, data.name_me, data.desc_en, data.desc_ru, data.desc_ua, data.desc_me, data.tech_type, data.is_active))
  61. return {"id": srv_id}
  62. @router.patch("/admin/services/{srv_id}")
  63. async def admin_update_service(srv_id: int, data: schemas.ServiceUpdate, admin: dict = Depends(require_admin)):
  64. update_fields = []
  65. params = []
  66. for field, value in data.dict(exclude_unset=True).items():
  67. update_fields.append(f"{field} = %s")
  68. if isinstance(value, list):
  69. params.append(json.dumps(value))
  70. else:
  71. params.append(value)
  72. if update_fields:
  73. query = f"UPDATE services SET {', '.join(update_fields)} WHERE id = %s"
  74. params.append(srv_id)
  75. db.execute_commit(query, tuple(params))
  76. return {"id": srv_id}
  77. @router.delete("/admin/services/{srv_id}")
  78. async def admin_delete_service(srv_id: int, admin: dict = Depends(require_admin)):
  79. db.execute_commit("DELETE FROM services WHERE id = %s", (srv_id,))
  80. return {"id": srv_id, "status": "deleted"}