adminFront/src/api/promocode/requests.ts

199 lines
4.9 KiB
TypeScript
Raw Normal View History

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";
import { parseAxiosError } from "@root/utils/parse-error";
2024-03-22 10:27:15 +00:00
import { isAxiosError } from "axios";
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-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-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-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-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-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-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
}
};
export const promocodeApi = {
2024-05-22 13:48:38 +00:00
getPromocodeList,
createPromocode,
editPromocode,
deletePromocode,
getAllPromocodes,
getNotActivePromocodes,
getPromocodeStatistics,
createFastlink,
};