catalog.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. from fastapi import APIRouter, Depends, HTTPException, Request
  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. from services.audit_service import audit_service
  9. router = APIRouter(tags=["catalog"])
  10. @router.get("/materials", response_model=List[schemas.MaterialBase])
  11. async def get_materials():
  12. rows = db.execute_query("SELECT * FROM materials WHERE is_active = TRUE")
  13. for r in rows:
  14. if r.get('available_colors') and isinstance(r['available_colors'], str):
  15. try: r['available_colors'] = json.loads(r['available_colors'])
  16. except: r['available_colors'] = []
  17. return rows
  18. @router.get("/services", response_model=List[schemas.ServiceBase])
  19. async def get_services():
  20. return db.execute_query("SELECT * FROM services WHERE is_active = TRUE")
  21. @router.get("/admin/materials", response_model=List[schemas.MaterialBase])
  22. async def admin_get_materials(admin: dict = Depends(require_admin)):
  23. rows = db.execute_query("SELECT * FROM materials ORDER BY id DESC")
  24. for r in rows:
  25. if r.get('available_colors') and isinstance(r['available_colors'], str):
  26. try: r['available_colors'] = json.loads(r['available_colors'])
  27. except: r['available_colors'] = []
  28. return rows
  29. @router.post("/admin/materials")
  30. async def admin_create_material(request: Request, data: schemas.MaterialCreate, admin: dict = Depends(require_admin)):
  31. colors_json = json.dumps(data.available_colors) if data.available_colors else None
  32. 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)"
  33. 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)
  34. mat_id = db.execute_commit(query, params)
  35. await audit_service.log(
  36. user_id=admin.get("id"),
  37. action="create_material",
  38. target_type="material",
  39. target_id=mat_id,
  40. details=data.dict(),
  41. request=request
  42. )
  43. return {"id": mat_id}
  44. @router.patch("/admin/materials/{mat_id}")
  45. async def admin_update_material(request: Request, mat_id: int, data: schemas.MaterialUpdate, admin: dict = Depends(require_admin)):
  46. update_fields = []
  47. params = []
  48. for field, value in data.dict(exclude_unset=True).items():
  49. update_fields.append(f"{field} = %s")
  50. if isinstance(value, list):
  51. params.append(json.dumps(value))
  52. else:
  53. params.append(value)
  54. if update_fields:
  55. query = f"UPDATE materials SET {', '.join(update_fields)} WHERE id = %s"
  56. params.append(mat_id)
  57. db.execute_commit(query, tuple(params))
  58. await audit_service.log(
  59. user_id=admin.get("id"),
  60. action="update_material",
  61. target_type="material",
  62. target_id=mat_id,
  63. details={"updated_fields": data.dict(exclude_unset=True)},
  64. request=request
  65. )
  66. return {"id": mat_id}
  67. @router.get("/admin/services", response_model=List[schemas.ServiceBase])
  68. async def admin_get_services(admin: dict = Depends(require_admin)):
  69. return db.execute_query("SELECT * FROM services ORDER BY id DESC")
  70. @router.post("/admin/services")
  71. async def admin_create_service(request: Request, data: schemas.ServiceCreate, admin: dict = Depends(require_admin)):
  72. 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)"
  73. 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))
  74. await audit_service.log(
  75. user_id=admin.get("id"),
  76. action="create_service",
  77. target_type="service",
  78. target_id=srv_id,
  79. details=data.dict(),
  80. request=request
  81. )
  82. return {"id": srv_id}
  83. @router.patch("/admin/services/{srv_id}")
  84. async def admin_update_service(request: Request, srv_id: int, data: schemas.ServiceUpdate, admin: dict = Depends(require_admin)):
  85. update_fields = []
  86. params = []
  87. for field, value in data.dict(exclude_unset=True).items():
  88. update_fields.append(f"{field} = %s")
  89. if isinstance(value, list):
  90. params.append(json.dumps(value))
  91. else:
  92. params.append(value)
  93. if update_fields:
  94. query = f"UPDATE services SET {', '.join(update_fields)} WHERE id = %s"
  95. params.append(srv_id)
  96. db.execute_commit(query, tuple(params))
  97. await audit_service.log(
  98. user_id=admin.get("id"),
  99. action="update_service",
  100. target_type="service",
  101. target_id=srv_id,
  102. details={"updated_fields": data.dict(exclude_unset=True)},
  103. request=request
  104. )
  105. return {"id": srv_id}
  106. @router.delete("/admin/materials/{mat_id}")
  107. async def admin_delete_material(request: Request, mat_id: int, admin: dict = Depends(require_admin)):
  108. db.execute_commit("DELETE FROM materials WHERE id = %s", (mat_id,))
  109. await audit_service.log(
  110. user_id=admin.get("id"),
  111. action="delete_material",
  112. target_type="material",
  113. target_id=mat_id,
  114. request=request
  115. )
  116. return {"id": mat_id, "status": "deleted"}
  117. @router.delete("/admin/services/{srv_id}")
  118. async def admin_delete_service(request: Request, srv_id: int, admin: dict = Depends(require_admin)):
  119. db.execute_commit("DELETE FROM services WHERE id = %s", (srv_id,))
  120. await audit_service.log(
  121. user_id=admin.get("id"),
  122. action="delete_service",
  123. target_type="service",
  124. target_id=srv_id,
  125. request=request
  126. )
  127. return {"id": srv_id, "status": "deleted"}