Перейти к основному содержимому

Ошибки

  • Запросы

  • Body

  • Query-params

    • Pagination
    • Filter
    • Sort
  • Авторизация

filter[status];
sord[status] = 'ASC' | 'DESC';
const params = new URLSearchParams();
params.set('sort[id]', 'DESC');
params.set('sort[date]', 'ASC');
const url = `/api/items?${params.toString()}`;

url;

Запросы

Пример запроса внутри сервиса

Конфиг axios, который размножает параметры при .map()

paramsSerializer: {
indexes: null,
},
const ordersService = {
async getOredersReport(
filters: TFilters,
limit: number,
offset: number,
): Promise<TOrderReport> {
try {
const { data, status } = await httpClient.request<TOrdersReportResponse>({
url: `/v1/admin/partner-orders/report`,
method: 'GET',
params: {
partner_uuid: filters.selectedPartner?.id,
statuses: filters.selectedStatuses.map(item => item.id),
createdDateFrom: filters.selectedDateFrom,
createdDateTo: filters.selectedDateTo,
offset,
limit,
},

// statuses=CANCELLED&statuses=RESOLVED (без statuses[]=...)
paramsSerializer: {
indexes: null,
},
});

return {
success: status === 200,
data,
error: null,
};
} catch (error: any) {
return {
success: false,
data: null,
error,
};
}
},
};

Рекурсивные запросы

export const getBoardsRecursive = (
offset: number = 0,
limit: number = REQUEST_LIMIT,
) => {
return async function (dispatch: Dispatch<any>) {
dispatch(setLoading(true));

const { success, data, error } = await boardsService.getBoardsChunk(
limit,
offset,
);

// success
if (success && data) {
if (!data.data.length) {
dispatch(setLoading(false));
return;
} else {
const boardShortData: TBoardShort[] = data.data.map(board => ({
id: board.id,
uuid: board.uuid,
name: board.name,
createdAt: board.createdAt || '—',
createdBy: returnCreatedBy(board.createdBy),
}));

dispatch(setBoards(boardShortData));
// рекурсивный запрос
if (data.data.length < REQUEST_LIMIT) {
dispatch(setLoading(false));
dispatch(setLoadDate(new Date().toISOString()));
return;
} else {
// рекурсивный запрос
setTimeout(() => {
dispatch(getBoardsRecursive(offset + REQUEST_LIMIT, limit));
}, REQUEST_TIMEOUT);
}
}
}

// error
if (error) {
dispatch(setLoading(false));
dispatch(setError(error));
}
};
};

Цикличный запрос

const getTasksRecursive = async (): Promise<{
data: TTask[];
error: string;
count: number;
}> => {
let isContinue = true;
let errorMessage = '';
let _count = 0;
const _data: TTask[] = [];
let OFFSET = 0;

while (isContinue) {
const {
success,
data,
count,
error: requestError,
} = await getTasksСhunk(LIMIT, OFFSET);

if (requestError) {
isContinue = false;
errorMessage = requestError;
break;
}

if (success && data && count && count > _data.length) {
_data.push(...data);
OFFSET += LIMIT;
_count = count;
} else {
isContinue = false;
break;
}
}

return {
data: _data,
error: errorMessage,
count: _count,
};
};

Интервальный запрос

export const getDictionariesInterval = () => {
return async function (dispatch: Dispatch<any>) {
// получаем токен из стейта
const token = store.getState().app.authData?.token;

// если токена нет, просто выходим - редирект на /login произойдет автоматически через React Router в routes.tsx
if (!token) {
return;
}

// если токен есть, то запускаем загрузку данных
dispatch(resetAppData()); // reset data
dispatch(setLoading(true));

let counter = 0;

const intervalId = setInterval(() => {
dispatch(getDictionary(dictionariesList[counter]));

// counter - увеличваем счетчик на 1
counter++;

if (counter === dictionariesList.length) {
dispatch(setLoadDate(new Date().toISOString()));
clearInterval(intervalId);
dispatch(setLoading(false));

// после загрузки всех справочников грузим данные приложения
dispatch(getAppData());
}
}, REQUEST_TIMEOUT);
};
};