summaryrefslogtreecommitdiff
path: root/src2/pages/api/shop/search.js
blob: ad986c8634beea9ba3c602346614efd0c96cbb96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import axios from "axios";

const productResponseMap = (products) => {
  return products.map((product) => {
    let productMapped = {
      id: product.product_id ? product.product_id[0] : '',
      image: product.image ? product.image[0] : '',
      code: product.default_code ? product.default_code[0] : '',
      name: product.product_name ? product.product_name[0] : '',
      lowest_price: {
        price: product.price ? product.price[0] : 0,
        price_discount: product.price_discount ? product.price_discount[0] : 0,
        discount_percentage: product.discount ? product.discount[0] : 0,
      },
      variant_total: product.variant_total ? product.variant_total[0] : 0,
      stock_total: product.stock_total ? product.stock_total[0] : 0,
      weight: product.weight ? product.weight[0] : 0,
      manufacture: {},
      categories: [],
    };

    if (product.manufacture_id && product.brand) {
      productMapped.manufacture = {
        id: product.manufacture_id ? product.manufacture_id[0] : '',
        name: product.brand ? product.brand[0] : '',
      };
    }

    productMapped.categories = [
      {
        id: product.category_id ? product.category_id[0] : '',
        name: product.category_name ? product.category_name[0] : '',
      }
    ];

    return productMapped;
  });
}

export default async function handler(req, res) {
  const { 
    q, 
    page = 1,
    brand = '',
    category = '',
    price_from = 0,
    price_to = 0,
    order_by = ''
  } = req.query;

  let paramOrderBy = '';
  switch (order_by) {
    case 'price-asc':
      paramOrderBy = ', price_discount ASC';
      break;
    case 'price-desc':
      paramOrderBy = ', price_discount DESC';
      break;
    case 'popular':
      paramOrderBy = ', search_rank DESC';
      break;
    case 'stock':
      paramOrderBy = ', stock_total DESC';
      break;
  }

  let limit = 30;
  let offset = (page - 1) * limit;
  let parameter = [
    `facet.query=${q}`,
    'facet=true',
    'indent=true',
    'q.op=AND',
    `q=${q}`,
    'facet.field=brand_str',
    'facet.field=category_name_str',
    `start=${offset}`,
    `rows=${limit}`,
    `sort=product_rating DESC ${paramOrderBy}`,
    `fq=price_discount:[${price_from == '' ? '*' : price_from} TO ${price_to == '' ? '*' : price_to}]`
  ];

  if (brand) parameter.push(`fq=brand:${brand}`);
  if (category) parameter.push(`fq=category_name:${category}`);
  
  let result = await axios(process.env.SOLR_HOST + '/solr/products/select?' + parameter.join('&'));
  try {
    result.data.response.products = productResponseMap(result.data.response.docs);
    result.data.responseHeader.params.start = parseInt(result.data.responseHeader.params.start);
    result.data.responseHeader.params.rows = parseInt(result.data.responseHeader.params.rows);
    delete result.data.response.docs;
    res.status(200).json(result.data);
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
}