Skip to content

SkyserviceAPI — HTTP-клієнт ​

Прямі запити до Skyservice API. Працює всюди (браузер, Node, edge) — не потребує iframe. На відміну від bridge, кидає помилки при збоях замість повернення null.

ts
import { SkyserviceAPI, getToken } from '@skyservice-developers/vue-dev-kit/sdk'

Створення інстансу ​

SkyserviceAPI.create() — фабрика. Прямий new SkyserviceAPI(...) недоступний (конструктор приватний).

ts
const token = await getToken()

const api = SkyserviceAPI.create({
  token,
  domain: 'api.skyservice.online',
  companyId,
  appId,
  // developerId: 'optional',
  // deploymentId + appName — тільки якщо користуєтесь setAppActive
  deploymentId: '4c3c7d32-2408-503b-c439-bff7332a238e',
  appName: 'glovo',
})

SkyserviceAPIConfig ​

ПолеТипОбов'язковоОпис
tokenstringтакТокен доступу (зазвичай з getToken())
domainstringтакДомен API. Підрядок dashboard автоматично замінюється на api
companyIdstringтакId компанії
appIdstringтакId додатку
developerIdstringніId розробника (додається в body активації)
deploymentIdstringніРазом з appName вмикає sendActiveApp postMessage
appNamestringніРазом з deploymentId вмикає sendActiveApp postMessage

Нормалізація домену

У конструкторі domain проходить .replace('dashboard', 'api'), а якщо не починається з http — до нього додається https://. Тобто dashboard.skyservice.online стане https://api.skyservice.online.

Методи ​

getTradepoints(options?) ​

Усі торгові точки компанії. За замовчуванням відфільтровує видалені та заморожені (deleted, frozen).

ts
const tradepoints = await api.getTradepoints()
const all = await api.getTradepoints({ includeDeleted: true })
ПараметрТипЗа замовчуваннямОпис
options.includeDeletedbooleanfalseНе фільтрувати видалені/заморожені

Повертає Promise<Tradepoint[]>.

getCategoryTree(tradepointId?) ​

Повне дерево категорій, очищене від POS-специфічного «сміття». Повертає лише поля, релевантні для побудови меню: id, pid, name, active, background, show, img, children.

Якщо передати tradepointId — фільтрує категорії, видимі для цієї торгової точки.

ts
const tree = await api.getCategoryTree()
const forTp = await api.getCategoryTree(902062)
ПараметрТипОпис
tradepointIdnumberФільтрувати за видимістю для точки

Повертає Promise<Category[]> (дерево, children вкладені рекурсивно).

getProducts(options?) ​

Товари, очищені від POS-специфічних полів. За замовчуванням відфільтровує інгредієнти — повертає лише продавані позиції (type = product або techcard) і лише активні.

ts
const products = await api.getProducts()
const forTp = await api.getProducts({ tradepointId: 902062 })
const withInactive = await api.getProducts({ includeInactive: true })
ПараметрТипЗа замовчуваннямОпис
options.tradepointIdnumber—Обмежити конкретною точкою
options.includeInactivebooleanfalseВключити неактивні товари

Повертає Promise<Product[]>.

setAppActive({ isActive, title?, settings? }) ​

Активувати або деактивувати mini-app для поточної компанії.

ts
// Активація
await api.setAppActive({ isActive: true, title: 'Glovo', settings: { foo: 'bar' } })

// Деактивація
await api.setAppActive({ isActive: false, title: 'Glovo' })
ПараметрТипОпис
isActivebooleantrue → активувати, false → деактивувати
titlestringНазва (йде в sendActiveApp postMessage)
settingsRecord<string, unknown>Налаштування — надсилаються тільки при активації

Повертає Promise<AppIntegration>.

Технічні деталі:

  • POST на https://api.cabinet.developer.skyservice.online/index.php.
  • isActive: true → section=integrations&action=activateApp; false → deactivateApp.
  • Якщо в конфізі задані обидва deploymentId і appName та ми в iframe — додатково шле sendActiveApp postMessage у parent (Dashboard) з відповіддю сервера й новим станом.

getPerms(code?) ​

Права доступу поточного користувача. Без аргументу повертає всю мапу, з кодом — булеве значення для нього.

ts
await api.getPerms('9006') // → boolean — чи надано право 9006
await api.getPerms()       // → PermsMap: { '9006': true, '100': false, ... }
api.clearPermsCache()      // скинути кеш — наступний виклик перезапросить джерело

Повертає Promise<boolean> (з кодом) або Promise<PermsMap> (без нього).

Джерело даних береться за пріоритетом:

  1. Стор Dashboard через iframe bridge (store.perms) — миттєво, без токена, працює всередині iframe;
  2. HTTP fallback section=adminPanel&action=getStart → data.settings.perms — поза iframe (standalone-сторінка, Node) або поки стор ще порожній.

Кеш і нормалізація

Результат кешується на інстансі — повторні виклики не роблять зайвих запитів і postMessage. Значення нормалізуються в boolean (бек може віддавати 0/1), а відсутній код завжди означає false.

Обробка помилок ​

Методи кидають Error у двох випадках:

  • HTTP-статус не ok → Skyservice API error: <status>;
  • тіло відповіді має status !== 'done' → Skyservice API returned status: <status>.
ts
try {
  const tradepoints = await api.getTradepoints()
} catch (e) {
  console.error('Не вдалося завантажити точки:', e.message)
}

Повний приклад ​

ts
import { SkyserviceAPI, getToken, getCompany, notifyError } from '@skyservice-developers/vue-dev-kit/sdk'

async function loadCatalog(companyId: string, appId: string) {
  const token = await getToken()
  if (!token) throw new Error('Немає токена')

  const api = SkyserviceAPI.create({
    token,
    domain: 'api.skyservice.online',
    companyId,
    appId,
  })

  try {
    const tradepoints = await api.getTradepoints()
    const firstTp = tradepoints[0]?.tradepointId

    const [categories, products] = await Promise.all([
      api.getCategoryTree(firstTp),
      api.getProducts({ tradepointId: firstTp }),
    ])

    return { tradepoints, categories, products }
  } catch (e) {
    notifyError('Помилка завантаження каталогу')
    throw e
  }
}

Далі ​

  • Типи даних — структура Tradepoint, Category, Product, AppIntegration.
  • Bridge — звідки взяти token і companyId.

Опубліковано під ліцензією MIT.