Konfigurácia OpenAPI API

Konfigurácia OpenAPI API

Integrácia OpenAPI v SmartWebe funguje v dvoch smeroch:

  • Vstupné OpenAPI — SmartWeb sprístupňuje externé HTTP endpointy popísané OpenAPI špecifikáciou. Každá operácia je naviazaná na D2000 RPC procedúru. Prichádzajúce HTTP požiadavky sú prekladané na D2000 RPC volania.

  • Výstupné OpenAPI — D2000 ESL skripty môžu cez konektor bežiaci vnútri SmartWebu volať externé HTTP služby popísané OpenAPI špecifikáciou. Konektor serializuje argumenty RPC do JSON, odošle požiadavku a vráti deserializovanú odpoveď späť do D2000.

Táto stránka pokrýva oba smery. Generovanie TypeScript klienta pre D2000 RPC už nie je súčasťou OpenAPI — pozri Generovanie TypeScript klienta pre D2000 RPC.

Vstupné OpenAPI

Vstupné OpenAPI je vystavené na /api/open a zabezpečené rovnako ako server-to-server REST API (API kľúč, JWT alebo Basic auth). Pri štarte SmartWeb načíta každý nakonfigurovaný súbor špecifikácie a publikuje jeho operácie POST na /api/open/ + contextPath + cesta zo špecifikácie. Každá operácia je naviazaná na D2000 RPC procedúru určenú atribútmi x-d2-* (viď Vnorené štruktúry); ostatné HTTP metódy sa neviažu, pretože RPC volanie vždy nesie payload.

GET /api/open/<contextPath>/openapi.yaml vráti dokument, ktorý je reálne nasadený — vrátane predvolených hodnôt doplnených SmartWebom a operácií dogenerovaných z D2000 metadát. Pre príklad nižšie je to GET /api/open/edc/openapi.yaml. Report toho, čo SmartWeb zo špecifikácií postavil a čo mu v D2000 chýba, je na GET /api/open/status.md — viď Generovaná dokumentácia špecifikácie.

Konfigurácia

smartweb: application: openApi: enabled: true processName: "SELF.SMARTWEB_OPENAPI" # potrebné len pre špecifikáciu s blokom "mapping" httpHeaders: [ ] # extra HTTP hlavičky pridané do odpovedí /api/open specifications: - specificationFilePath: edc_openapi_ofs.yaml # relatívne voči konfiguračnému adresáru specificationFormat: YAML # YAML | JSON specificationVersion: "3.0" contextPath: edc # segment URL pod /api/open generateDocumentation: true # predvolene zapnuté, viď koniec stránky

Vlastnosť

Popis

Vlastnosť

Popis

enabled

Zapína alebo vypína vstupné API. Volanie vypnutého API skončí chybou 400.

processName

D2000 proces, pod ktorým sa prihlasuje relácia (session) na čítanie metadát. Potrebný len pre špecifikáciu s blokom mapping; bez neho a bez záložného connectors.coreConnector.local.processName štart zlyhá s No process name was specified!.

httpHeaders

Extra HTTP hlavičky pridané do odpovedí /api/open (formát Meno: hodnota).

specifications[].specificationFilePath

Cesta k súboru špecifikácie, relatívne voči konfiguračnému adresáru. Súbor je sledovaný — zmena spôsobí znovunačítanie kontextu a súbor, ktorý sa nepodarí spracovať, ponechá nasadenú predchádzajúcu verziu.

specifications[].specificationFormat

YAML alebo JSON.

specifications[].contextPath

Segment URL, pod ktorým sú operácie publikované. Nesmie byť prázdny — špecifikácia bez neho sa nikdy nenamountuje.

specifications[].generateDocumentation

Predvolene true — špecifikácia je v reporte na /api/open/status.md, viď Generovaná dokumentácia špecifikácie.

specifications[].mapping

Nepovinné — dogenerovanie operácií z D2000 RPC metadát, viď nižšie.

[!NOTE] URL je /api/open + contextPath + cesta napísaná v špecifikácii. Pri contextPath: edc a ceste /ofs/api/v1/contracts-changes sa operácia volá na POST /api/open/edc/ofs/api/v1/contracts-changes.

