from fastapi import APIRouter, Depends, HTTPException from typing import List import db import schemas import auth_utils router = APIRouter(tags=["catalog"]) @router.get("/materials", response_model=List[schemas.MaterialBase]) async def get_materials(): return db.execute_query("SELECT * FROM materials WHERE is_active = TRUE") @router.get("/services", response_model=List[schemas.ServiceBase]) async def get_services(): return db.execute_query("SELECT id, name_key, description_key, tech_type, is_active FROM services WHERE is_active = TRUE") @router.get("/admin/materials") async def admin_get_materials(token: str = Depends(auth_utils.oauth2_scheme)): payload = auth_utils.decode_token(token) if not payload or payload.get("role") != 'admin': raise HTTPException(status_code=403, detail="Admin role required") return db.execute_query("SELECT * FROM materials ORDER BY id DESC") @router.post("/admin/materials") async def admin_create_material(data: schemas.MaterialCreate, token: str = Depends(auth_utils.oauth2_scheme)): payload = auth_utils.decode_token(token) if not payload or payload.get("role") != 'admin': raise HTTPException(status_code=403, detail="Admin role required") query = "INSERT INTO materials (name_en, name_ru, name_me, desc_en, desc_ru, desc_me, price_per_cm3, is_active) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)" params = (data.name_en, data.name_ru, data.name_me, data.desc_en, data.desc_ru, data.desc_me, data.price_per_cm3, data.is_active) mat_id = db.execute_commit(query, params) return {"id": mat_id} @router.patch("/admin/materials/{mat_id}") async def admin_update_material(mat_id: int, data: schemas.MaterialUpdate, token: str = Depends(auth_utils.oauth2_scheme)): payload = auth_utils.decode_token(token) if not payload or payload.get("role") != 'admin': raise HTTPException(status_code=403, detail="Admin role required") update_fields = [] params = [] for field, value in data.dict(exclude_unset=True).items(): update_fields.append(f"{field} = %s") params.append(value) if update_fields: query = f"UPDATE materials SET {', '.join(update_fields)} WHERE id = %s" params.append(mat_id) db.execute_commit(query, tuple(params)) return {"id": mat_id} @router.delete("/admin/materials/{mat_id}") async def admin_delete_material(mat_id: int, token: str = Depends(auth_utils.oauth2_scheme)): payload = auth_utils.decode_token(token) if not payload or payload.get("role") != 'admin': raise HTTPException(status_code=403, detail="Admin role required") db.execute_commit("DELETE FROM materials WHERE id = %s", (mat_id,)) return {"id": mat_id, "status": "deleted"} @router.get("/admin/services") async def admin_get_services(token: str = Depends(auth_utils.oauth2_scheme)): payload = auth_utils.decode_token(token) if not payload or payload.get("role") != 'admin': raise HTTPException(status_code=403, detail="Admin role required") return db.execute_query("SELECT * FROM services ORDER BY id DESC") @router.post("/admin/services") async def admin_create_service(data: schemas.ServiceCreate, token: str = Depends(auth_utils.oauth2_scheme)): payload = auth_utils.decode_token(token) if not payload or payload.get("role") != 'admin': raise HTTPException(status_code=403, detail="Admin role required") query = "INSERT INTO services (name_key, description_key, tech_type, is_active) VALUES (%s, %s, %s, %s)" srv_id = db.execute_commit(query, (data.name_key, data.description_key, data.tech_type, data.is_active)) return {"id": srv_id} @router.patch("/admin/services/{srv_id}") async def admin_update_service(srv_id: int, data: schemas.ServiceUpdate, token: str = Depends(auth_utils.oauth2_scheme)): payload = auth_utils.decode_token(token) if not payload or payload.get("role") != 'admin': raise HTTPException(status_code=403, detail="Admin role required") update_fields = [] params = [] for field, value in data.dict(exclude_unset=True).items(): update_fields.append(f"{field} = %s") params.append(value) if update_fields: query = f"UPDATE services SET {', '.join(update_fields)} WHERE id = %s" params.append(srv_id) db.execute_commit(query, tuple(params)) return {"id": srv_id} @router.delete("/admin/services/{srv_id}") async def admin_delete_service(srv_id: int, token: str = Depends(auth_utils.oauth2_scheme)): payload = auth_utils.decode_token(token) if not payload or payload.get("role") != 'admin': raise HTTPException(status_code=403, detail="Admin role required") db.execute_commit("DELETE FROM services WHERE id = %s", (srv_id,)) return {"id": srv_id, "status": "deleted"}