107 lines
3.7 KiB
Python
107 lines
3.7 KiB
Python
from flask import jsonify, request
|
|
from db.handlers.product_handler import get_products_with_filters, get_product_by_id
|
|
from flask import Blueprint
|
|
|
|
api_product = Blueprint('api_product', __name__, url_prefix='/products')
|
|
|
|
def clean_filter_value(value):
|
|
"""Очищает значение фильтра от мусора. Возвращает очищенное значение или None, если оно пустое."""
|
|
if value is None:
|
|
return None
|
|
if isinstance(value, str):
|
|
cleaned = value.strip().rstrip('/')
|
|
if not cleaned:
|
|
return None
|
|
return cleaned
|
|
return value
|
|
|
|
@api_product.route('/', methods=['GET'], strict_slashes=False)
|
|
def get_products():
|
|
try:
|
|
category_id = request.args.get('categoryId', type=int)
|
|
if not category_id:
|
|
return jsonify({"error": "categoryId is required"}), 400
|
|
|
|
page = request.args.get('page', 1, type=int)
|
|
limit = request.args.get('limit', 9, type=int)
|
|
|
|
if page < 1:
|
|
page = 1
|
|
if limit < 1 or limit > 100:
|
|
limit = 9
|
|
|
|
# ✅ ИСПРАВЛЕННЫЙ МАППИНГ
|
|
filter_mapping = {
|
|
'attr_1': 'diameter',
|
|
'attr_2': 'length',
|
|
'attr_3': 'wall_thickness', # (опционально) тоже толщина
|
|
'attr_4': 'color',
|
|
'attr_5': 'stiffness_class', # SN2, SN4
|
|
'attr_6': 'wall_thickness', # <- теперь attr_6 ищет толщину стенки
|
|
'attr_7': 'angle',
|
|
'attr_8': 'fitting_type',
|
|
}
|
|
|
|
filters = {}
|
|
excluded_params = {'categoryId', 'page', 'limit'}
|
|
|
|
for key, value in request.args.items():
|
|
if key in excluded_params:
|
|
continue
|
|
|
|
real_key = filter_mapping.get(key, key)
|
|
|
|
if ',' in value:
|
|
parts = value.split(',')
|
|
cleaned_parts = []
|
|
for part in parts:
|
|
cleaned = clean_filter_value(part)
|
|
if cleaned is not None:
|
|
cleaned_parts.append(cleaned)
|
|
if cleaned_parts:
|
|
filters[real_key] = cleaned_parts
|
|
else:
|
|
cleaned = clean_filter_value(value)
|
|
if cleaned is not None:
|
|
filters[real_key] = cleaned
|
|
|
|
# Отладочный вывод (убедитесь, что здесь видно правильный ключ)
|
|
print("=== FINAL FILTERS ===", filters)
|
|
|
|
result = get_products_with_filters(
|
|
category_id=category_id,
|
|
page=page,
|
|
limit=limit,
|
|
filters=filters if filters else None
|
|
)
|
|
|
|
return jsonify(result), 200
|
|
|
|
except Exception as e:
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
|
|
@api_product.route('/<int:product_id>', methods=['GET'], strict_slashes=False)
|
|
def get_product(product_id):
|
|
try:
|
|
product = get_product_by_id(product_id)
|
|
if product:
|
|
return jsonify(product), 200
|
|
return jsonify({"error": "Product not found"}), 404
|
|
except Exception as e:
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
|
|
@api_product.route('/fetchById', methods=['GET'], strict_slashes=False)
|
|
def get_product_by_id_param():
|
|
try:
|
|
product_id = request.args.get('id', type=int)
|
|
if not product_id:
|
|
return jsonify({"error": "id parameter is required"}), 400
|
|
product = get_product_by_id(product_id)
|
|
if product:
|
|
return jsonify(product), 200
|
|
return jsonify({"error": "Product not found"}), 404
|
|
except Exception as e:
|
|
return jsonify({"error": str(e)}), 500
|