Tok požiadavky

  1. Externý klient pošle POST /api/open/edc/ofs/api/v1/contracts-changes.

  2. SmartWeb rozlíši URL na špecifikáciu a operáciu naviazanú na danú cestu.

  3. Properties tela požiadavky sa stanú vstupnými parametrami RPC v poradí do hĺbky podľa schémy payloadu; property sa dá naplniť aj z HTTP hlavičky (viď nižšie).

  4. Za ne sa doplnia výstupné parametre ako prázdne hodnoty, takže ESL procedúra dostane celú signatúru.

  5. Zavolá sa naviazaná D2000 RPC procedúra — x-d2-event-name + x-d2-event-rpc-name — predvolene ako konverzácia (CONVERSATION_BEGIN_END), a SmartWeb čaká na odpoveď ESL.

  6. Výstupné parametre sa serializujú späť do JSON podľa response schémy a vrátia volajúcemu.

[!IMPORTANT] Pri x-d2-event-rpc-call-type: CONVERSATION_BEGIN_END (predvolené) je HTTP požiadavka držaná, kým ESL procedúra neodpovie cez CALL [_hTC] Result(...) ASYNC TC_Eaj zo svojho EXCEPTION_HANDLERa. Procedúra, ktorá neodpovie, necháva volajúceho čakať až do timeoutu.

Dogenerovanie operácií z D2000 metadát

Špecifikácia s blokom mapping nepublikuje len to, čo je v súbore — SmartWeb otvorí D2000 reláciu (session), načíta RPC procedúry ESL eventov a doplní ich do dokumentu ako ďalšie operácie. Blok zároveň určuje, čo sa publikuje:

- specificationFilePath: base.yaml contextPath: discover mapping: allowedD2RpcEventNames: [ "E.*" ] # ESL eventy, ktoré sa publikujú allowedD2RpcMethodNames: [ "*" ] # RPC procedúry, ktoré sa publikujú allowedD2RpcCallModes: [ REPLY, CONVERSATION_BEGIN_END ]

Mená sú vzory so zástupnými znakmi, bez rozlišovania veľkosti písmen. specificationFilePath je tu nepovinná — bez nej sa dokument postaví čisto z D2000 metadát. Zmeny v D2000 (nová RPC procedúra, zmenená definícia štruktúry) prestavajú dokument za behu.

Hodnoty z HTTP hlavičiek a stavový kód odpovede

Dva atribúty na components mapujú properties payloadu na HTTP vrstvu:

components: x-property-in-mappings: correlationId: $parameterRef: "#/components/parameters/CorrelationIdHeader" priority: PAYLOAD_THEN_PARAM # PAYLOAD_THEN_PARAM | PARAM_THEN_PAYLOAD | PARAM_ONLY x-property-out-mappings: result: pattern: "^(?<httpStatusCode>[0-9]{3})?:?(?<value>.*)$"
  • x-property-in-mappings — uvedená property sa môže naplniť z HTTP hlavičky referencovanej cez $parameterRef. priority rozhoduje, čo vyhrá, keď hodnotu nesie payload aj hlavička.

  • x-property-out-mappings — regulárny výraz aplikovaný na textový výstupný parameter. Pomenovaná skupina value sa stane hodnotou zapísanou do JSON-u, pomenovaná skupina httpStatusCode nastaví HTTP stavový kód odpovede. Takto ESL procedúra odpovie inak než 200.

Vnorené štruktúry

D2000 štruktúra je plochá tabuľka typovaných stĺpcov — bunka nemôže obsahovať ďalšiu štruktúru. Ľubovoľne hlboko vnorený JSON sa preto rozkladá relačne: rodičovská štruktúra má stĺpec s vlastným kľúčom riadka (rowId) a každá vnorená štruktúra má stĺpec odkazujúci na kľúč rodičovského riadka (parentRowId). Každá vnorená štruktúra sa odovzdáva ako samostatný parameter RPC procedúry — ESL procedúra teda dostane N plochých štruktúr a spája ich cez parentRowId == rowId.

Rozširujúce atribúty špecifikácie

Atribút

Úroveň

Význam

Atribút

Úroveň

Význam

x-d2-event-name

operácia (post)

