Orbito - Dokumentacja modułówOrbito - Dokumentacja modułów
Wprowadzenie
Pierwsze kroki
API
Komunikacja
Widoki
Wdrożenie
Społeczność
For AI agents
Wprowadzenie
Pierwsze kroki
API
Komunikacja
Widoki
Wdrożenie
Społeczność
For AI agents
  • Pierwsze kroki

    • Pierwsze kroki
    • Struktura modułu
    • Zależności npm
    • Kontekst firmy i instancji

Struktura modułu

Moduł Orbito to standardowy projekt Node.js z dwoma wymaganiami narzuconymi przez platformę: w katalogu głównym muszą znaleźć się pliki index.js (punkt wejścia) oraz module.json (manifest paczki). Poza tymi wymaganiami masz pełną swobodę w organizacji kodu.

Wymagany plik index.js

Plik index.js to punkt wejścia modułu — od niego Orbito uruchamia moduł w kontenerze Docker. Plik powinien wykonać całą konfigurację: zarejestrować metody, hooki i strony.

// index.js
const { Log, Core, Pages } = require('@orbito/api-lib');

// --- Rejestracja metod ---
Core.registerMethod('config.get', async (params, ctx) => {
  // logika metody
});

Core.registerMethod('config.save', async (params, ctx) => {
  // logika metody
});

// --- Rejestracja stron UI (widoki OVE w osobnych plikach) ---
Pages.registerPages({
  '/config': { name: 'Konfiguracja', view: 'pages/config.yaml' }
});

// --- Rejestracja hooków ---
Core.registerHook('core.shipping.getCarrier', async (order) => {
  // logika hooka
});

Log.info('Moduł załadowany');

Wymagany plik module.json

Każdy moduł musi zawierać w katalogu głównym paczki plik module.json — manifest opisujący tożsamość wersji. Repozytorium modułów odrzuca ZIP bez poprawnego manifestu już przy uploadzie, a manifest jest weryfikowany ponownie przy publikacji.

{
  "name": "moja-organizacja/inpost",
  "version": "1.0.0",
  "minOrbitoVersion": "2.0.0",
  "dependsOn": ["moja-organizacja/shipping-core"],
  "singleton": false
}
PoleWymaganeOpis
nametakPełny kanoniczny kod modułu wraz z namespace'em (jak scope w npm), np. moja-organizacja/inpost. Musi być identyczny z kodem modułu w repozytorium.
versiontakPełny semver bez build metadata (+...), identyczny z wersją obrazu, do którego wgrywasz ZIP.
dependsOnnieTablica kanonicznych kodów modułów Orbito (namespace/nazwa), od których moduł zależy. Nie mylić z zależnościami npm — te deklarujesz w package.json.
minOrbitoVersionnieSemver — minimalna wersja platformy Orbito wymagana do działania modułu. Akceptowana jest też historyczna pisownia minOrbitioVersion.
singletonnieCzy firma może mieć tylko jedną instancję modułu. Domyślnie true — patrz niżej.
secretsnieDeklaracje sekretów aplikacji (nazwa i opis, bez wartości), które Orbito przekaże do kontenera jako zmienne środowiskowe — patrz Sekrety aplikacji.

Manifest jest źródłem prawdy

Pola dependsOn i minOrbitoVersion z obrazu w repozytorium są nadpisywane wartościami z manifestu przy uploadzie. Pełny kod w polu name chroni przed wgraniem paczki do złego namespace'u — sama nazwa bez namespace'u przeszłaby walidację w każdym namespace z modułem o tej nazwie.

Publikacja przez CLI

Przy publikacji komendą omm publish tożsamość paczki pochodzi wyłącznie z module.json — karta modułu musi już istnieć w repozytorium (zakłada ją omm init albo panel developera).

Flaga singleton

Flaga singleton decyduje o tym, czy jedna firma może zainstalować wiele instancji tego samego modułu. Typowy przypadek: firma obsługuje 3 sklepy Prestashop albo 2 konta InPost i dla każdego chce osobną, niezależnie skonfigurowaną instancję.

{
  "name": "moja-organizacja/prestashop",
  "version": "1.0.0",
  "singleton": false
}
  • "singleton": true (wartość domyślna) — firma może mieć tylko jedną aktywną instancję modułu. Próba instalacji drugiej kończy się błędem.
  • "singleton": false — firma może zainstalować dowolnie wiele instancji. Przy włączaniu kolejnej instancji użytkownik musi podać jej nazwę, unikalną wśród aktywnych instancji tego modułu w firmie (służy do rozróżniania ich w UI, nawigacji i automatyzacjach).

Brak flagi = singleton

Pominięcie pola singleton jest traktowane jak true. Jeśli Twój moduł ma sens w wielu egzemplarzach (integracje ze sklepami, kontami kurierskimi, kanałami sprzedaży), ustaw jawnie "singleton": false.

Co to zmienia w kodzie modułu?

Nic. Flaga jest sprawdzana wyłącznie w momencie instalacji jako blokada wielokrotnego włączenia. Każda instancja i tak dostaje własny kontener, własny namespace kolekcji w bazie i własną konfigurację — niezależnie od tego, czy moduł jest singletonem. Nie musisz w module rozgałęziać logiki po tej fladze.

Sekrety aplikacji (secrets)

Niektóre moduły potrzebują kluczy, które należą do aplikacji autora modułu, a nie do firmy: clientId/clientSecret aplikacji zarejestrowanej w Allegro czy Amazon, klucz aplikacji partnerskiej wFirma. Takie wartości nie mogą leżeć w kodzie paczki — trafiłyby do każdego obrazu i repozytorium, a ich zmiana wymagałaby wydania nowej wersji modułu. Przechowuje je repozytorium modułów (zaszyfrowane), a Orbito przekazuje je do kontenera modułu jako zmienne środowiskowe.

