feat: Обновление функции createTextDataPOST для поддержки нескольких типов входных данных (domains, ipRanges, items) с улучшенной валидацией и обработкой ошибок. Это улучшает обратную совместимость и гибкость API.
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m35s

This commit is contained in:
2025-10-14 21:19:03 +07:00
parent 18f3a5312a
commit 3a41cc394c
+15 -6
View File
@@ -100,22 +100,31 @@ function createTextDataGET(s3Key, mapLine, validate, cachePrefix) {
*/
function createTextDataPOST(s3Key, formatLine, validate, validateItem = null) {
return async (req, res) => {
const { domains, etag } = req.body; // Используем 'domains' для обратной совместимости
const { domains, ipRanges, items, etag } = req.body; // 'domains' основной ключ, но поддерживаем и альтернативные
if (!Array.isArray(domains)) {
// Поддержка обратной совместимости: принимаем domains | ipRanges | items
const payload = Array.isArray(domains)
? domains
: Array.isArray(ipRanges)
? ipRanges
: Array.isArray(items)
? items
: null;
if (!Array.isArray(payload)) {
return sendError(res, 400, 'Data must be an array', 'E_BAD_REQUEST');
}
// Валидация с помощью AJV
if (!validate(domains || [])) {
if (!validate(payload || [])) {
return sendError(res, 400, 'Invalid payload format', 'E_SCHEMA');
}
// Дополнительная валидация элементов, если предоставлена
if (validateItem) {
const validationErrors = [];
for (let i = 0; i < domains.length; i++) {
const errors = validateItem(domains[i], i);
for (let i = 0; i < payload.length; i++) {
const errors = validateItem(payload[i], i);
if (errors.length > 0) {
validationErrors.push(...errors);
}
@@ -128,7 +137,7 @@ function createTextDataPOST(s3Key, formatLine, validate, validateItem = null) {
}
}
const fileContent = (domains || []).map(formatLine).filter(Boolean).join('\n');
const fileContent = (payload || []).map(formatLine).filter(Boolean).join('\n');
try {
// Проверка ETag для optimistic concurrency