D2000 ESL Event, na ktorom je RPC procedúra, napr. E.API_OFS_Contracts

x-d2-interface-name

operácia (post)

Nepovinné meno ESL rozhrania pri procedúrach implementujúcich rozhranie

x-d2-event-rpc-name

operácia (post)

Meno RPC procedúry; predvolene posledná časť cesty

x-d2-event-rpc-call-type

operácia (post)

CONVERSATION_BEGIN_END (predvolené) alebo REPLY

x-d2-structure-name

schéma komponentu, alebo property typu pole skalárov

Označuje komponent ako D2000 štruktúru a určuje meno cieľovej SD.*. Bez neho zostáva $ref vnorený v štruktúre skalárnym stĺpcom (enumerácie, aliasy skalárov). Na property je dovolený iba pri poli skalárov — na property, ktorá referencuje komponent, je chybou

x-d2-structure-rowid-column

schéma štruktúry

Meno celočíselného stĺpca s vlastným kľúčom riadka — cieľ väzby pre vnorené štruktúry

x-d2-structure-parent-rowid-column

schéma štruktúry

Meno celočíselného stĺpca odkazujúceho na rowId rodičovského riadka

x-d2-name

schéma property

Prebíja meno RPC parametra / stĺpca odvodené z mena JSON property; slúži na riešenie kolízií mien. Na schéme items poľa skalárov pomenúva jediný stĺpec takej štruktúry

Príklad

components: schemas: EdcSyncPayload: # obálka — jej properties sú parametre RPC type: object properties: subjects: type: array items: { $ref: "#/components/schemas/EdcSubject" } EdcSubject: type: object x-d2-structure-name: "SD.EdcSubject" x-d2-structure-rowid-column: "rowId" # tranzientný celočíselný kľúč, generuje SmartWeb properties: id: { type: string } temporalData: type: array x-d2-name: "subjectTemporalData" # meno RPC parametra (JSON property zostáva temporalData) items: { $ref: "#/components/schemas/EdcSubjectParametersTemporalDataItem" } EdcSubjectParametersTemporalDataItem: type: object x-d2-structure-name: "SD.EdcSubjectParametersTemporalDataItem" x-d2-structure-parent-rowid-column: "parentRowId" properties: id: { type: string } name: { type: string }

Pole skalárov

Pole, ktorého prvky sú skaláre, nemá v D2000 zodpovedajúcu hodnotu. Uvedením x-d2-structure-name priamo na property sa také pole namapuje na plochú SD.* štruktúru s jedným stĺpcom — jeden riadok na prvok poľa. Meno stĺpca určuje x-d2-name na items, inak sa použije meno property (x-d2-name na samotnej property naďalej pomenúva RPC parameter). Do odpovede sa taká štruktúra vypisuje späť ako pole skalárov. Platia pre ňu rovnaké pravidlá ako pre ostatné štruktúry, takže môže byť aj vnorená — potom potrebuje x-d2-structure-parent-rowid-column.

subjects: # RPC parameter "subjects" -> SD.EdcSubjectIdList x-d2-structure-name: "SD.EdcSubjectIdList" type: array items: { type: string, x-d2-name: "id" } # jeden stĺpec "id", riadok na prvok

Dátumy

format: date-time aj format: date sa mapujú na stĺpec typu time. Hodnota date-time sa číta aj zapisuje ako úplná časová pečiatka ISO‑8601 v UTC, hodnota date ako samotný deň yyyy-MM-dd v lokálnej časovej zóne servera. Reťazcová property bez niektorého z týchto formátov zostáva textovým stĺpcom.

Požiadavky na D2000 stranu

