Swagger

Obchod doplnkov

Obchod doplnkov je zoznam doplnkov ponúkaných priamo v KROS aplikácii, odkiaľ si ich zákazník jedným klikom nainštaluje. Zaradenie doplnku do tohto zoznamu nie je samoobslužné — vyžaduje dohodu s KROSom a manifest, ktorý opisuje váš doplnok strojovo čitateľným spôsobom.

Vyžaduje dohodu s KROSom

Táto stránka opisuje kontrakt manifest.json a pravidlá nahrávania doplnku, ktoré potrebuje partner so schváleným prístupom do obchodu doplnkov. Registrácia doplnku a jeho zverejnenie samoobslužné nie sú — vybavujú sa cez integracie@kros.sk. Príprava a testovanie balíka medzi tým už áno (pozri nižšie).

Ako sa doplnok dostane do obchodu

KROS potrebujete na dvoch miestach — na začiatku, aby vám doplnok zaregistroval, a na konci, aby ho zverejnil. Všetko medzi tým, teda príprava balíka aj jeho testovanie, je vo vašich rukách a nikoho sa na to nemusíte pýtať.

1. Registrácia doplnku

Napíšte na integracie@kros.sk a uveďte:

Na základe toho KROS pridelí plugin.id a partnerId, dohodne technické detaily zvoleného spôsobu autentifikácie a sprístupní vám v module Doplnky tlačidlo na nahranie balíka. Až potom má zmysel pripravovať manifest.json a balík.

2. Príprava a testovanie

Balík si zložíte podľa pravidiel na tejto stránke a nahráte ho sami tým tlačidlom v module Doplnky. Hneď uvidíte, či prešel validáciou, aj to, ako sa doplnok zákazníkovi zobrazí. Nahrávať môžete opakovane, kým nebudete s výsledkom spokojní — nahraný doplnok nie je verejný, kým ho KROS nezverejní.

Chyby v manifeste teda odhalíte sami a v priebehu sekúnd; nič neposielate e-mailom a na nikoho nečakáte. Aj tak sa vyplatí prejsť si kontrolu pred nahratím na konci tejto stránky — ušetrí vám to kolá.

3. Schválenie a zverejnenie

Keď je doplnok hotový, napíšte KROSu, aby ho schválil. Schválením sa doplnok zaradí do obchodu doplnkov a stane sa verejne dostupným pre zákazníkov.

manifest.json

manifest.json je jediný zdroj pravdy o tom, ako sa doplnok volá, čo robí, kto je jeho partner a ako sa doň prihlasuje. Okrem povinného poľa manifestVersion (vždy "1.0.0" — je to verzia schémy, nie verzia vášho doplnku) má štyri povinné najvyššie objekty:

Objekt Čo obsahuje
plugin identita a verzia doplnku — id, partnerId, name, version, changelog, requiresReconfiguration
display čo o doplnku uvidí zákazník v obchode — shortDescription, detail.description, categories, tags
partner kto doplnok dodáva — name, website, privacyPolicyUrl, contact, license
authentication ako sa zákazník do doplnku prihlási — jeden z dvoch spôsobov

Ako sa manifest číta

Názvy polí sa párujú bez ohľadu na veľkosť písmen, takže shortDescription aj shortdescription prejdú rovnako. Neznáme polia sa ticho ignorujú — preklep v názve nepovinného poľa teda nespôsobí chybu, len sa to pole nikam nedostane. Limity nižšie sa naopak vynucujú presne a nesplnené pravidlo znamená odmietnutý balík.

Referencia polí

Toto je úplný zoznam polí a ich limitov. Dĺžky sa merajú po odstrihnutí okrajových medzier a takto odstrihnutá hodnota sa aj ukladá. Všetky URL musia byť https — jediná výnimka je manual.redirectUrl, ktoré pripúšťa aj http.

plugin

