From c3c30b1c75388ac6d9ad2c6f45471eeb176d06a7 Mon Sep 17 00:00:00 2001 From: shats Date: Sat, 21 Feb 2026 18:40:42 +0700 Subject: [PATCH] refactor(MikrotikConfigRoutes): improve address list retrieval by filtering after fetching all entries --- backend/routes/mikrotikConfigRoutes.js | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/backend/routes/mikrotikConfigRoutes.js b/backend/routes/mikrotikConfigRoutes.js index edfeea1..7b0bfd4 100644 --- a/backend/routes/mikrotikConfigRoutes.js +++ b/backend/routes/mikrotikConfigRoutes.js @@ -1171,16 +1171,29 @@ async function getAddressLists(req, res) { const client = createRosClient(creds); const path = 'ip/firewall/address-list'; - const [ban, banCounter] = await Promise.all([ - rosPrint(client, path, { list: 'ban' }), - rosPrint(client, path, { list: 'ban_counter' }), - ]); + // REST API не всегда поддерживает фильтр по list — загружаем все и фильтруем по полю list + let all = await rosPrint(client, path); + if (Array.isArray(all) && all.length === 1 && all[0] && typeof all[0] === 'object' && Array.isArray(all[0].ret)) { + all = all[0].ret; + } else if (all && typeof all === 'object' && !Array.isArray(all) && Array.isArray(all.ret)) { + all = all.ret; + } + const listRaw = Array.isArray(all) ? all : []; + + const getListName = (entry) => { + if (!entry || typeof entry !== 'object') return ''; + const name = entry.list ?? entry.List ?? ''; + return String(name).trim().toLowerCase(); + }; + + const ban = listRaw.filter((e) => getListName(e) === 'ban'); + const banCounter = listRaw.filter((e) => getListName(e) === 'ban_counter'); return sendOk(res, { serverId, serverLabel: server.dns || server.ip || serverId, - ban: Array.isArray(ban) ? ban : [], - ban_counter: Array.isArray(banCounter) ? banCounter : [], + ban, + ban_counter: banCounter, }); } catch (error) { const msg = error.response?.data?.detail || error.response?.data?.message || error.message || 'Ошибка получения address-list';