[!IMPORTANT] Cieľové SD.* štruktúry musia v D2000 reálne existovať a mená ich stĺpcov sa musia zhodovať s menami namapovaných properties (resp. s x-d2-name). Bunky sa do riadka ukladajú podľa mena stĺpca, takže poradie properties v špecifikácii nemusí zodpovedať poradiu stĺpcov v štruktúre a väzobné stĺpce nemusia byť prvé. Stĺpce, ktoré špecifikácia nemapuje, zostanú nevyplnené. Ak štruktúra neexistuje, chýba jej niektorý namapovaný stĺpec alebo väzobný stĺpec nie je typu integer, volanie skončí chybou, ktorá pomenuje štruktúru aj stĺpec.

  • Väzobné stĺpce sú tranzientné — nie sú atribútmi JSON‑u a do odpovede sa nevypisujú. Výnimkou je rowId namapovaný na existujúci JSON atribút, ktorý musí byť type: integer a required; potom sa hodnota berie z požiadavky a vypisuje sa aj do odpovede. parentRowId namapovať na JSON atribút nie je dovolené.

  • Hodnoty tranzientných rowId generuje SmartWeb jedným počítadlom na celú správu, inkrementálne od 1. rowId je jedinečné v rámci celej správy, nie v rámci jednej štruktúry — počítadlo pokračuje naprieč všetkými rodičovskými štruktúrami, takže dvaja rodičia nikdy nemajú rovnaké id a parentRowId vždy identifikuje práve jeden riadok. ESL procedúra, ktorá tieto stĺpce vypĺňa do odpovede, musí dodržať to isté pravidlo. rowId načítané z atribútu payloadu SmartWeb negeneruje, o jeho jedinečnosť sa teda stará volajúci.

  • Poradie formálnych parametrov ESL procedúry je dané špecifikáciou: prehľadávanie do hĺbky (pre‑order), teda štruktúra a hneď za ňou jej vnorené štruktúry, rekurzívne; najprv všetky vstupné parametre, potom výstupné. V rámci jednej schémy parametre kopírujú poradie deklarácie properties v súbore špecifikácie. SmartWeb signatúru procedúry negeneruje ani neprispôsobuje — smerom pravdy je špecifikácia.

[!IMPORTANT] SmartWeb odovzdáva parametre pozične a procedúru neoveruje — o signatúre si z D2000 nič nenačítava. Ako dopadne procedúra deklarovaná v inom poradí, rozhoduje strana D2000. Po každej zmene špecifikácie preto znovu skontrolujte poradie parametrov dotknutých procedúr.

Chyby v špecifikácii

Nasledujúce prípady sú tvrdou chybou načítania špecifikácie: chyba sa zaloguje a zmena sa neprejaví (zostáva nasadená predchádzajúca funkčná verzia).

  • rekurzívna schéma štruktúry (priamy alebo nepriamy cyklus $ref)

  • kolízia mien RPC parametrov v celom splošťenom strome alebo kolízia mien stĺpcov v jednej štruktúre — rieši sa atribútom x-d2-name

  • x-d2-structure-parent-rowid-column namapovaný na existujúcu JSON property

  • x-d2-structure-rowid-column namapovaný na property, ktorá nie je type: integer alebo nie je required

  • štruktúra s vnorenými štruktúrami bez x-d2-structure-rowid-column

  • vnorená štruktúra bez x-d2-structure-parent-rowid-column

  • x-d2-structure-name na property, ktorá referencuje komponent — patrí na samotný komponent

  • x-d2-structure-rowid-column a x-d2-structure-parent-rowid-column pomenúvajúce ten istý stĺpec

Konektor výstupného OpenAPI

Výstupný konektor umožňuje D2000 ESL skriptu volať externú HTTP službu. SmartWeb sa zaregistruje v D2000 ako proces; ESL skript zavolá RPC procedúru na tomto procese, konektor ju priradí k operácii načítanej OpenAPI špecifikácie, zapíše argumenty RPC ako telo JSON požiadavky a odošle ju. Odpoveď sa do D2000 vráti ako druhé RPC volanie.

Oba smery čítajú tie isté atribúty x-d2-* a rovnaké pravidlá vnorených štruktúr, takže jeden súbor špecifikácie môže naraz obsluhovať vstupné API aj výstupný konektor.

Konfigurácia

Každá položka openApiConnectors spúšťa jeden nezávislý konektor — vlastný D2000 proces, vlastný HTTP klient, vlastné špecifikácie.

