// Хелперы для SQL-пагинации строк справочников (data_table_rows). // Чистые функции без доступа к БД — покрыты юнит-тестами. /** Дефолтный лимит строк на страницу */ export const DIRECTORY_ROWS_DEFAULT_LIMIT = 100; /** Максимальный лимит строк на страницу */ export const DIRECTORY_ROWS_MAX_LIMIT = 1000; /** * Экранирует спецсимволы LIKE/ILIKE (\, %, _) в пользовательской подстроке, * чтобы поиск работал как «содержит подстроку», а не как паттерн. * Используется вместе с `ESCAPE '\'` в SQL. */ export function escapeIlikePattern(value: string): string { return value.replace(/[\\%_]/g, (ch) => '\\' + ch); } /** * Приводит лимит к допустимому диапазону. * Невалидные/неположительные значения → defaultLimit, сверху капается maxLimit. */ export function clampDirectoryRowsLimit( raw: unknown, defaultLimit: number = DIRECTORY_ROWS_DEFAULT_LIMIT, maxLimit: number = DIRECTORY_ROWS_MAX_LIMIT, ): number { const n = typeof raw === 'number' ? raw : parseInt(String(raw ?? ''), 10); if (!Number.isFinite(n) || n <= 0) return defaultLimit; return Math.min(Math.floor(n), maxLimit); } /** * Приводит offset к неотрицательному целому. Невалидное → 0. */ export function clampDirectoryRowsOffset(raw: unknown): number { const n = typeof raw === 'number' ? raw : parseInt(String(raw ?? ''), 10); if (!Number.isFinite(n) || n < 0) return 0; return Math.floor(n); }