API - GraphQL
Umožňuje rozšiřovat funkce eshopu, napojovat aplikace třetích stran a obecně pracovat s daty bez ohledu na naše programátory. Obsahuje řadu funkcí pro čtení a manipulaci s daty eshopu, nejčastěji používané funkce a příklady jejich použití jsou popsány na této stránce nápovědy, ucelený seznam a popis všech funkcí je pak k nalezení v kompletní dokumentaci API.
Pro aktivaci modulu nebo více informací kontaktujte naše zákaznické oddělení.
Technologie
Naše API využívá otevřený standard GraphQL, který umožňuje klientům definovat strukturu datových požadavků a odpovědí. Na rozdíl od pevně stanovených formátů, jako je SOAP nebo REST může klient specifikovat, jaká data požaduje, což usnadňuje agregaci odpovědí z různých zdrojů a zmenšuje celkový objem přenášených dat. Naše implementace podporuje čtení (dotazy) a změnu (mutace). Více informací na stránkách tvůrců https://graphql.org/.
Pro testování všech funkcionalit lze používat libovolný GrahpQL editor, doporučujeme například
Altair GraphQL Client https://altairgraphql.dev.
Dokumentace
Kompletní dokumentace se nachází na adrese https://graphql-docs.wpjshop.cz/
Autentifikace
Do pole X-Access-Token v hlavičce každého API requestu je třeba vložit přihlašovací token administrátorského účtu, který bude k přístupu na API používán. Ten se nachází na detailu účtu administrátora v záložce Přihlašování, je možné ho zde vygenerovat nebo přegenerovat. Zároveň je třeba administrátorovi udělit oprávnění API používat. To lze nastavit na záložce Oprávnění: Ostatní zaškrtnutím pole Používat u API.
➡️ Nastavení > Administrátoři
Omezení
U seznamů je omezen maximální počet položek na stránce na 1000. Pokud je zadána hodnota vyšší, vždy se použije nejvyšší možná hodnota.
#limit bude nastaven na 1000 query { orders(limit: 2000){...}}
Sledování změn
Slouží pro sledování změn, které vznikají na straně e-shopu. Umožňuje efektivně zachytit a zpracovat události, jako jsou například úpravy produktů, změny ve skladových zásobách a další relevantní aktualizace dat.
Při používání je nezbytné, aby každý klient (např. integrace, systém nebo aplikace) používal vlastní access token.
Pokud by více klientů sdílelo jeden společný API access token, docházelo by k tzv. kolizi odběru – jednotliví klienti by si změny navzájem „kradli“, protože každé změně je přiřazen stav zpracování na úrovni access tokenu.
Aby bylo možné změny spolehlivě sledovat a zpracovávat, je tedy nutné:
- vytvořit samostatný access token pro každý samostatný systém/klienta,
- zajistit, že nedochází ke sdílení tokenu mezi více aplikacemi nebo procesy.
Endpointy pro práci se změnami
- query changes - Slouží k načtení změn v e-shopu. Po načtení je nutné tyto změny potvrdit pomocí mutace changesConfirm, jinak nebudou doručovány další nové změny.
- mutation changesConfirm - Slouží k potvrzení zpracovaných změn. Přijímá jedno ID změny, přičemž všechny změny s tímto ID a nižším budou považovány za potvrzené.
- Například volání changesConfirm(changeId: 1000) potvrdí všechny změny s ID ≤ 1000 (včetně ID 1000).
- mutation changesReset - Slouží k resetování stavu zpracovaných změn – umožňuje znovu načítat změny od určitého data a času (např. v případě chyby při zpracování nebo potřeby opětovného importu).
Aktuálně podporované změny
- ProductChange - změna informací u produktu (název, popis, viditelnost atd...)
- Obsahuje ID změněného produktu a názvy změněných polí. Následně je možné pomocí query products načíst změněné produkty a aktualizovat si je.
- ProductVariationChange - změna informací u varianty (název, viditelnost atd...)
- Obsahuje ID změněné varianty a názvy změněných polí.
- ProductQuantityChange - změna skladové dostupnosti
- Obsahuje ID produktu, ID varianty, ID skladu a zároveň novou a starou hodnotu skladu.
- ProductPriceChange - změna ceny
- Obsahuje ID produktu, ID varianty, ID ceníku a zároveň novou a starou cenu i slevu.
Každá změna obsahuje metadata s obecnými údaji o změně
- id - unikátní ID změny
- action - typ změny (INSERT, UPDATE, DELETE)
- date - datum vzniku změny
Pro zjištění typu změny používejte pole __typename v GraphQL, které vrací typ objektu odpovídající konkrétnímu typu změny.
Do budoucna plánujeme postupné rozšiřování typů změn. Doporučujeme proto, aby vaše implementace zahrnovala logování neznámých nebo nezpracovaných typů změn – díky tomu budete mít přehled o tom, kdy začnou přicházet nové typy, které vaše aplikace zatím nezohledňuje.
Naopak v případě, že vás zajímá pouze určitý typ změn (např. změny ve skladu), doporučujeme všechny ostatní změny ignorovat a zpracovávat jen ty relevantní.
Jednotlivé typy změn jsou případně popsány v dokumentaci zde.
Příklad načítání změn je k vidění například v naší PHP knihovně pro komunikaci s API zde.
Queries
Seznam nejčastěji používaných queries k nimž jsou níže zpracovány příklady jejich využití.
Query |
Popis |
changes | Načtení změn |
order | Načtení objednávky |
orders | Seznam objednávek |
product | Načtení produktu |
products | Seznam produktů |
user | Načtení uživatele |
users | Seznam uživatelů |
Mutations
Seznam nejčastěji používaných mutations, k nimž jsou níže zpracovány příklady jejich využití.
Mutation | Popis |
changesConfirm | Potvrzení změn |
changesReset | Vrácení změn zpět k datu |
productCreateOrUpdate | Vytvoření nebo úprava produktu |
variationCreateOrUpdate | Vytvoření nebo úprava varianty |
productPriceListUpdate | Aktualizace ceny produktu v ceníku |
productStoreUpdate | Aktualizace stavu skladu u produktu |
orderCreate - Součást modulu Dropshipping | Vytvoření objednávky |
orderUpdate | Aktualizace objednávky |
orderStorno | Storno objednávky |
userCreateOrUpdate | Vytvoření nebo úprava uživatele |
Příklady
Načtení změn
query { changes(limit: 100) { __typename metadata { id action date } ... on ProductChange { productId changedFields } ... on ProductQuantityChange { productId variationId storeId quantity quantityPrevious } ... on ProductPriceChange { productId variationId priceListId price pricePrevious discount discountPrevious } } }
Potvrzení změn
mutation { changesConfirm (id: 15) { result } }
Vrácení změn zpět k datu
mutation { changesReset (date: "2024-04-01 00:00:00") { result } }
Načtení objednávky
query { order(id: 1) { id code dateCreated status { id name } deliveryAddress { name surname street city zip country { code name } } items { name pieces totalPrice { withVat vat currency { code } } } } }
Načtení seznamu objednávek
query { orders(limit: 50, sort: {dateCreated: ASC}, filter: {dateCreated:{ge:"2024-02-01 00:00:00"}}) { hasNextPage hasPreviousPage items { id code dateCreated totalPrice { withVat withoutVat } currency { code name } } } }
Načtení produktu
query { product(id:6185) { id url code ean inStore stores { store { id name } inStore } title price { withVat currency { code } } visible parameters { parameter{ name } values { value } } variations { values { label { name } value } } } }
Načtení seznamu produktů
query { products(limit: 10, sort: {title: ASC}, filter: {dateUpdated: {ge: "2024-02-19 00:00:00"}}) { hasNextPage hasPreviousPage items { id code ean title visible inStore price { withVat currency { code } } } } }
Načtení uživatele
query { user (email:"wpj@wpj.cz") { id name surname isActive dateLastOrder invoiceAddress { name surname firm phone street city zip country { code } ico dic } } }
Načtení seznamu uživatelů
query { users (userSort:{id:ASC}, userFilter: {dateRegistered: {ge:"2024-01-01" le:"2024-02-01"}}) { hasNextPage hasPreviousPage items{ id email name surname newsletterInfo { isSubscribed } } } }
Vytvoření nebo úprava produktu
mutation productCreateOrUpdate($product: ProductModifyInput) { productCreateOrUpdate(product: $product) { result product { id code title description price { withVat } } } } #vytvoření produktu { "product": { "code": "abc1234", "title": "Nový produkt", "description": "Popis nového produktu", "price": { "priceWithVat": 121 } } } #úprava produktu { "product": { "id": 6273, "title": "Aktualizovaný název produktu", "description": "Aktualizovaná anotace produktu" } }
Vytvoření nebo úprava varianty produktu
mutation variationCreateOrUpdate($variation: VariationModifyInput) { variationCreateOrUpdate(variation: $variation) { result product { id } variation { id title values{ label{ name } value } } } } { "variation": { "productId": 6160, "visible": false, "title": "Velikost Apple Watch: 46mm", "labels": [{ "label": "Velikost Apple Watch", "value": "46mm" }] } }
Vytvoření objednávky
mutation orderCreate($order: OrderCreateInput!) { orderCreate(orderCreateInput: $order) { order { id code items{ code } dateCreated } } } { "order":{ "invoiceAddress": { "name": "Abc", "surname": "Cba", "street": "Abc 1403", "city": "test", "zip": "54301", "country": "CZ", "phone": "+420 123 456 789", "email": "test@wpj.cz" }, "items": [ {"productId": 1, "pieces": 1} ], "coupons": ["ABC123"], "deliveryTypeId": 1, "language": "cs", "dateDue": "2025-01-01 01:00:00", "currency": "EUR", "userId": 1 } }
Aktualizace objednávky
mutation orderUpdate($input: OrderUpdateInput!) { orderUpdate(input: $input) { result order { id, code dateCreated dateUpdated status { id name } deliveryInfo { packageId } } } } { "input": { "id": 105184, "status": { "id": 2, "comment": "Přiděleno číslo balíku 'abc123'" }, "packageId": "abc123" } }
Storno objednávky
mutation orderStorno($input: OrderStornoInput!) { orderStorno(input: $input) { result order { id, code cancelled dateCreated dateHandle status{ name } } } } { "input": { "id": 105186, "message": "Storno z API", "sendMail": false } }
Vytvoření nebo úprava uživatele
mutation userCreateOrUpdate($input: UserInput!) { userCreateOrUpdate(input: $input) { result user { id email userName dateRegistered } } } #vytvoření uživatele { "input": { "email": "test@api.cz", "isActive": true, "invoiceAddress": { "name": "Test", "surname": "Api", "street": "Lanovska 123", "city": "Vrchlabi", "zip": "54301", "country": "CZ", "phone": "123456789" } } } #úprava uživatele { "input": { "id": 100393, "ico": "28860608", "dic": "CZ28860608", "invoiceAddress": { "firm": "wpj s.r.o." } } }
Aktualizace ceny produktu v ceníku
mutation productPriceListUpdate($input: ProductPriceListInput!) { productPriceListUpdate(input: $input) { result product { id title price{ withVat } priceLists{ priceList{ id name } price{ withVat } } } } } { "input": { "productId": 6160, "priceListId": 9, "price": { "priceWithVat": 7800 } } }
Aktualizace stavu skladu u produktu
mutation productStoreUpdate($input: ProductStoreInput!) { productStoreUpdate(input: $input) { result product { id variations{ id inStore } title inStore stores{ store{ id } inStore } } } } { "input": { "productId": 6160, "variationId":13380, "storeId": 2, "quantity": 100 } }