smartweb: application: connectors: openApiConnectors: - local: processName: "SELF.OPENAPI_CONNECTOR" remote: connectionUrl: "https://external-api.example.com/base/" authType: "USERNAME_PASSWORD" # USERNAME_PASSWORD | API_KEY | OAUTH2 username: "user" password: "secret" # apiKey: "external-service-key" # authType: API_KEY # realm: { ... } # authType: OAUTH2 truststore: path: config/cert/truststore.p12 password: changeit connectTimeout: 5000 requestTimeout: 45000 idleTimeout: 30000 addressResolutionTimeout: 5000 openApi: enabled: true specifications: - specificationFilePath: external_api.yaml specificationFormat: "YAML" specificationVersion: "3.0" generateDocumentation: true

Vlastnosť

Popis

Vlastnosť

Popis

local.processName

Meno D2000 procesu, pod ktorým sa konektor prihlasuje. ESL skript adresuje tento proces — objekt musí v D2000 existovať.

remote.connectionUrl

Základná URL externej služby. Cesta operácie zo špecifikácie sa voči nej resolvuje.

remote.authType

Autentifikácia výstupnej požiadavky — viď tabuľku nižšie. Bez nej sa neposiela žiadna autentifikačná hlavička.

remote.truststore.path / .password

Truststore na overenie TLS certifikátu cieľa https.

remote.connectTimeout / requestTimeout / idleTimeout / addressResolutionTimeout

Timeouty HTTP klienta v milisekundách (predvolene 5000 / 45000 / 30000 / 5000).

remote.openApi.specifications[]

Špecifikácie externého API — rovnaké vlastnosti ako pri vstupnom smere; contextPath tu nemá význam. Súbory sú sledované a pri zmene sa znovu načítajú.

[!IMPORTANT] connectionUrl musí končiť lomkou. Cesta operácie sa voči nej resolvuje ako relatívna URI, takže https://host/base bez koncovej lomky stratí segment base a každé volanie ide na https://host/….

Typy autentifikácie

authType

Odoslaná hlavička

Vyžaduje

authType

Odoslaná hlavička

Vyžaduje

(nenastavené)

žiadna

USERNAME_PASSWORD

Authorization: Basic …

username + password

API_KEY

X-API-Key: …

apiKey

OAUTH2

Authorization: Bearer … (token sa získava pri každom volaní, client-credentials grant)

realm

Volanie z ESL skriptu

INT _hConn _hConn := %StrToHBJ("SELF.OPENAPI_CONNECTOR.DCP") CALL [(0)] E.MyEvent.myOperation(_header, _rows, _nestedRows) ASYNC ON (_hConn) TC_BE _hTC
  • Konektor je JAPI proces, takže volanie nenesie odkaz na objekt ([(0)]) a proces sa adresuje cez HOBJ (ON (_hConn)). D2000 registruje reláciu (session) konektora pod menom local.processName s príponou .DCP — to je meno objektu, ktoré rozlíši %StrToHBJ; samotné meno procesu objektom nie je a vráti neplatnú hodnotu. Objekt existuje, až keď sa konektor prihlási. RPC procedúru, ktorá je implementáciou ESL rozhrania, takto volať nemožno.

  • Meno procedúry je x-d2-event-name + . + x-d2-event-rpc-name danej operácie, napísané doslova — mená objektov D2000 smú obsahovať bodku, takže sa meno preloží. Konektor ho rozdelí na poslednej bodke. Meno RPC s pomlčkou sa v ESL napísať nedá — použije sa podčiarkovník a konektor vyhľadanie zopakuje s pomlčkami.

  • Argumenty sú pozičné, v tom istom sploštenom poradí do hĺbky ako pri vstupnom smere, a musia sa odovzdať všetky, vrátane prázdnych štruktúr.

  • Odpoveď nie je návratová hodnota. Konektor odpovie v konverzácii cez on<Rpc>Response(<výstupné parametre>), resp. on<Rpc>Error(errorCode, errorMessage). Obe sú vo volajúcom skripte deklarované ako RPC PROCEDURE [_hTC, TC_E] a konverzáciu uzatvárajú. Ak procedúra neexistuje, konektor konverzáciu iba abortuje.

RPC PROCEDURE [_hTC, TC_E] onMyOperationResponse(IN RECORD NOALIAS (SD.Header) _header) ; spracovanie odpovede END onMyOperationResponse RPC PROCEDURE [_hTC, TC_E] onMyOperationError(IN TEXT _errorCode, IN TEXT _errorMessage) LOGEX _errorCode + " - " + _errorMessage PRIORITY _LOG_PRTY_ERROR END onMyOperationError

