import makeRequest from "@root/api/makeRequest"; import type { CreatePromocodeBody, EditPromocodeBody, GetPromocodeListBody, Promocode, PromocodeList, PromocodeStatistics, } from "@root/model/promocodes"; import { parseAxiosError } from "@root/utils/parse-error"; import { isAxiosError } from "axios"; const baseUrl = process.env.REACT_APP_DOMAIN + "/codeword/promocode"; const getPromocodeList = async (body: GetPromocodeListBody) => { try { const promocodeListResponse = await makeRequest({ url: baseUrl + "/getList", method: "POST", body, useToken: false, }); return promocodeListResponse; } catch (nativeError) { const [error] = parseAxiosError(nativeError); throw new Error(`Ошибка при получении списка промокодов. ${error}`); } }; const createFastlink = async (id: string) => { try { return await makeRequest<{ id: string }, { fastlink: string }>({ url: baseUrl + "/fastlink", method: "POST", body: { id }, }); } catch (nativeError) { const [error] = parseAxiosError(nativeError); throw new Error(`Ошибка при создании фастлинка. ${error}`); } }; export const getAllPromocodes = async () => { try { const promocodes: Promocode[] = []; let page = 0; while (true) { const promocodeList = await getPromocodeList({ limit: 100, filter: { active: true, }, page, }); if (promocodeList.items.length === 0) break; promocodes.push(...promocodeList.items); page++; } return promocodes; } catch (nativeError) { const [error] = parseAxiosError(nativeError); throw new Error(`Ошибка при получении списка промокодов. ${error}`); } }; export const getNotActivePromocodes = async () => { try { const promocodes: Promocode[] = []; let page = 0; while (true) { const promocodeList = await getPromocodeList({ limit: 100, filter: { active: false, }, page, }); if (promocodeList.items.length === 0) break; promocodes.push(...promocodeList.items); page++; } return promocodes; } catch (nativeError) { const [error] = parseAxiosError(nativeError); throw new Error(`Ошибка при получении списка промокодов. ${error}`); } }; const createPromocode = async (body: CreatePromocodeBody) => { try { const createPromocodeResponse = await makeRequest({ url: baseUrl + "/create", method: "POST", body, useToken: false, }); return createPromocodeResponse; } catch (nativeError) { if (isAxiosError(nativeError) && nativeError.response?.data.error === "Duplicate Codeword") { throw new Error(`Промокод уже существует`); } const [error] = parseAxiosError(nativeError); throw new Error(`Ошибка создания промокода. ${error}`); } }; const editPromocode = async (body: EditPromocodeBody) => { try { const editPromocodeResponse = await makeRequest({ url: process.env.REACT_APP_DOMAIN + "/codeword/promocode" + "/edit", method: "PUT", body, }); return [editPromocodeResponse]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); return [null, `Ошибка редактирования промокода. ${error}`]; } }; const deletePromocode = async (id: string): Promise => { try { await makeRequest({ url: `${baseUrl}/${id}`, method: "DELETE", useToken: false, }); } catch (nativeError) { const [error] = parseAxiosError(nativeError); throw new Error(`Ошибка удаления промокода. ${error}`); } }; const getPromocodeStatistics = async (id: string, from: number, to: number) => { try { const promocodeStatisticsResponse = await makeRequest({ url: baseUrl + `/stats`, body: { id: id, from: from, to: to, }, method: "POST", useToken: false, }); return promocodeStatisticsResponse; } catch (nativeError) { const [error] = parseAxiosError(nativeError); throw new Error(`Ошибка при получении статистики промокода. ${error}`); } }; export const promocodeApi = { getPromocodeList, createPromocode, editPromocode, deletePromocode, getAllPromocodes, getNotActivePromocodes, getPromocodeStatistics, createFastlink, };