Pole Povinné Formát a limity
id áno max 50 znakov, tvar ^sk\.[a-z0-9-]+\.[a-z0-9-]+$ — teda len malé písmená, číslice a spojovník. Stredný segment sa musí presne zhodovať s partnerId. Napr. sk.partner-id.doplnok-id.
partnerId áno max 50 znakov, tvar ^[a-z0-9-]+$. Prideľuje KROS.
name áno 3 – 50 znakov, bez riadiacich znakov. Toto je názov, ktorý zákazník vidí v obchode.
version áno max 20 znakov, platný SemVer 2.0 (napr. 1.0.0, 2.1.0-beta.1).
changelog podmienene Pri prvej verzii doplnku v obchode musí byť null. Pri každej ďalšej verzii je povinný a má 20 – 5000 znakov; z riadiacich znakov sú povolené len \n, \r a \t.
requiresReconfiguration nie boolean, default false. Na true ho dajte, len ak nová verzia vyžaduje, aby zákazník doplnok znova nastavil.

display

Pole Povinné Formát a limity
shortDescription áno 10 – 150 znakov. Jedna veta do zoznamu doplnkov.
detail.description áno 50 – 20 000 znakov, markdown. Plný popis na detaile doplnku.
categories áno 1 – 3 rôzne hodnoty zo zoznamu povolených kategórií. Duplicita v poli je chyba.
tags nie max 10 položiek, navzájom rôznych (porovnáva sa bez ohľadu na veľkosť písmen). Každý tag 2 – 30 znakov v tvare ^[a-z0-9-]+$ — bez medzier a bez veľkých písmen, takže nie "Cash Flow" ale "cash-flow".

partner

Pole Povinné Formát a limity
name áno 3 – 50 znakov, bez riadiacich znakov. Obchodné meno partnera.
website nie max 500 znakov, https.
privacyPolicyUrl nie max 500 znakov, https.
contact áno objekt, pozri nižšie.
license áno objekt, pozri nižšie.

partner.contact

Objekt contact je povinný, ale všetky jeho zoznamy sú jednotlivo nepovinné — platí len jedno spoločné pravidlo: musí byť vyplnený aspoň jeden kontaktný kanál, čiže aspoň jeden emails, alebo aspoň jeden supportUrls, alebo neprázdne partner.website. Každý zoznam, ktorý uvediete, má 1 – 3 položky bez duplicít.

Pole Formát a limity
emails platná e-mailová adresa, max 200 znakov.
phones tvar ^\+?[0-9 ()-]+$ — teda číslice, medzery, okrúhle zátvorky, spojovník a nepovinné + na začiatku. Celá hodnota 6 – 50 znakov a musí obsahovať aspoň 6 číslic.
supportUrls max 500 znakov, https.
documentationUrls max 500 znakov, https.

partner.license

Pole Povinné Formát a limity
type áno jedna hodnota zo zoznamu povolených licencií.
url podmienene max 500 znakov, https. Povinné, ak je type rovné proprietary alebo other — pri vlastnej licencii musí byť jej text niekde dostupný. Pri ostatných typoch nepovinné.

Dva spôsoby autentifikácie

Pole authentication.method je presne jedno z dvoch:

Objekty tokenBroker a manual sa navzájom vylučujú: ten, ktorý zvolenému method nepatrí, musí byť null alebo úplne chýbať. Vyplniť oba je chyba.

Pole Kedy Formát a limity
method vždy token-broker alebo manual.
tokenBroker.baseUrl token-broker max 500 znakov, https. Koreň vášho doplnku, pod ktorým KROS volá tri endpointy Token Brokera.
tokenBroker.apiKeySecretRef token-broker max 200 znakov. Konvencia je Plugins:<plugin.id>:ApiKey — teda pre sk.partner-id.doplnok-id hodnota Plugins:sk.partner-id.doplnok-id:ApiKey. Nie je to samotný kľúč, len názov miesta, kde ho KROS má uložený.
tokenBroker.apiKey token-broker Zdieľané tajomstvo — pozri upozornenie nižšie. V manifeste, ktorý nahrávate, tu nechajte placeholder, nikdy nie reálnu hodnotu. Niektoré nasadenia vyžadujú, aby pole bolo prítomné a neprázdne, takže ho nevynechávajte.
manual.redirectUrl manual max 2048 znakov, http alebo https. Jediná URL v celom manifeste, ktorá smie byť aj http.