Chybové kódy

errorCode je mnemonický reťazec, nie HTTP stavový kód; niektoré kódy stav vzdialenej odpovede pripájajú.

errorCode

Príčina

errorCode

Príčina

ERROR_OPEN_API_MAPPING_MISSING

K menu event.rpc nie je v načítanej špecifikácii žiadna operácia

ERROR_OPEN_API_REQUEST_VALIDATION

RPC bolo zavolané s viac argumentmi, než má operácia parametrov

ERROR_OPEN_API_REQUEST_CREATION

Nepodarilo sa zostaviť telo JSON požiadavky

ERROR_OPEN_API_STRUCTURE_MAPPING

Mapovanie odpovede na D2000 štruktúry zlyhalo v SmartWebe — chýbajúci stĺpec alebo väzobný stĺpec

ERROR_OPEN_API_RESPONSE_ERROR: <status>(<reason>)

Externá služba odpovedala stavom mimo 2xx

ERROR_OPEN_API_RESPONSE_PARSING_ERROR: <status>(<reason>)

Odpoveď sa nepodarilo spracovať

ERROR_OPEN_API_REQUEST_SEND_FAILED

Požiadavku sa nepodarilo odoslať (spojenie, DNS, timeout)

ERROR_HTTP_CLIENT_NOT_RUNNING

HTTP klient konektora nebeží

ERROR_OPEN_API_OAUTH_OBTAINING_ACCESS_TOKEN_FAILED

Nepodarilo sa získať OAuth2 access token

Generované klientske stuby

Generovanie TypeScript klienta (structures.ts, events.ts) sa presunulo mimo OpenAPI — konfiguruje sa blokom smartweb.application.generator.d2jsapi[] a beží nad session core konektora. Kľúče clientOutputDirectory a useLegacyApi v špecifikácii boli odstránené a ich ponechanie nemá žiadny účinok. Pozri Generovanie TypeScript klienta pre D2000 RPC.

Generovaná dokumentácia špecifikácie

Ku každej spracovanej špecifikácii SmartWeb vytvorí Markdown report a poskytuje ho na tej istej ceste, na ktorej poskytuje aj samotný dokument:

URL

Vráti

URL

Vráti

GET /api/open/<contextPath>/openapi.yaml

nasadenú špecifikáciu daného kontextu

GET /api/open/status.md

report všetkých špecifikácií instancie (text/markdown)

Napríklad http://localhost:8098/smartweb/api/open/status.md.

[!NOTE] Report je jeden na celú instanciu, nie na kontext: patrí k súboru špecifikácie a súbory sa na kontextové cesty nemapujú — špecifikácia výstupného konektora nie je publikovaná pod žiadnou. Ak je ten istý súbor použitý v oboch smeroch, je v reporte raz, so sekciou pre každý smer. Žiadny súbor sa nezapisuje na disk — report sa poskladá až pri požiadavke a overí sa voči D2000 cez reláciu (session) tej istej požiadavky, teda pod právami toho, kto si ho vyžiadal (API kľúč, JWT alebo Basic auth). Vypína sa generateDocumentation: false pri danej špecifikácii.

Report je krátky — je to hlásenie, nie opis špecifikácie:

  • jedna veta na každý smer: YAML correctly processed s počtom naviazaných operácií, alebo YAML was NOT processed aj s doslovnou chybou mapovania,

  • sekcia Structures on the D2000 sidesekcia pre každú SD.*, ktorú špecifikácia mapuje, v akomkoľvek stave: vyhovuje, nevyhovuje (chýbajúci stĺpec, zlý typ, rowId / parentRowId, ktorý nie je Integer), v D2000 chýba, alebo ju D2000 má, ale nepublikuje (viď nižšie, aj s HOBJ). Každá z nich končí celým rozložením stĺpcov, ktoré špecifikácia na štruktúru mapuje, takže sa dá vytvoriť alebo opraviť priamo z reportu,

  • sekcia RPC procedures the D2000 side has to declareESL hlavička každej naviazanej RPC procedúry (pre vstupný smer vrátane odpovede CALL [_hTC] Result(…) ASYNC TC_E, pre výstupný smer volanie a obe callback procedúry on<Rpc>Response / on<Rpc>Error). Hlavičky sa skladajú zo špecifikácie a neoverujú sa voči D2000 — RPC procedúra je súčasťou ESL skriptu. Výstupný parameter, ktorý by zopakoval meno vstupného, je premenovaný príponou Out (_headerOut), pretože ESL rovnaké meno parametra dvakrát nepripúšťa — parametre sa odovzdávajú pozične,

  • sekcia Recursion in the specification, ak súbor obsahuje rekurzívnu schému.