Sekret aplikacji czy konfiguracja?

Dane, które wpisuje użytkownik firmy (jego klucz API do sklepu, login do konta kurierskiego, token sprzedawcy), deklarujesz jako pola bloków konfiguracji (Config.registerConfigBlocks) — każda instalacja ma własne wartości. Sekrety aplikacji to klucze platformy: wspólne dla wszystkich firm, użytkownik ich nie widzi i nie wpisuje.

Moduł deklaruje sekrety w module.json — tylko nazwy i opisy, nigdy wartości:

{
    "name": "core/allegro",
    "version": "1.2.0",
    "secrets": [
        { "name": "ALLEGRO_CLIENT_ID", "description": "Client ID aplikacji Allegro (produkcja)" },
        { "name": "ALLEGRO_CLIENT_SECRET", "description": "Client Secret aplikacji Allegro (produkcja)" }
    ]
}
  • secrets jest opcjonalne — to tablica obiektów { name, description? },
  • name to nazwa zmiennej środowiskowej: ^[A-Z][A-Z0-9_]*$, maks. 64 znaki, bez powtórzeń; prefiks ORBITO_ jest zarezerwowany dla zmiennych rdzenia,
  • description jest opcjonalny, maks. 200 znaków — pokazuje się w omm secrets list i w panelu developera.

Wartości ustawiasz osobno, poza paczką — komendą omm secrets set albo w karcie modułu w panelu developera.

Odczyt w module

Każdy sekret trafia do kontenera jako zmienna środowiskowa o tej samej nazwie — moduł czyta go z process.env.NAZWA, bez żadnej metody SDK. Brak wartości nie powinien wywracać modułu: zgłoś problem przez Problems.report, a operację wymagającą klucza zakończ błędem. Gdy wartość się pojawi, skasuj zgłoszenie przez Problems.resolve:

// lib/app-keys.js
const { Problems } = require('@orbito/api-lib');

const PROBLEM_KEY = 'app-keys';

async function getAppKeys() {
    const clientId = process.env.ALLEGRO_CLIENT_ID;
    const clientSecret = process.env.ALLEGRO_CLIENT_SECRET;

    if (!clientId || !clientSecret) {
        await Problems.report({
            problemKey: PROBLEM_KEY,
            code: 'ALLEGRO_APP_KEYS_MISSING',
            desc: {
                pl: 'Klucze aplikacji Allegro nie są skonfigurowane po stronie Orbito — skontaktuj się z administratorem platformy',
                en: 'Allegro application keys are not configured in Orbito — contact the platform administrator'
            }
        });
        throw new Error('Brak kluczy aplikacji Allegro');
    }

    await Problems.resolve({ problemKey: PROBLEM_KEY });
    return { clientId, clientSecret };
}

module.exports = { getAppKeys };

Wartości są globalne per moduł

Sekret ma jedną wartość dla danego kodu modułu — wspólną dla wszystkich firm, instalacji i wersji modułu. Nie da się go nadpisać dla pojedynczej firmy; jeśli wartość ma być inna w każdej instalacji, to jest konfiguracja, nie sekret.

Zmiana wartości bez nowej wersji

Zmiana wartości w repozytorium nie wymaga publikacji modułu. Nowa wartość trafia do kontenera przy jego następnym starcie — działający kontener zachowuje dotychczasowe wartości do restartu.

Zalecana struktura katalogów

Dla modułów o większej złożoności zaleca się poniższą strukturę:

moj-modul/
├── index.js          # punkt wejścia – wymagany przez Orbito
├── module.json       # manifest paczki – wymagany przez repozytorium modułów
├── package.json
├── package-lock.json
├── node_modules/
├── pages/            # widoki OVE rejestrowane przez Pages.registerPages
│   ├── config.yaml
│   └── dashboard.yaml
├── lib/              # logika biznesowa, helpery
│   ├── api.js
│   └── helpers.js
└── schemas/          # schematy DB
    └── config.js

Podział odpowiedzialności

Warto trzymać rejestrację (hooki, metody, strony) w index.js, a całą logikę biznesową przenosić do katalogu lib/. Ułatwia to testowanie i utrzymanie kodu.

Plik package.json

Minimalna konfiguracja package.json dla modułu Orbito:

{
  "name": "moj-modul",
  "version": "1.0.0",
  "description": "Opis modułu",
  "main": "index.js",
  "dependencies": {
    "@orbito/api-lib": "^4.3.0"
  }
}

Pole main

Upewnij się, że pole main w package.json wskazuje na index.js. Orbito może korzystać z tego pola przy uruchamianiu modułu.

package.json a module.json

To dwa różne pliki i oba są potrzebne. package.json opisuje projekt Node.js (zależności npm, punkt wejścia), a module.json opisuje tożsamość modułu w repozytorium Orbito (kod modułu z namespace'em, wersja, zależności między modułami). Wersje w obu plikach warto trzymać zsynchronizowane, ale to module.json jest weryfikowane przy publikacji.

Katalog node_modules nie trafia do paczki — omm wyklucza go zawsze, a zależności instaluje build kontenera na podstawie package.json i package-lock.json. Szczegóły w sekcji Pakowanie modułu.

Ostatnio zaktualizowano:: 15.10.2026, 13:27
Contributors: Wiktor Koźmiński, Claude Fable 5.1
Prev
Pierwsze kroki
Next
Zależności npm