Povolené hodnoty

Tri polia v manifeste prijímajú len presne vymenované hodnoty. Zapisujú sa malými písmenami so spojovníkmi a iná podoba tej istej hodnoty prejsť nemusí.

display.categories

Hodnota Pre aké doplnky
accountingúčtovníctvo, spracovanie dokladov
warehousesklad, skladové karty a zásoby
crmevidencia zákazníkov a obchodných príležitostí
e-commercee-shopy a marketplace
paymentsplatby, platobné brány, pokladne
bankingbankové konektory a výpisy
reportingreporty, analytika, dashboardy
otherčokoľvek, čo nesedí do predošlých

partner.license.type

Hodnota Licencia
proprietaryvlastná licencia partnera — url je povinné
mitMIT
apache-20Apache License 2.0
gpl-30GNU GPL v3
bsd-3-clauseBSD 3-Clause
lgpl-30GNU LGPL v3
otheriná licencia — url je povinné

Verzie licencií sa píšu bez bodky

Hodnoty nie sú identifikátory SPDX. Číslo verzie sa oddeľuje spojovníkom a bodka v ňom nie je: apache-20 (nie apache-2.0), gpl-30 (nie gpl-3.0), lgpl-30. Naopak bsd-3-clause spojovníky medzi slovami má. Toto je najčastejší dôvod, prečo manifest neprejde na prvý raz.

categories je špecifické pre nasadenie

Zoznam kategórií vyššie platí pre referenčné nasadenie KROS platformy. Konkrétne nasadenie môže mať inú podmnožinu (alebo inú sadu) kategórií — jeden prototyp mal napríklad jedinú hodnotu invoicing. Nespoliehajte sa na to, že hodnota, ktorá fungovala inde, bude prijatá aj tu — nahranie balíka vám to povie hneď a je to najrýchlejší spôsob, ako si zoznam overiť. Ak by hodnota, ktorú potrebujete, chýbala, napíšte na integracie@kros.sk. Zoznamy licencií a spôsobov autentifikácie sú stabilné.

Príklady manifestu

Prvý príklad používa token-broker, druhý manual. Oba sú kompletné a platné — nepovinné polia sú v nich vyplnené, aby bolo vidieť ich tvar.