Ak nechýba nič, celý report má zopár riadkov. Parametre fungujúcich operácií ani stĺpce vyhovujúcich štruktúr sa nevypisujú — to je obsah samotnej špecifikácie, ktorú poskytuje openapi.yaml.

[!NOTE] status.md odpovie aj vtedy, keď špecifikáciu vôbec nebolo možné spracovať — práve ten report je jediné miesto, ktoré povie prečo.

Chýba, alebo sa nepublikuje?

D2000 posiela definície štruktúr JAPI klientovi ako shared resources. SD.* objekt teda môže v D2000 existovať a relácia (session) o jeho definícii aj tak nemusí vedieť — typicky pri práve vytvorenej štruktúre, ktorú ešte žiadna bežiaca D2000 strana nepoužíva. Preto sa SmartWeb pri chýbajúcej definícii spýta priamo jadra (getObjectInfo) a report rozlíši dva stavy:

Definícia v relácii (session)

Objekt v jadre

V reporte

Definícia v relácii (session)

Objekt v jadre

V reporte

je

overia sa stĺpce

nie je

neexistuje

missing in D2000 aj so stĺpcami, ktoré treba vytvoriť

nie je

existuje

is not published by D2000, aj s HOBJ a odporúčaním spustiť/prekompilovať ESL skript, ktorý ju deklaruje

Takto sa overujú len štruktúry — RPC procedúry sa neoverujú vôbec.

[!IMPORTANT] Kým D2000 definíciu štruktúry nepublikuje, volanie, ktoré ju mapuje, skončí chybou 500 s rovnakým vysvetlením — nie je to problém špecifikácie, ale stavu D2000 strany.

Report je vždy aktuálny

Skladá sa pri každej požiadavke, takže netreba nič invalidovať:

  • súbory špecifikácií sa pri každej požiadavke overia na disku a čo sa zmenilo, sa znovu načíta — stačí súbor upraviť a znovu načítať URL, nečaká sa na sledovanie súborov,

  • D2000 strana sa číta v momente požiadavky — stačí vytvoriť chýbajúcu SD.* v CNF a znova načítať URL, restart nie je potrebný,

  • RPC procedúry sa neoverujú — ich hlavičky sú to, čo špecifikácia od D2000 strany očakáva, a vypíšu sa bez ohľadu na to, či ich D2000 deklaruje.

Ak je tá istá špecifikácia použitá v oboch smeroch (publikovaná ako vstupné API a zároveň volaná cez výstupný konektor), report má sekciu pre každý smer a jednu spoločnú sekciu Structures on the D2000 side.

[!NOTE] Overenie štruktúr voči D2000 vyžaduje reláciu (session) na D2000 — použije sa tá z požiadavky. Ak sa nedá zistiť, report sa poskytne tiež, kontrola štruktúr je však označená ako neoverená aj s dôvodom. Kvôli reportu sa žiadna ďalšia relácia (session) neotvára.

Rekurzia v špecifikácii

Komponent, ktorý odkazuje sám na seba, nemá v D2000 ekvivalent — štruktúra je plochá tabuľka a bunka nevie obsahovať ďalšiu štruktúru — takže celá špecifikácia je odmietnutá. Report v takom prípade obsahuje sekciu Recursion in the specification: cyklus ako cestu (OrgNode -> children -> OrgNode) a jeho rozvinutie na pevnú hĺbku — jeden komponent na úroveň (OrgNodeL1OrgNodeL3), všetky namapované na tú istú SD.*, koreň deklaruje len x-d2-structure-rowid-column, každá nižšia úroveň aj x-d2-structure-parent-rowid-column a posledná už žiadnu vnorenú property nemá.