2024-04-16 19:01:22 +00:00
|
|
|
import makeRequest from "@root/api/makeRequest";
|
2024-03-26 15:41:22 +00:00
|
|
|
|
|
|
|
|
import type {
|
2024-05-22 13:48:38 +00:00
|
|
|
CreatePromocodeBody,
|
2024-05-21 08:53:09 +00:00
|
|
|
EditPromocodeBody,
|
2024-05-22 13:48:38 +00:00
|
|
|
GetPromocodeListBody,
|
|
|
|
|
Promocode,
|
|
|
|
|
PromocodeList,
|
|
|
|
|
PromocodeStatistics,
|
2024-03-26 15:41:22 +00:00
|
|
|
} from "@root/model/promocodes";
|
2024-03-03 07:57:12 +00:00
|
|
|
|
|
|
|
|
import { parseAxiosError } from "@root/utils/parse-error";
|
2024-03-22 10:27:15 +00:00
|
|
|
import { isAxiosError } from "axios";
|
2024-03-03 07:57:12 +00:00
|
|
|
|
2024-05-22 13:48:38 +00:00
|
|
|
type PromocodeStatisticsBody = {
|
|
|
|
|
id: string;
|
|
|
|
|
from: number;
|
|
|
|
|
to: number;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const API_URL = `${process.env.REACT_APP_DOMAIN}/codeword/promocode`;
|
2024-03-03 07:57:12 +00:00
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
const getPromocodeList = async (body: GetPromocodeListBody): Promise<[PromocodeList | null, string?]> => {
|
2024-05-21 07:41:31 +00:00
|
|
|
try {
|
|
|
|
|
const promocodeListResponse = await makeRequest<GetPromocodeListBody, PromocodeList>({
|
|
|
|
|
method: "POST",
|
2024-05-22 13:48:38 +00:00
|
|
|
url: `${API_URL}/getList`,
|
2024-05-21 07:41:31 +00:00
|
|
|
body,
|
|
|
|
|
useToken: false,
|
|
|
|
|
});
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
return [promocodeListResponse];
|
2024-05-21 07:41:31 +00:00
|
|
|
} catch (nativeError) {
|
|
|
|
|
const [error] = parseAxiosError(nativeError);
|
2024-05-23 12:01:51 +00:00
|
|
|
|
|
|
|
|
return [null, `Ошибка при получении списка промокодов. ${error}`];
|
2024-05-21 07:41:31 +00:00
|
|
|
}
|
2024-03-03 07:57:12 +00:00
|
|
|
};
|
2024-05-23 12:01:51 +00:00
|
|
|
const createFastlink = async (id: string): Promise<[{ fastlink: string } | null, string?]> => {
|
2024-05-21 07:41:31 +00:00
|
|
|
try {
|
2024-05-23 12:01:51 +00:00
|
|
|
const createFastLinkResponse = await makeRequest<{ id: string }, { fastlink: string }>({
|
2024-05-22 13:48:38 +00:00
|
|
|
url: `${API_URL}/fastlink`,
|
2024-05-21 07:41:31 +00:00
|
|
|
method: "POST",
|
|
|
|
|
body: { id },
|
|
|
|
|
});
|
2024-05-23 12:01:51 +00:00
|
|
|
|
|
|
|
|
return [createFastLinkResponse];
|
2024-05-21 07:41:31 +00:00
|
|
|
} catch (nativeError) {
|
|
|
|
|
const [error] = parseAxiosError(nativeError);
|
2024-05-23 12:01:51 +00:00
|
|
|
|
|
|
|
|
return [null, `Ошибка при создании фастлинка. ${error}`];
|
2024-05-21 07:41:31 +00:00
|
|
|
}
|
2024-03-30 20:54:37 +00:00
|
|
|
};
|
2024-03-03 07:57:12 +00:00
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
export const getAllPromocodes = async (): Promise<[Promocode[] | null, string?]> => {
|
2024-05-21 07:41:31 +00:00
|
|
|
try {
|
|
|
|
|
const promocodes: Promocode[] = [];
|
|
|
|
|
|
|
|
|
|
let page = 0;
|
|
|
|
|
while (true) {
|
2024-05-23 12:01:51 +00:00
|
|
|
const [promocodeList] = await getPromocodeList({
|
2024-05-21 07:41:31 +00:00
|
|
|
limit: 100,
|
|
|
|
|
filter: {
|
|
|
|
|
active: true,
|
|
|
|
|
},
|
|
|
|
|
page,
|
|
|
|
|
});
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
if (promocodeList) {
|
|
|
|
|
if (promocodeList.items.length === 0) break;
|
2024-05-21 07:41:31 +00:00
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
promocodes.push(...promocodeList.items);
|
|
|
|
|
page++;
|
|
|
|
|
}
|
2024-05-21 07:41:31 +00:00
|
|
|
}
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
return [promocodes];
|
2024-05-21 07:41:31 +00:00
|
|
|
} catch (nativeError) {
|
|
|
|
|
const [error] = parseAxiosError(nativeError);
|
2024-05-23 12:01:51 +00:00
|
|
|
|
|
|
|
|
return [null, `Ошибка при получении списка промокодов. ${error}`];
|
2024-05-21 07:41:31 +00:00
|
|
|
}
|
2024-03-27 17:31:51 +00:00
|
|
|
};
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
export const getNotActivePromocodes = async (): Promise<[Promocode[] | null, string?]> => {
|
2024-05-22 13:48:38 +00:00
|
|
|
try {
|
|
|
|
|
const promocodes: Promocode[] = [];
|
|
|
|
|
|
|
|
|
|
let page = 0;
|
|
|
|
|
while (true) {
|
2024-05-23 12:01:51 +00:00
|
|
|
const [promocodeList] = await getPromocodeList({
|
2024-05-22 13:48:38 +00:00
|
|
|
limit: 100,
|
|
|
|
|
filter: {
|
|
|
|
|
active: false,
|
|
|
|
|
},
|
|
|
|
|
page,
|
|
|
|
|
});
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
if (promocodeList) {
|
|
|
|
|
if (promocodeList.items.length === 0) break;
|
2024-05-22 13:48:38 +00:00
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
promocodes.push(...promocodeList.items);
|
|
|
|
|
page++;
|
|
|
|
|
}
|
2024-05-22 13:48:38 +00:00
|
|
|
}
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
return [promocodes];
|
2024-05-22 13:48:38 +00:00
|
|
|
} catch (nativeError) {
|
|
|
|
|
const [error] = parseAxiosError(nativeError);
|
2024-05-23 12:01:51 +00:00
|
|
|
|
|
|
|
|
return [null, `Ошибка при получении списка промокодов. ${error}`];
|
2024-05-22 13:48:38 +00:00
|
|
|
}
|
2024-05-08 02:10:07 +00:00
|
|
|
};
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
const createPromocode = async (body: CreatePromocodeBody): Promise<[Promocode | null, string?]> => {
|
2024-05-21 07:41:31 +00:00
|
|
|
try {
|
|
|
|
|
const createPromocodeResponse = await makeRequest<CreatePromocodeBody, Promocode>({
|
|
|
|
|
method: "POST",
|
2024-05-22 13:48:38 +00:00
|
|
|
url: `${API_URL}/create`,
|
2024-05-21 07:41:31 +00:00
|
|
|
body,
|
|
|
|
|
useToken: false,
|
|
|
|
|
});
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
return [createPromocodeResponse];
|
2024-05-21 07:41:31 +00:00
|
|
|
} catch (nativeError) {
|
2024-05-23 12:01:51 +00:00
|
|
|
const [error] = parseAxiosError(nativeError);
|
|
|
|
|
|
2024-05-21 07:41:31 +00:00
|
|
|
if (isAxiosError(nativeError) && nativeError.response?.data.error === "Duplicate Codeword") {
|
2024-05-23 12:01:51 +00:00
|
|
|
return [null, `Промокод уже существует`];
|
2024-05-21 07:41:31 +00:00
|
|
|
}
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
return [null, `Ошибка создания промокода. ${error}`];
|
2024-05-21 07:41:31 +00:00
|
|
|
}
|
2024-03-03 07:57:12 +00:00
|
|
|
};
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
const editPromocode = async (body: EditPromocodeBody): Promise<[Promocode | null, string?]> => {
|
2024-05-22 13:48:38 +00:00
|
|
|
try {
|
|
|
|
|
const editPromocodeResponse = await makeRequest<EditPromocodeBody, Promocode>({
|
|
|
|
|
method: "PUT",
|
|
|
|
|
url: `${API_URL}/codeword/promocode/edit`,
|
|
|
|
|
body,
|
|
|
|
|
});
|
2024-05-23 12:01:51 +00:00
|
|
|
|
2024-05-22 13:48:38 +00:00
|
|
|
return [editPromocodeResponse];
|
|
|
|
|
} catch (nativeError) {
|
|
|
|
|
const [error] = parseAxiosError(nativeError);
|
2024-05-23 12:01:51 +00:00
|
|
|
|
2024-05-22 13:48:38 +00:00
|
|
|
return [null, `Ошибка редактирования промокода. ${error}`];
|
|
|
|
|
}
|
2024-05-21 08:53:09 +00:00
|
|
|
};
|
2024-05-14 22:21:07 +00:00
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
const deletePromocode = async (id: string): Promise<[null, string?]> => {
|
2024-05-21 07:41:31 +00:00
|
|
|
try {
|
|
|
|
|
await makeRequest<never, never>({
|
|
|
|
|
method: "DELETE",
|
2024-05-22 13:48:38 +00:00
|
|
|
url: `${API_URL}/${id}`,
|
2024-05-21 07:41:31 +00:00
|
|
|
useToken: false,
|
|
|
|
|
});
|
2024-05-23 12:01:51 +00:00
|
|
|
|
|
|
|
|
return [null];
|
2024-05-21 07:41:31 +00:00
|
|
|
} catch (nativeError) {
|
|
|
|
|
const [error] = parseAxiosError(nativeError);
|
2024-05-23 12:01:51 +00:00
|
|
|
|
|
|
|
|
return [null, `Ошибка удаления промокода. ${error}`];
|
2024-05-21 07:41:31 +00:00
|
|
|
}
|
2024-03-26 15:41:22 +00:00
|
|
|
};
|
|
|
|
|
|
2024-05-23 12:01:51 +00:00
|
|
|
const getPromocodeStatistics = async (
|
|
|
|
|
id: string,
|
|
|
|
|
from: number,
|
|
|
|
|
to: number
|
|
|
|
|
): Promise<[PromocodeStatistics | null, string?]> => {
|
2024-05-21 07:41:31 +00:00
|
|
|
try {
|
2024-05-22 13:48:38 +00:00
|
|
|
const promocodeStatisticsResponse = await makeRequest<PromocodeStatisticsBody, PromocodeStatistics>({
|
2024-05-21 07:41:31 +00:00
|
|
|
method: "POST",
|
2024-05-22 13:48:38 +00:00
|
|
|
url: `${API_URL}/stats`,
|
|
|
|
|
body: { id, from, to },
|
2024-05-21 07:41:31 +00:00
|
|
|
useToken: false,
|
|
|
|
|
});
|
2024-05-23 12:01:51 +00:00
|
|
|
|
|
|
|
|
return [promocodeStatisticsResponse];
|
2024-05-21 07:41:31 +00:00
|
|
|
} catch (nativeError) {
|
|
|
|
|
const [error] = parseAxiosError(nativeError);
|
2024-05-23 12:01:51 +00:00
|
|
|
|
|
|
|
|
return [null, `Ошибка при получении статистики промокода. ${error}`];
|
2024-05-21 07:41:31 +00:00
|
|
|
}
|
2024-03-03 07:57:12 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export const promocodeApi = {
|
2024-05-22 13:48:38 +00:00
|
|
|
getPromocodeList,
|
|
|
|
|
createPromocode,
|
|
|
|
|
editPromocode,
|
|
|
|
|
deletePromocode,
|
|
|
|
|
getAllPromocodes,
|
|
|
|
|
getNotActivePromocodes,
|
|
|
|
|
getPromocodeStatistics,
|
|
|
|
|
createFastlink,
|
2024-03-03 07:57:12 +00:00
|
|
|
};
|