manifest.json — token-broker
{
  "manifestVersion": "1.0.0",
  "plugin": {
    "id": "sk.partner-id.doplnok-id",
    "partnerId": "partner-id",
    "name": "Názov doplnku",
    "version": "1.0.0",
    "changelog": null,
    "requiresReconfiguration": false
  },
  "display": {
    "shortDescription": "Krátky popis doplnku (10 – 150 znakov).",
    "categories": ["accounting", "reporting"],
    "tags": ["priklad", "doplnok"],
    "detail": { "description": "## Názov doplnku\n\nMarkdown popis, 50 – 20000 znakov." }
  },
  "partner": {
    "name": "Partner s.r.o.",
    "website": "https://partner.example.com",
    "privacyPolicyUrl": "https://partner.example.com/privacy",
    "contact": {
      "emails": ["support@partner.example.com"],
      "phones": ["+421 900 000 000"],
      "supportUrls": ["https://partner.example.com/support"],
      "documentationUrls": ["https://partner.example.com/docs"]
    },
    "license": { "type": "proprietary", "url": "https://partner.example.com/eula" }
  },
  "authentication": {
    "method": "token-broker",
    "tokenBroker": {
      "baseUrl": "https://doplnok.partner.example.com",
      "apiKeySecretRef": "Plugins:sk.partner-id.doplnok-id:ApiKey",
      "apiKey": "VLOZ_SEM_API_KEY"
    }
  }
}
manifest.json — manual
{
  "manifestVersion": "1.0.0",
  "plugin": {
    "id": "sk.partner-id.portal",
    "partnerId": "partner-id",
    "name": "Partner Portál",
    "version": "2.1.0",
    "changelog": "Pridali sme prehľad transakcií a export do CSV.",
    "requiresReconfiguration": false
  },
  "display": {
    "shortDescription": "Externý portál pre obchodníkov akceptujúcich kartové platby.",
    "categories": ["payments"],
    "tags": ["platby", "portal"],
    "detail": { "description": "## Partner Portál\n\nMarkdown popis, 50 – 20000 znakov." }
  },
  "partner": {
    "name": "Partner s.r.o.",
    "website": "https://partner.example.com",
    "contact": { "emails": ["support@partner.example.com"] },
    "license": { "type": "apache-20" }
  },
  "authentication": {
    "method": "manual",
    "manual": { "redirectUrl": "https://portal.partner.example.com/login?ref=kros" }
  }
}

Všimnite si rozdiely: druhý manifest má changelog vyplnený (je to verzia 2.1.0, teda nie prvá), licenciu apache-20 bez url (nepovinné pri známych licenciách) a objekt tokenBroker vôbec neobsahuje.

API kľúč je zdieľané tajomstvo

Hodnota authentication.tokenBroker.apiKey je zdieľaný secret medzi KROSom a vaším doplnkom. Musí k vám prísť bezpečným kanálom (nikdy e-mailom v čistom texte) a nesmie sa nikdy commitnúť do repozitára — ani do príkladov, ani do konfigurácie, ktorá sa verzuje spolu s kódom. V manifeste, ktorý nahrávate, drží miesto placeholder ako vyššie; skutočnú hodnotu vkladajte až v mieste, kde beží doplnok (secret store, premenné prostredia).

Balík .zip

Doplnok sa nahráva ako .zip archív. Samotný manifest.json bez zabalenia do .zip sa nahrať nedá.

Štruktúra archívu

V koreni archívu musí byť manifest.json a presne jedna ikona. Priečinok media/ je nepovinný a musí byť plochý — podpriečinky v ňom nie sú dovolené. Nič iné archív obsahovať nesmie.

štruktúra .zip
doplnok.zip
├── manifest.json        povinné, v koreni
├── icon.png             povinné, presne jedna ikona
└── media/               nepovinné, bez podpriečinkov
    ├── screenshot-1.png
    └── screenshot-2.jpg

Limity archívu

Limit Hodnota
Počet položieknajviac 25 v celom archíve
Veľkosť jednej položkynajviac 5 MB v rozbalenom stave
Veľkosť celého archívunajviac 15 MB v rozbalenom stave
Kompresný pomernajviac 100 — chráni pred zip bombou
Cesty v archívežiadne .. a žiadne absolútne cesty
Súbory v media/najviac 10

Ikona

Presne jeden súbor icon.<prípona> v koreni archívu. Prípona smie byť png, jpg, jpeg, webp alebo svg.

Priečinok media/

Nepovinné náhľadové obrázky doplnku, najviac 10, bez podpriečinkov.

Prípony a typy obsahu

Prípona Typ obsahu Kde sa smie použiť
.pngimage/pngikona aj media/
.jpg, .jpegimage/jpegikona aj media/
.webpimage/webpikona aj media/
.svgimage/svg+xmllen ikona

Kontrola pred nahratím

Validáciu si spustíte sami tým, že balík nahráte, takže chybu vidíte hneď. Toto je zoznam vecí, na ktorých balíky padajú najčastejšie — keď si ho prejdete dopredu, ušetríte si niekoľko kôl.