Функции для работы с типом document ID из клиентского скрипта

Потребовалось в клиентском скрипте из поля типа Document ID получение tableId и recordId. Но функции, необходимые для их получения, есть только в серверном API. Чтобы не вызывать эти функции из клиентских скриптов через ajax, написал их аналоги.

function getDocIdByIds(tableId,recordId) {
  const decimalToHexWithPadding = (str) => 
    BigInt(str.trim()).toString(16).padStart(16, '0');

  return decimalToHexWithPadding(tableId)+decimalToHexWithPadding(recordId);
}

function getTableIdByDocId(docId) {
  if (docId.length !== 32) return;
  const hexToDec = hex => BigInt('0x' + hex).toString();
  const first16 = s => s.slice(0,16);
  
  return hexToDec(first16(docId));
}

function getRecordIdByDocId(docId) {
  if (docId.length !== 32) return;
  const hexToDec = hex => BigInt('0x' + hex).toString();
  const last16 = s => s.slice(-16);
  
  return hexToDec(last16(docId));
}
9 лайков

Провел еще одно небольшое исследование. Ниже вариант, полностью эмулирующий поведение коробочных функций с небольшим улучшением функции getDocIdByIds() в виде
отсутсвия падения скрипта при некорректных входных данных.

function getDocIdByIds(tableId,recordId) {
  const decimalToHexWithPadding = (str) => BigInt(str.trim()).toString(16).padStart(16, '0');

  return decimalToHexWithPadding(tableId.replace(/[^0-9]/g, ''))+decimalToHexWithPadding(recordId.replace(/[^0-9]/g, ''));
}

function getTableIdByDocId(docId) {
  const withoutDashes = docId.replace(/-/g, '');
  const first16Chars = withoutDashes.slice(0, 16);
  const hexOnly = first16Chars.replace(/[^0-9a-fA-F]/g, '');
  if (hexOnly.length === 0) return '0';
  const hexToDec = hex => BigInt('0x' + hex).toString();
  return hexToDec(hexOnly);
}

function getRecordIdByDocId(docId) {
  const withoutDashes = docId.replace(/-/g, '');
  const last16Chars = withoutDashes.slice(-16);
  const hexOnly = last16Chars.replace(/[^0-9a-fA-F]/g, '');
  if (hexOnly.length === 0) return '0';
  const hexToDec = hex => BigInt('0x' + hex).toString();
  return hexToDec(hexOnly);
}
1 лайк

А поделитесь кейсом, когда необходимо применять этот подход.
Зачастую в интеграции пользуюсь getDocIdByIds() и каких-то проблем не наблюдаю. Интересно в каких случаях появляются сложности.

Первый вариант вполне коректен, но в процессе тестирования нашел, что внутри системы обработка входных данных происходит немного по другому от моего решения. Второй вариант скрипта работает совсем как коробка (надеюсь).

Для тестирования можно в серверном скрипте вызывать что-то типа такого и сравнить ответ от двух вариантов реализации:

const docId = '0265fffAA-45644577test';
print('Vendor function\n');
var_dump(ss.getTableIdByDocId(docId));
var_dump(ss.getRecordIdByDocId(docId));
print('My function\n');
var_dump(getTableIdByDocId(docId));
var_dump(getRecordIdByDocId(docId));

На корректных входных данных (полученных от функции getDocIdByIds) результат будет одинаков.

Для функции ss.getDocIdByIds подача некорректных данных вызовет исключение

const tableId = '1'
const recordId = '1';

var_dump(ss.getDocIdByIds(tableId, recordId)); // отработает вполне корректно

При передаче некоректных данных на вход функции вызывает его падение.

const tableId = '1'
const recordId = ''; //как вариант, любое не десятичное значение -  const recordId = 'abc';

var_dump(ss.getDocIdByIds(tableId, recordId)); // происходит падение скрипта

Мой вариант функции getDocIdByIds хоть и возвращает неправильное значение, но не падает.

Мне больше интересен бизнес кейс. Спасибо, что делитесь технической частью интересное решение