summaryrefslogtreecommitdiff
path: root/src-migrate/services/product.ts
blob: 2152ba266932de78fcc2a1a3e8fb8e4da7036a65 (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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { IProduct, IProductDetail } from '~/types/product';
import snakeCase from 'snakecase-keys';
import odooApi from '~/libs/odooApi';
import { ICategoryBreadcrumb } from '~/types/category';
import productSearchApi from '../../src/lib/product/api/productSearchApi'

const SELF_HOST = process.env.NEXT_PUBLIC_SELF_HOST;

export const getProductById = async (
  id: string,
  tier: string
): Promise<IProductDetail | null> => {
  const url = `${SELF_HOST}/api/shop/product-detail`;
  const params = new URLSearchParams({ id, auth: tier });
  return await fetch(`${url}?${params.toString()}`)
    .then((res) => res.json())
    .then((res) => {
      if (res.length > 0) return snakeCase(res[0]) as IProductDetail;
      return null;
    });
};

export interface GetProductSimilarProps {
  source?: string;
  name: string;
  except?: {
    productId?: number;
    manufactureId?: number;
  };
  limit?: number;
}

export interface GetProductSimilarRes {
  products: IProduct[];
  num_found: number;
  num_found_exact: boolean;
  start: number;
  source: string;
}

export const getProductSimilar = async ({
  name,
  except,
  limit = 30,
  source,
}: GetProductSimilarProps): Promise<GetProductSimilarRes> => {
  let dataflashSale = null
  const flashSale = await odooApi('GET', '/api/v1/flashsale/header')
  if (flashSale && flashSale.length > 0) {
    const dataFlash = await productSearchApi({
      query: `fq=flashsale_id_i:${flashSale[0].pricelist_id}&fq=flashsale_price_f:[1 TO *]&limit=${
        source === 'bottom' ? '4' : '1'
      }`,
      operation: 'AND'
    })
    
    dataflashSale = dataFlash.response.products.map((product: {
      qtySold: any;
      stockTotal: any;
      flashSale: any; 
      lowestPrice: any;
 }) => ({
      ...product,
      lowest_price: {
        discount_percentage: product.lowestPrice.discountPercentage,
        price: product.lowestPrice.price,
        price_discount: product.lowestPrice.priceDiscount,
      },
      flash_sale: product.flashSale,
      stock_total: product.stockTotal,
      qty_sold: product.qtySold,
    }));
    if (source === 'bottom') {
      dataflashSale = dataflashSale.slice('2', '4')
    } else {
      dataflashSale = dataflashSale
    }
  }
  const query = [
    `q=${name}`,
    'page=1',
    'orderBy=popular-weekly',
    'operation=OR',
    'priceFrom=1',
  ];
  if (except?.productId) query.push(`fq=-product_id_i:${except.productId}`);
  if (except?.manufactureId)
    query.push(`fq=-manufacture_id_i:${except.manufactureId}`);
  const url = `${SELF_HOST}/api/shop/search?${query.join('&')}`;

  const fetchedData = await fetch(url)
    .then((res) => res.json())
    .then((res) => snakeCase(res.response));

  if (dataflashSale) {
    fetchedData.products = [
      ...dataflashSale,
      ...fetchedData.products
    ]
  } else {
    fetchedData.products = [...fetchedData.products]
  }

  return fetchedData;
};

export const getProductCategoryBreadcrumb = async (
  id: number
): Promise<ICategoryBreadcrumb[]> => {
  return await odooApi('GET', `/api/v1/product/${id}/category-breadcrumb`);
};