Manifest
A poltura.app.json minden mezője közérthetően, cél szerint csoportosítva, a típusával, korlátaival, alapértelmezett értékével, példával és a CLI által elutasított hibákkal.
Ezen az oldalon
A poltura.app.json az app-projekted gyökerében található, és leír mindent, amit a Polturának tudnia kell az
appról: mi az, milyen boltadatokat kér el, hol fut a szervere, mit rajzol ki az adminfelületen és a
webáruházban, valamint milyen eseményeket és műveleteket kezel. A poltura app build ellenőrzi, kötegeli a
workerjeidet, és létrehozza a release manifestet (dist/manifest.json). Ezt a fájlt hagyja jóvá a
bíráló, és ezt telepíti a kereskedő.
A CLI szándékosan szigorú:
- Az ismeretlen mezők hibát okoznak. Egy elírás, mint a
redirectUrl(aredirectUrlshelyett), hibát jelez, nem pedig csendben figyelmen kívül hagyott beállítás. - A platform belső működésére vagy hitelesítő adatokra hasonlító nevek hibát okoznak, bárhol is szerepelnek:
olyan kulcsok vagy azonosítók, mint a
token,secret,api_key,password,database,query,codevagyworkflow. Egy app soha nem kap hozzáférést a platform belső felületeihez, így a manifestben sincs mód ilyet kérni. - A hibaüzenetek megnevezik a mezőt. A CLI kiírja az elérési utat és az indokot, például:
app config schema: permissions.required.0.purpose: purpose must explain the merchant-visible use. A0a lista első eleme.
Egy teszt folyamatosan összeveti ezt az oldalt a CLI sémájával: a táblázatok minden sorát, a kötelező jelöléseket,
az alapértelmezéseket és az alábbi összes JSON-példát, amelyeket egy valós manifest részeként el kell fogadnia.
Egy mezőt sem lehet úgy hozzáadni vagy eltávolítani, hogy ez az oldal ne változzon. A Kötelező jelölés a szülőjén
belül kötelezőt jelent: az actions[].id minden műveletben kötelező, de maga az actions nem kötelező.
Egy rövid manifest
Ez a natív widgetes példa (Parcel helper) teljes manifestje: két adminpanel és két művelet. Minden, ami nincs felsorolva, az alapértelmezett értékét veszi fel. A lejjebb található rövidebb JSON-példák egy ilyen manifest részletei.
{
"schemaVersion": 1,
"apiVersion": "v1",
"handle": "parcel-helper",
"releaseVersion": "1.0.0",
"displayName": "Parcel helper",
"description": "Suggests a box size on order pages and checks product listings before they go live.",
"translations": [
{
"locale": "hu-HU",
"displayName": "Csomagsegéd",
"description": "Dobozméretet javasol a rendeléseknél, és ellenőrzi a termékoldalakat élesítés előtt."
}
],
"supportUrl": "https://parcel-helper.example.com/support",
"privacyUrl": "https://parcel-helper.example.com/privacy",
"backendOrigin": "https://parcel-helper.example.com",
"redirectUrls": ["https://parcel-helper.example.com/oauth/callback"],
"permissions": {
"required": [
{
"id": "orders.read",
"purpose": "Read the items of the order you have open to suggest a box"
},
{
"id": "products.read",
"purpose": "Read the product you have open to check its listing"
}
],
"optional": []
},
"actions": [
{
"id": "suggest_box",
"purpose": "Suggest a box size from the items of the open order",
"surfaces": ["admin"]
},
{
"id": "check_listing",
"purpose": "Check the title, description and image of the open product",
"surfaces": ["admin"],
"timeoutMs": 3000
}
],
"workers": [
{
"target": "admin.order",
"entry": "src/workers/order-panel.tsx",
"stylesheet": "src/styles.css"
},
{
"target": "admin.product",
"entry": "src/workers/product-panel.tsx",
"stylesheet": "src/styles.css"
}
]
}A mezők funkciójuk szerint csoportosítva:
| Csoport | Mezők |
|---|---|
| Identitás | schemaVersion, apiVersion, handle, releaseVersion, displayName, description, translations, appId |
| Hivatkozások és a szervered | supportUrl, privacyUrl, homepageUrl, backendOrigin, redirectUrls |
| Bolti hozzáférés | permissions |
| Admin- és webáruház-felület | workers, elements, adminPages, storefrontPages, adminFrame |
| Szerverhívások és események | actions, webhooks, destinations |
| Appszintű beállítások | settings |
| Speciális | extensions, uiRuntime, sources |
Identitás
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
schemaVersion | Az 1-es szám | Igen | Nincs |
apiVersion | A "v1" sztring | Igen | Nincs |
handle | 2–64 karakter: kisbetűk és számjegyek, szimpla kötőjelekkel elválasztva | Igen | Nincs |
releaseVersion | Szemantikus verzió build-metaadatok nélkül, például 1.0.0 vagy 1.1.0-beta.1 | Igen | Nincs |
displayName | 1–80 karakter | Igen | Nincs |
description | 1–1024 karakter | Igen | Nincs |
translations | Legfeljebb 16 elemű lista, nyelvenként egy | Nem | Nincs |
translations[].locale | Nyelvi címke, például hu-HU vagy de | Igen | Nincs |
translations[].displayName | 1–80 karakter | Nem | Nincs |
translations[].description | 1–1024 karakter | Nem | Nincs |
appId | app_, amelyet 26 betű és számjegy követ | Nem | Nincs |
- A
schemaVersionésapiVersiona manifest formátumát és az App API verzióját jelöli, amelyre az app készült. Jelenleg csak ezek az értékek fogadhatók el. - A
handleaz appod állandó azonosítója. Pontosan meg kell egyeznie az Azonosító mezővel, amelyet az app létrehozásakor megadtál a Fejlesztői alkalmazások felületén; közzétételkor minden más azonosítójú release-t elutasít a rendszer. Ezt később nem módosíthatod. - A
releaseVersionazonosítja a release-t a bírálók és a kereskedők számára. Minden közzétett release-hez használj új verziót, hogy meg tudd különböztetni őket. - A
displayNameésdescriptionjelenik meg a kereskedőknek a jogosultsági képernyőn és a telepített appok listájában. - A
translationsmás nyelveken adja meg a nevet és a leírást. Minden elemnek tartalmaznia kell adisplayName, adescriptionmezőt vagy mindkettőt, és mindenlocalecsak egyszer szerepelhet. - Az
appIdmezőt csak a CLI olvassa: apoltura app publishezt használja, ha elhagyod a--appkapcsolót. Nem másolódik át a release manifestbe.
{
"handle": "parcel-helper",
"releaseVersion": "1.2.0",
"displayName": "Parcel helper",
"description": "Suggests a box size on order pages.",
"translations": [{ "locale": "hu-HU", "displayName": "Csomagsegéd" }],
"appId": "0199f3a2-5b1c-7d4e-9f20-3a4b5c6d7e8f"
}Gyakori hibák:
- A
"handle": "Parcel-Helper"hibát jelez:handle must be lowercase letters and digits joined by single hyphens. - A
"releaseVersion": "v1.0.0"hibát jelez:must be a semver release without build metadata. Ugyanez igaz az1.0.0+build.5formátumra is. - A csak
localemezőt tartalmazó fordítás hibát jelez:translation must include displayName or description.
Hivatkozások és a szervered
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
supportUrl | HTTPS URL, legfeljebb 2048 karakter | Igen | Nincs |
privacyUrl | HTTPS URL, legfeljebb 2048 karakter | Igen | Nincs |
homepageUrl | HTTPS URL, legfeljebb 2048 karakter | Nem | Nincs |
backendOrigin | HTTPS origin: séma és hoszt, opcionálisan port, utána semmi | Igen | Nincs |
redirectUrls | 1–10 különböző HTTPS URL | Igen | Nincs |
- A
supportUrlésprivacyUrlmegjelenik a bírálóknak és a kereskedőknek. Az adatvédelmi oldalnak ismertetnie kell, milyen boltadatokat tárolsz és mennyi ideig. - A
backendOrigina te szervered. Ide érkeznek a műveletek (lásd:actions). - A
redirectUrlstartalmazza azokat a címeket, amelyekre a Poltura visszairányíthatja a kereskedőt a kapcsolódás végén. AredirectUri, amelyet a szervered átad az SDK OAuth-kliensének, karakterről karakterre egyeznie kell valamelyikkel. A lista akkor is kötelező, ha az app soha nem hívja meg az App API-t; állítsd be arra a visszahívási útvonalra, amelyet használnál. Lásd: Hitelesítés.
Minden URL-t a pontos kanonikus formájában kell megadni, ahogyan a böngésző kiírná. Ez kiszűr néhány váratlan hibát:
- Az önmagában álló origin végére kötelező a perjel: a
"homepageUrl": "https://parcel-helper.example.com"elutasításra kerül a következő hibával:HTTPS URL must be the exact canonical href; írd így:https://parcel-helper.example.com/. - A hosztnevek csupa kisbetűsek, az alapértelmezett portok elmaradnak, és nincs bennük
#fragment, felhasználónév vagy jelszó. - A
http://hibát okoz, ahogyan a helyettesítő karakterek is (példáulhttps://*.example.com/callback). - A
"backendOrigin": "https://parcel-helper.example.com/api"hibát jelez:backend origin must not include a path or query.
Bolti hozzáférés
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
permissions | Két listát tartalmazó objektum | Igen | Nincs |
permissions.required | Legfeljebb 32 jogosultságkérés az optional listával együtt | Igen | Nincs |
permissions.required[].id | A jogosultság-azonosítók egyike, például products.read | Igen | Nincs |
permissions.required[].purpose | 8–280 karakter | Igen | Nincs |
permissions.optional | Legfeljebb 32 jogosultságkérés a required listával együtt | Igen | Nincs |
permissions.optional[].id | A jogosultság-azonosítók egyike | Igen | Nincs |
permissions.optional[].purpose | 8–280 karakter | Igen | Nincs |
A jogosultság lehetővé teszi, hogy az appod az App API-n keresztül olvasson vagy módosítson egy adott típusú boltadatot.
Ezek megegyeznek azokkal a jogosultságokkal, amelyeket a kereskedők a csapattagjaiknak adnak. A kereskedő a jóváhagyás
előtt a telepítési képernyőn látja az összes jogosultságot az általad megadott purpose leírással, és az összes required
jogosultságot megadja. Az optional jogosultságokat elutasíthatja, ezért mielőtt olyan API-t hívnál, amelyhez szükség
lenne rájuk, ellenőrizd, mit hagyott jóvá a kereskedő (lásd: Hitelesítés). Ha az app nem olvas boltadatokat,
nem kell jogosultságot kérnie.
A célt a kereskedő szemszögéből, a boltjára vonatkoztatva fogalmazd meg: „A megnyitott rendelés tételeinek olvasása a dobozméret javaslatához”, ne pedig így: „Az API-hoz szükséges”.
"permissions": {
"required": [{ "id": "products.read", "purpose": "List your products to pick featured ones" }],
"optional": [{ "id": "products.write", "purpose": "Mark your featured products in the catalog" }]
}Gyakori hibák:
- Az
optionalelhagyása: mindkét lista kötelező, ezért írd így:"optional": []. - Ugyanaz a jogosultság mindkét listában, vagy kétszer ugyanabban a listában hibát jelez:
permission "orders.read" cannot be both required and optional. - A kötelező írási jogosultság magában foglalja az olvasást is, így az olvasás nem lehet nem kötelező: a
products.readegy kötelezőproducts.writemellett hibát jelez:permission "products.read" comes with the required "products.write" and cannot be optional. - A 8 karakternél rövidebb cél hibát jelez:
purpose must explain the merchant-visible use. - Olyan azonosító, amely nem szerepel a katalógusban, például
products:readkettősponttal aproducts.readhelyett. - Több jogosultság kérése, mint amennyit az app ténylegesen használ. A bíráló és a kereskedő minden jogosultságot lát; csak azt kérd, amire az appnak valóban szüksége van.
Admin- és webáruház-felület
workers
A worker a natív kezelőfelület egy része, amelyet Reactben írsz a Poltura komponenseivel, és a CLI bundle-özi. Mindegyik worker egy adott célterületre (target) renderelődik: egy helyre az adminfelületen vagy a webáruházban.
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
workers | 1–16 worker | Nem (lásd alább) | Nincs |
workers[].target | Az UI-célterületek egyike, például admin.order | Igen | Nincs |
workers[].entry | A startUiWorker-t meghívó .tsx fájl elérési útja a projekthez képest | Igen | Nincs |
workers[].stylesheet | CSS-fájl elérési útja a projekthez képest | Nem | Nincs |
workers[].inheritTheme | true vagy false | Nem | true |
workers[].element | Egy defineBlock type értéke az elements fájljaidból | A webáruház blokk-célterületeihez | Nincs |
workers[].path | A bundle helye a release-ben: .js-re végződő relatív elérési út | Nem | workers/<entry file name>.js |
- A projekthez szükséges a
workerslista, vagy helyette a speciálisuiRuntimeéssourcespáros. Minden appnak van legalább egy workere; a kizárólag hosztolt felületű appok is tartalmaznak egy kisebb workert, például egy kezdőképernyős kártyát. - A
targethatározza meg, hol jelenik meg a worker. Az adminisztrációs célok oldalak, a kezdőlap, valamint a termékek, gyűjtemények, rendelések és vásárlók részletező paneljei. A webáruházi célok a sablonra helyezhető blokkok, a header- és lábléczónák, valamint az appoldalak. Lásd: Adminfelület és Webáruház. - A
stylesheeta Tailwinddel fordul le, és bekerül a release-be. BekapcsoltinheritThememellett a gazdafelület színei, betűtípusai, lekerekítései, árnyékai és térközei átadódnak a worker stílusainak, így illeszkedik az adminfelülethez vagy a bolt témájához. Lásd: Stílusok. - Az
elementösszekapcsolja a webáruházi blokk-workert adefineBlockdefinícióval, amely nevet, ikont és beállításokat ad neki a témaszerkesztőben. Kötelező a webáruházi sabloncélokhoz, valamint a header- és lábléczónákhoz, és nem kötelező astorefront.app-pageés adminisztrációs célok esetén.
elements
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
elements | Egy fájl elérési útja, vagy 1–32 útvonal listája | Ha bármelyik worker vagy kiterjesztés element-et jelöl meg | Nincs |
A defineBlock hívásokat tartalmazó fájlok. A build futtatás nélkül olvassa őket, és megáll a fájl, sor és oszlop
megjelölésével, ha valamelyik definíciót nem tudja értelmezni. Lásd: Beállítások és fordítások.
adminPages
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
adminPages | Legfeljebb 8 oldal | Nem | Nincs |
adminPages[].id | 1–48 karakter, snake_case | Igen | Nincs |
adminPages[].path | Egy olyan worker path értéke, amelynek célterülete admin.page | Igen | Nincs |
adminPages[].title | Egyszerű szöveg, legfeljebb 60 karakter | Igen | Nincs |
adminPages[].translations | Legfeljebb 16 elem, nyelvenként egy | Nem | Nincs |
adminPages[].translations[].locale | Nyelvi címke, például hu-HU | Igen | Nincs |
adminPages[].translations[].title | Egyszerű szöveg, legfeljebb 60 karakter | Igen | Nincs |
adminPages[].icon | Az alább felsorolt oldalikonok egyike | Nem | Nincs |
Egy admin.page worker önmagában nem érhető el. Ha itt felsorolod, bekerül az admin-navigáció Alkalmazások csoportjába,
a /apps/<installation id>/<page id> címen. Az adminfelület annak a fordításnak a címét jeleníti meg, amelynek a
locale értéke pontosan egyezik a kereskedő nyelvével, majd az azonos nyelvűt (hu-HU esetén hu), végül a title mezőt.
Oldalikonok: home, box, boxes, cart, receipt, users, user, tag, settings, chart, globe,
mail, file, files, image, link, star, heart, grid, list, search, bell, calendar,
message.
storefrontPages
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
storefrontPages | Legfeljebb 8 oldal | Nem | Nincs |
storefrontPages[].id | 1–48 karakter, snake_case, eltér minden adminoldal azonosítójától | Igen | Nincs |
storefrontPages[].path | Egy olyan worker path értéke, amelynek célterülete storefront.app-page | Igen | Nincs |
storefrontPages[].title | Egyszerű szöveg, legfeljebb 60 karakter | Igen | Nincs |
storefrontPages[].slug | 1–48 karakter: kisbetűk, számjegyek és kötőjelek | Igen | Nincs |
storefrontPages[].translations | Legfeljebb 16 elem, nyelvenként egy | Nem | Nincs |
storefrontPages[].translations[].locale | Nyelvi címke, például hu-HU | Igen | Nincs |
storefrontPages[].translations[].title | Egyszerű szöveg, legfeljebb 60 karakter | Igen | Nincs |
storefrontPages[].icon | A fenti oldalikonok egyike | Nem | Nincs |
storefrontPages[].seo | Egy objektum | Nem | { "indexable": false } |
storefrontPages[].seo.indexable | true vagy false | Nem | false |
A webáruházi oldalt a kereskedő boltjában a /apps/<slug> route-on szolgálja ki a rendszer. Hagyd az indexable mezőt
kikapcsolva, kivéve, ha az oldal olyan tartalmat hordoz, amelyet a keresőknek indexelniük kell. Ezeket a slugokat a bolt már
használja, így nem adhatók meg: products, cart, checkout, account, profile, blog, guides, legal, contact,
faq, claim, review, order, auth, pages, apps, api, sitemap, robots.
"workers": [
{ "target": "admin.page", "entry": "src/workers/settings-page.tsx" },
{ "target": "storefront.app-page", "entry": "src/workers/wishlist.tsx", "element": "wishlist-page" }
],
"elements": "src/elements.ts",
"adminPages": [{ "id": "settings", "path": "workers/settings-page.js", "title": "Settings", "icon": "settings" }],
"storefrontPages": [
{
"id": "wishlist",
"path": "workers/wishlist.js",
"title": "Wishlist",
"slug": "wishlist",
"translations": [{ "locale": "hu-HU", "title": "Kívánságlista" }]
}
]Gyakori hibák:
- Az
elementnélküli webáruházi blokk-worker hibát jelez:worker storefront.home is a block merchants place: name its defineBlock type in "element". - Az
elementmező azelementsmegadása nélkül hibát jelez:"element": "parcel" needs "elements" pointing at the files with its defineBlock call. - Az oldal
pathmezője, ha nem lefordított worker-útvonalra mutat, hibát jelez:admin page "parcel" path "workers/parcel.js" must match a uiRuntime worker whose target is admin.page. A lefordított elérési út aworkers/mappa és a belépési fájl neve.jskiterjesztéssel, hacsak a worker nem ad meg sajátpathértéket. - A
"slug": "cart"hibát jelez:slug "cart" is reserved. - A címek egyszerű szövegek: a HTML-tagek, a
javascript:és a hasonlók nem megengedettek.
adminFrame
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
adminFrame | Egy objektum | Nem | Nincs |
adminFrame.url | HTTPS URL query és töredék nélkül, nyilvános hosztnéven | Igen | Nincs |
adminFrame.actions | A bridge-műveletek listája, amelyeket az oldal használhat, mindegyik egyszer | Igen | Nincs |
A hosztolt oldal egy olyan oldal, amelyet a saját szerveredről szolgálsz ki, és az adminfelületen belül egy iframe-ben
jelenik meg. Akkor érdemes választani, ha saját HTML-re és JavaScriptre van szükséged. Az actions listázza, hogy az oldal
mire kérheti meg az adminfelületet: toast, set_loading, navigate_host, pick_resource, resize, get_session_token
és get_appearance. Add hozzá a get_session_token értéket, ha az oldal hívásokat indít a szervered felé; lásd:
Hitelesítés.
"adminFrame": { "url": "https://catalog-glance.example.com/app", "actions": ["get_session_token"] }A localhost, *.localhost és az IP-címek hibát jeleznek: App pages require a public HTTPS hostname.. A hosztolt oldalakat
valódi HTTPS-hosztnéven teszteld, például tunnelön keresztül.
Szerverhívások és események
actions
A művelet egy natív workerből a szervered felé indított hívás. A worker meghívja a useAction('suggest_box') függvényt,
a platform aláírja a kérést és elküldi a szerveredre, a szervered válasza pedig visszajut a workerhez. A szervered soha nem
kapja meg a kereskedő hitelesítési adatait, a worker pedig soha nem kapja meg a tieidet.
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
actions | Legfeljebb 32 művelet | Nem | Nincs |
actions[].id | 1–48 karakter, snake_case, betűvel kezdődik | Igen | Nincs |
actions[].path | A backendOrigin-en belüli útvonal / jellel kezdve, legfeljebb 256 karakter | Nem | /actions/<id> |
actions[].purpose | 8–280 karakter | Igen | Nincs |
actions[].surfaces | admin, storefront vagy mindkettő | Igen | Nincs |
actions[].timeoutMs | 1000–10000 | Nem | 5000 |
actions[].maxInputBytes | 1–32768 | Nem | 32768 |
actions[].maxOutputBytes | 1–65536 | Nem | 65536 |
- A
surfaceshatározza meg, honnan hívhatják a workerek a műveletet. A webáruházi hívás a vásárló adatait is továbbítja. - A
timeoutMsazt adja meg, hogy a platform mennyi ideig vár a szervered válaszára, mielőtt a worker hívása meghiúsulna. - A
maxInputBytesésmaxOutputByteskorlátozza az oda-vissza küldött JSON méretét; csökkentsd őket a művelet valós igényeihez.
A műveletek szerveroldali fogadásáról és ellenőrzéséről a createActionHandler használatával a
Hitelesítés oldalon olvashatsz.
Gyakori hibák: az "id": "suggestBox" hibát jelez: action id must be snake_case; a "timeoutMs": 20000 hibát ad:
Number must be less than or equal to 10000; az "id": "token" nem engedélyezett: action id "token" is not allowed; a
?, #, .. vagy // karaktereket tartalmazó route hibát jelez: action path must be relative to backendOrigin.
webhooks
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
webhooks | Legfeljebb 16 feliratkozás | Nem | Nincs |
webhooks[].topic | A webhook-témák egyike, például order.created | Igen | Nincs |
webhooks[].destination | HTTPS URL | Igen | Nincs |
A Poltura aláírt POST kérést küld a destination címre, amikor az esemény bekövetkezik egy olyan boltban, amely telepítette
az appodat. Minden témához szükség van az adatai olvasásához tartozó jogosultságra: az order.* témákhoz az orders.read
kell. Az app.* lifecycle eventekhez nem szükséges jogosultság. Minden téma és minden célcím legfeljebb egyszer szerepelhet.
Lásd: Webhookok.
destinations
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
destinations | Legfeljebb 16 | Nem | Nincs |
destinations[].id | 1–64 karakter, snake_case | Igen | Nincs |
destinations[].url | HTTPS URL | Igen | Nincs |
destinations[].purpose | 8–280 karakter | Igen | Nincs |
A te oldaladon lévő egyéb címek, amelyek boltadatokat fogadnak; deklarálni kell őket, hogy a jóváhagyásra benyújtott release részét képezzék. A Poltura ellenőrzi és eltárolja őket, de jelenleg nem küld rájuk adatot. Az azonosítóknak és az URL-eknek egyedinek kell lenniük.
Appszintű beállítások
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
settings | Legfeljebb 32 mező | Nem | Nincs |
settings[].id | 1–64 karakter, snake_case | Igen | Nincs |
settings[].type | string, number, boolean, url vagy enum | Igen | Nincs |
settings[].label | 1–80 karakter | Igen | Nincs |
settings[].description | Legfeljebb 280 karakter | Nem | Nincs |
settings[].required | true vagy false | Nem | Nincs |
settings[].default | A mező típusának megfelelő érték: legfeljebb 500 karakteres szöveg, HTTPS URL vagy az options elemeinek egyike | Nem | Nincs |
settings[].options | 1–32 érték, mindegyik legfeljebb 64 karakter | enum esetén | Nincs |
A Poltura ellenőrzi ezeket a mezőket és a release-zel együtt tárolja őket, de jelenleg még egyetlen adminképernyő sem jeleníti meg őket.
A kereskedő által ma szerkeszthető beállítások a workerhez tartoznak: a defineBlock definícióból származnak, és a useSettings()
függvénnyel olvashatók be. Lásd: Beállítások és fordítások.
Gyakori hiba: ha az enum típusú mező default értéke nem szerepel az options listában, hibát ad: enum default must be one of the options.
Bejelentkezési szolgáltatók
A bejelentkezési appok segítségével a vásárlók külső fiókkal (például Google vagy Discord) jelentkezhetnek be az áruházba. A Poltura saját bejelentkezési appjai az identity_provider mezőben deklarálják a szolgáltatójukat a manifestjükben; az ezen az oldalon található poltura.app.json formátum ezt még nem fogadja el, így a közzétett appok nem adhatnak hozzá ilyet.
| Mező | Típus és korlátok |
|---|---|
identity_provider.spec.protocol | oidc vagy oauth2 |
identity_provider.spec.issuer | oidc esetén: egy HTTPS URL |
identity_provider.spec.scopes | Legfeljebb 20 scope név; oidc esetén legalább egy |
identity_provider.spec.authorizeParams | Legfeljebb 8 extra lekérdezési paraméter az engedélyezési kéréshez, olyan nem lehet, amelyet a bejelentkezés maga állít be |
identity_provider.spec.authorizationEndpoint | oauth2 esetén: egy HTTPS URL |
identity_provider.spec.tokenEndpoint | oauth2 esetén: egy HTTPS URL |
identity_provider.spec.userinfoEndpoint | oauth2 esetén: egy HTTPS URL |
identity_provider.spec.pkce | oauth2 esetén: false kizárólag olyan szolgáltatónál, amely megtagadja a PKCE-t |
identity_provider.spec.claims | oauth2 esetén: subject, valamint opcionálisan email, emailVerified, givenName, familyName, name, username (a kezelőnév, ha a name üres) |
identity_provider.settings.client_id | Annak az app-beállításnak az id-ja, amely a kereskedő client id-ját tárolja |
identity_provider.settings.client_secret | Annak az app-beállításnak az id-ja, amely a kereskedő client secret-jét tárolja |
- A kereskedő a saját hitelesítési adatait hozza. Létrehoz egy klienst a szolgáltatónál, majd megadja annak azonosítóját (id) és titkos kulcsát (secret) az app beállításaiban. A secret soha nem jut el a vásárló böngészőjébe.
- Egyetlen átirányítási cím. Az app beállítási lépései megjelenítik azt az egyetlen átirányítási címet, amelyet a kereskedő regisztrál a szolgáltatónál.
- Alkalmazásonként egy gomb. Amíg az alkalmazás telepítve és engedélyezve van, valamint mindkét hitelesítési adat be van állítva, a webáruház felületén megjelenik hozzá egy bejelentkezési gomb, amint a regisztráció megerősítésre kerül – ez a módosítás után akár egy percet is igénybe vehet. Az alkalmazás kikapcsolása, eltávolítása vagy valamelyik hitelesítési adat törlése eltávolítja a gombot.
- Sablonok. A gombokat a
SocialSignInpart rajzolja ki; aproviderspropja app id alapján korlátozza őket, mint például azauth-google. - A vásárló címe. Az a vásárló, akinek a címét a szolgáltató igazolja, közvetlenül bejelentkezik. Ha már létezik fiók ezzel a címmel, vagy a szolgáltató nem igazolja a címet, először egy kód érkezik e-mailben erre a címre. Ha a szolgáltató nem ad vissza címet, a webáruház rákérdez egyre, és ugyanígy igazoltatja azt.
Speciális
A legtöbb appnak ezekre soha nincs szüksége.
| Mező | Típus és korlátok | Kötelező | Alapértelmezett |
|---|---|---|---|
extensions | Legfeljebb 16 deklaratív JSON-dokumentum | Nem | Nincs |
extensions[].kind | declarative_admin_page vagy declarative_storefront_block | Igen | Nincs |
extensions[].target | admin.page az adminoldalakhoz; storefront.home, storefront.product vagy storefront.cart a blokkokhoz | Igen | Nincs |
extensions[].path | A JSON-dokumentum elérési útja a projektben | Igen | Nincs |
extensions[].digest | A dokumentum SHA-256 lenyomata sha256-<base64> formátumban | Igen | Nincs |
extensions[].mediaType | application/vnd.poltura.extension.v1+json | Igen | Nincs |
extensions[].element | A webáruházi blokk-dokumentum defineBlock típusa | declarative_storefront_block esetén | Nincs |
uiRuntime | Egy objektum a workers helyett | Nem | Nincs |
uiRuntime.version | Az 1-es szám | Igen | Nincs |
uiRuntime.workers | 1–16 worker | Igen | Nincs |
uiRuntime.workers[].target | Az UI-célterületek egyike | Igen | Nincs |
uiRuntime.workers[].path | A bundle helye a release-ben, .js-re végződve | Igen | Nincs |
uiRuntime.workers[].stylesheet | Egy objektum | Nem | Nincs |
uiRuntime.workers[].stylesheet.path | A CSS helye a release-ben | Igen | Nincs |
uiRuntime.workers[].stylesheet.inheritTheme | true vagy false | Nem | true |
uiRuntime.workers[].element | Egy defineBlock type értéke | A webáruház blokk-célterületeihez | Nincs |
sources | Leképezés az egyes uiRuntime útvonalakról arra a forrásfájlra, amelyből készültek | uiRuntime megadásakor | Nincs |
- Az
extensionselemek deklaratív dokumentumok: egyszerű oldalt vagy blokkot leíró JSON, kód nélkül. Az új appok workereket használnak. - Az
uiRuntimeéssourcespárossal te magad adhatod meg a release route-okat ahelyett, hogy aworkersképezné le őket:
"uiRuntime": {
"version": 1,
"workers": [{ "target": "storefront.home", "path": "workers/home.js", "element": "home-offer" }]
},
"sources": { "workers/home.js": "src/workers/storefront-home.tsx" },
"elements": "src/elements.ts"Release-korlátok
- Release-enként 16 worker, bundle-önként legfeljebb 1 MiB méretben, stylesheetenként legfeljebb 256 KiB méretben.
- A release manifest legfeljebb 256 KiB, és a teljes release feltöltése legfeljebb 22 MiB lehet.
- Egy appnak egyszerre egy release-e lehet bírálat alatt.
Egy teljes példa
A példaalkalmazás bemutatójának manifestje öt workerrel, műveletekkel, webhookokkal és oldalakkal:
{
"schemaVersion": 1,
"apiVersion": "v1",
"handle": "recommendations",
"releaseVersion": "1.0.0",
"displayName": "Recommendations by Poltura Labs",
"description": "Product recommendations for admin settings, product panels, storefront blocks, footer capture, and an app-owned page.",
"translations": [
{
"locale": "hu-HU",
"displayName": "Ajánlások a Poltura Labs-tól",
"description": "Termékajánlók az adminhoz, a termékoldalhoz, a lábléchez és egy alkalmazásoldalhoz."
}
],
"supportUrl": "https://recommendations.apps.example.com/support",
"privacyUrl": "https://recommendations.apps.example.com/privacy",
"homepageUrl": "https://recommendations.apps.example.com/",
"backendOrigin": "https://recommendations.apps.example.com",
"redirectUrls": ["https://recommendations.apps.example.com/oauth/callback"],
"permissions": {
"required": [
{
"id": "settings.read",
"purpose": "Read store locale, currency, and public capabilities"
},
{
"id": "products.read",
"purpose": "List products and collections used as recommendation sources"
},
{
"id": "orders.read",
"purpose": "Read new orders that refresh recommendation weights"
}
],
"optional": []
},
"webhooks": [
{
"topic": "order.created",
"destination": "https://recommendations.apps.example.com/webhooks/orders"
},
{
"topic": "product.updated",
"destination": "https://recommendations.apps.example.com/webhooks/products"
}
],
"settings": [
{
"id": "highlight_mode",
"type": "enum",
"label": "Highlight mode",
"options": ["quiet", "featured"],
"default": "quiet"
}
],
"actions": [
{
"id": "save_featured",
"purpose": "Save featured product ids for this installation",
"surfaces": ["admin"]
},
{
"id": "recommend",
"purpose": "Return a product recommendation for the current shopper",
"surfaces": ["storefront"]
}
],
"destinations": [
{
"id": "newsletter_capture",
"url": "https://recommendations.apps.example.com/capture",
"purpose": "Receive optional newsletter captures from the footer worker"
}
],
"adminPages": [
{
"id": "recommendations",
"path": "workers/admin-page.js",
"title": "Recommendations",
"translations": [
{
"locale": "hu-HU",
"title": "Ajánlások"
}
],
"icon": "star"
}
],
"storefrontPages": [
{
"id": "recs_page",
"path": "workers/app-page.js",
"title": "Recommendations",
"slug": "recommendations",
"translations": [
{
"locale": "hu-HU",
"title": "Ajánlások"
}
],
"icon": "star"
}
],
"elements": "src/elements.ts",
"workers": [
{
"target": "admin.page",
"entry": "src/workers/admin-page.tsx",
"stylesheet": "src/styles.css",
"element": "recommendations-panel"
},
{
"target": "admin.product",
"entry": "src/workers/admin-product.tsx",
"stylesheet": "src/styles.css"
},
{
"target": "storefront.product",
"entry": "src/workers/storefront-product.tsx",
"stylesheet": "src/styles.css",
"element": "recommendations"
},
{
"target": "storefront.layout.footer",
"entry": "src/workers/storefront-footer.tsx",
"stylesheet": "src/styles.css",
"element": "newsletter-capture"
},
{
"target": "storefront.app-page",
"entry": "src/workers/app-page.tsx",
"stylesheet": "src/styles.css",
"element": "recommendations-page"
}
]
}További lépések
- Hitelesítés: OAuth, session tokenek és aláírt műveletek, amelyekre a fenti mezők közül több is hivatkozik.
- Kezelőfelület: mit érdemes elhelyezni egy workerben.