System udostępnia interfejs programistyczny do automatyzowania prac oraz integracji z systemami wewnętrznymi Państwa organizacji.
Typ
GraphQL (graphql.org)
Aktualna wersja: 1.1.0
Spis treści
- Punkt komunikacji
- Uwierzytelnianie
- Listowanie
- Tworzenie i modyfikowanie
- Usuwanie
- Struktura stronicowania
- Struktura sortowania
- Struktura filtrowania
- Struktura błędów
- Definicje zapytań, mutacji, pól oraz dyrektyw
Punkt komunikacji
Zapytania HTTPs do API aplikacji muszą być kierowane na adres:https://c.api.talpasmart.com/api/public/
Cała komunikacja odbywa się poprzez protokół HTTPs zapytaniami, w których ciele znajdują się zapytania, definicje lub mutacje GraphQL, a w nagłówkach między innymi token uwierzytelniający.
Uwierzytelnianie
W celu autoryzacji należy w zapytaniu HTTPs wysłać nagłówek z tokenem autoryzacji. Generuje się go w aplikacji i jest przypisany dla każdego konta. Token dziedziczy uprawnienia po użytkowniku.
Przykładowy request:
„`plaintext
POST /graphql HTTP/1.1
Host: ext.api.talpasmart.com
User-Agent: ExampleApp/1.0.0
Content-Type: application/json
Authorization: dbsuifmriugreng9ufh92hf92hf92fn392un9unsiucsbciskjb
Accept: /
Content-Length: 113
Listowanie obiektów
Listowanie obiektów odbywa się za pośrednictwem zapytań w GraphQL, które posiadają stronicowanie, sortowanie i filtrowanie.
Przykładowe zapytanie:
query {
firms(name_Icontains: "Testowa") {
totalCount
results(limit: 5, offset: 0, ordering: "name, -id") {
id
name
}
}
}
Powyższy przykład prosi system o zwrócenie listy pięciu firm mających w nazwie „Testowa” zaczynając od pierwszej, posortowane w pierwszej kolejności po nazwie rosnąco, a następnie po identyfikatorze malejąco. Chcemy z tego obiektu tylko dwa pola: identyfikator oraz nazwa. Dodatkowo prosimy o ilość polem totalCount
.
Tworzenie i modyfikowanie
Modyfikacje obiektów odbywają się przez mutacje. Każda mutacja w systemie zbudowana jest z minimum 3 pól:
- errors – przekazywane są tu błędy wykonania mutacji
- ok – wartość logiczna informująca, czy mutacja przebiegła pomyślnie
- <nazwa wejścia> – zależnie od mutacji, inna nazwa pola o innym typie; tu przekazujemy dane wejściowe do mutacji.
Przykładowa definicja mutacji:
input MerchandiseUpdateGenericType {
id: ID!
defaultAddressPostalcode: String
defaultAddressString: String
defaultLat: Float
defaultLon: Float
displayName: String!
...
}
input MerchandiseCreateGenericType {
defaultAddressPostalcode: String
defaultAddressString: String
defaultLat: Float
defaultLon: Float
displayName: String!
...
}
type MerchandiseSerializerMutation {
errors: [ErrorType]
merchandise: MerchandiseType
ok: Boolean
}
merchandiseCreate(newMerchandise: MerchandiseCreateGenericType!): MerchandiseSerializerMutation
Przykładowa mutacja tworząca obiekt:
# Mutacja
mutation ($data: MerchandiseCreateGenericType!) {
merchandiseCreate(newMerchandise: $data) {
ok
errors {
messages
field
}
merchandise {
id
}
}
}
# Zmienne
{
"data": {
"displayName": "Tak!",
"lastLat": 15.0000,
"lastLon": 52.0000
}
}
Powyższy przykład wstawia nowy obiekt do towarów. Definiujemy, że chcemy dostać jego id po operacji wstawienia oraz informacje, czy wszystko poszło dobrze (ok
) oraz czy są jakieś błędy w polach (errors
).
Przykładowa mutacja aktualizująca obiekt:
# Mutacja
mutation ($data: MerchandiseUpdateGenericType!) {
merchandiseUpdate(newMerchandise: $data) {
ok
errors {
messages
field
}
merchandise {
displayName
}
}
}
# Zmienne
{
"data": {
"id": 12,
"displayName": "Tak 12",
"lastLat": 15.0000,
"lastLon": 52.0000
}
}
Powyższy przykład aktualizuje obiekt o identyfikatorze 12 i prosi o nazwę po modyfikacji. Obsługa błędu wygląda dokładnie tak samo jak w przypadku dodawania nowego.
Usuwanie
Usuwanie obiektów odbywa się przez mutacje. Struktura jest dokładnie taka sama jak w przypadku tworzenia czy aktualizacji.
Przykładowa definicja mutacji usuwającej:
merchandiseDelete(id: ID!): MerchandiseSerializerMutation
Przykładowa mutacja usuwająca obiekt:
mutation {
merchandiseDelete(id: 12) {
ok
errors {
messages
field
}
}
}
Powyższy przykład usuwa obiekt z towarów o id 12 z obsługą błędów.
Struktura stronicowania
Listy obiektów w systemie są zdefiniowane w standaryzowanej formie posiadającej zawsze pola:
- totalCount:
Int
– określa liczbę elementów pasujących do zapytania - results(
limit
:Int
= 20,offset
:Int
,ordering
:String
): [<odpytywany typ>] – lista obiektów - limit:
Int
= 20 – maksymalna liczba elementów na stronie, max. 50 elementów - offset:
Int
– przesunięcie - ordering:
String
– sortowanie opisane poniżej.
Przykładowa definicja:
type AttachmentListType {
results(
limit: Int = 20,
offset: Int,
ordering: String
): [AttachmentType]
totalCount: Int
}
Struktura sortowania
Sortowanie w aplikacji opiera się o ciąg znaków mówiący, jak dane mają zostać posortowane. Nazwy pól do sortowania muszą zostać przekonwertowane z camelCase do snakeCase. Aby zmienić kierunek sortowania, przed nazwą pola dodajemy „-”.
Przykład sortowania:
display_name, -created_at
Powyższy przykład mówi: sortuj po display_name
rosnąco, a następnie po created_at
malejąco.
Struktura filtrowania
Aplikacja umożliwia filtrowanie list wraz z operatorami. Każde zapytanie ma podaną listę filtrów, które składają się z dwóch członów: <nazwa_pola>_<operator>
. Filtr podajemy w zapytaniu o pole jako parametr, np. query { firms(name_Icontains: "Testowa") }
.
Przykładowe operatory:
- Icontains – pole zawiera ciąg znaków bez rozróżnienia wielkości znaków
- Istartswith – pole zaczyna się od ciągu znaków bez rozróżnienia wielkości znaków
- Iendswith – pole kończy się ciągiem znaków bez rozróżnienia wielkości znaków
- Isnull – pole jest puste (wartość
true
lubfalse
) - Lte – wartość pola jest mniejsza lub równa podanej wartości
- Gte – wartość pola jest większa lub równa podanej wartości
- Lt – wartość pola jest mniejsza niż podana wartość
- Gt – wartość pola jest większa niż podana wartość
- BRAK – wartość pola jest równa podanej wartości.
Struktura błędów
Błędy w systemie pojawiają się na dwóch poziomach aplikacji. Mogą zostać zwrócone błędy dla konkretnego pola lub błędy ogólnego przeznaczenia.
Definicja błędu:
type ErrorType {
field: String!
messages: [String!]!
}
Definicje zapytań, mutacji, pól oraz dyrektyw
Wszystkie potrzebne definicje zostały ujęte w wygodnej formie na stronie: https://talpasmart.com/dokumentacja/