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