import Alert from '@/components/docs/Alert.astro';
import Cards from '@/components/docs/Cards.astro';
import Card from '@/components/docs/Card.astro';

U ovom odeljku opisan je veb API (Web API) platforme, realizovan kao paket podataka REST API za razmenu u formatu `json`.

## Opšte napomene

- **Format prenosa podataka**
  Veb API je realizovan kao paket podataka REST API za razmenu u formatu json.
- **Postupak autentifikacije**
  Autentifikacija se zasniva na dinamički ažuriranom tokenu, što garantuje bezbednost primljenih podataka i sprečava curenje tokena.
- **Format promenljivih sa datumom i vremenom**
  Veb API vraća podatke tipa datum i vreme kodirane kao UNIX vreme ili POSIX vreme, u formatu `UTC: 1613376963`. Pri pretvaranju Unix vremena u čitljiv datum morate da navedete vremensku zonu.
- **Straničenje**
  Veb API podržava straničenje radi preuzimanja podataka stranicu po stranicu. Broj stranice prosleđuje se parametrom: `page="page number" (page=1)`. Broj zapisa koje upit vraća može se zadati parametrom per_page, ali ne više od 1.000 zapisa.

## Osnovni URL

Svi primeri na ovim stranicama koriste sledeći osnovni URL:

```bash
https://api.vadsro.eu/api/v1
```

<Alert type="info">
  Pri implementaciji na infrastrukturi korisnika (on-premise) zamenite host adresom sopstvene
  instalacije. Putanja `/api/v1` i sve krajnje tačke (endpoints) u okviru nje ostaju iste.
</Alert>

## Autentifikacija

Autentifikacija se zasniva na dinamički ažuriranom tokenu. U praksi to izgleda ovako:

- Početna autentifikacija obavlja se pomoću imejl adrese i lozinke koje postoje u sistemu, a kao odgovor stižu dinamički token i povezani atributi.
- Formira se ciljni zahtev za preuzimanje podataka, a u zaglavlja HTTP zahteva dodaje se token dobijen u prethodnom koraku.
- Zahtev se šalje serveru. Ako je zahtev ispravno formiran, server vraća podatke u telu odgovora i novi token u zaglavljima odgovora, a stari token postaje nevažeći. Sa novim tokenom možete da ponovite prethodni korak i tako dalje.
- Po završetku rada poslednji token može se poništiti odjavom (SignOut) pre isteka roka važenja.

<Alert type="info">
  Ukratko, to znači da svaki sledeći zahtev ka interfejsu veb API mora da sadrži 4 zaglavlja iz
  prethodnog odgovora.
</Alert>

Za početnu autentifikaciju koriste se imejl adresa i lozinka postojećeg korisnika. U tu svrhu pošaljite POST zahtev na adresu:

```bash
https://api.vadsro.eu/api/v1/auth/sign_in
```

Primer zahteva u formatu Curl:

```bash
curl -i --header "Content-Type: application/json" \
     --request POST \
     --data '{"email":"api-user@example.com","password":"Str0ngPas$"}'\
     https://api.vadsro.eu/api/v1/auth/sign_in
```

Kao odgovor stiže sledeća poruka:

```bash
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Content-Type: application/json; charset=utf-8
access-token: EXAMPLE-ACCESS-TOKEN-1
token-type: Bearer
client: EXAMPLE-CLIENT-ID
expiry: 1615227012
uid: api-user@example.com
ETag: W/"5b9bcc76f7223b72b79d9f2d31ff0fd5"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: c18e06b4-e5bd-40b5-875d-7ac958e2fbb5
X-Runtime: 0.391069
Transfer-Encoding: chunked
{"data":{"id":6,"email":"api-user@example.com","provider":"email","uid":"api-user@example.com","name":"API user"}}
```

U ovom odgovoru zanimaju nas sledeća zaglavlja:

| Zaglavlje      | Opis                                                                                                                                                     |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `access_token` | Vrednost ovog zaglavlja koristi se kao lozinka za svaki zahtev. Vrednost se menja sa svakim zahtevom.                                                    |
| `client`       | Ovo zaglavlje je jedinstveno za trenutnu vezu. Omogućava više aktivnih sesija istovremeno.                                                               |
| `expiry`       | Vreme kada ovaj token ističe. Podrazumevana vrednost je 2 nedelje od prijema tokena. Ili ranije, posle odjave (SignOut). Nije potrebno za sledeći zahtev.  |
| `uid`          | Jedinstvena vrednost koja identifikuje korisnika. U našem slučaju to je imejl adresa.                                                                    |
| `token-type`   | Tip tokena koji se koristi.                                                                                                                              |

Primer zahteva sa tokenom iz prethodnog odgovora:

```bash
curl -i --header "access-token: EXAMPLE-ACCESS-TOKEN-1" \
 --header "token-type: Bearer" \
 --header "client: EXAMPLE-CLIENT-ID" \
 --header "uid: api-user@example.com" \
 --request GET \
 --header "Content-Type: application/json" \
 --data '{"page":"2"}' \
 https://api.vadsro.eu/api/v1/stations
```

Kao odgovor stiže sledeća poruka:

```bash
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Content-Type: application/json; charset=utf-8
access-token: EXAMPLE-ACCESS-TOKEN-2
token-type: Bearer
client: EXAMPLE-CLIENT-ID
expiry: 1615311367
uid: api-user@example.com
ETag: W/"ba0df406b647bd92f0bf3a18916714c1"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 35a26441-ae78-48fa-8b2e-e92d2605133b
X-Runtime: 0.167748
Transfer-Encoding: chunked
{"data": [
{"id":1,"name":"860000000000001","equipment_brand_name":"Corrector BK","phone":"","equipment_id":1},...
 ],
"total_pages":7,
"current_page":2
}
```

Da biste završili rad, možete da se odjavite (SignOut) ili da sačuvate potrebna zaglavlja iz poslednjeg zahteva i, ako rok važenja tokena nije istekao, da ih upotrebite sledeći put.

<Alert type="warning">
  Imajte u vidu da će poslednji token, ako ne završite sesiju, važiti dve nedelje.
</Alert>

Završetak sesije:

```bash
curl -i --header "access-token: EXAMPLE-ACCESS-TOKEN-2" \
 --header "token-type: Bearer" \
 --header "client: EXAMPLE-CLIENT-ID" \
 --header "uid: api-user@example.com" \
 --request DELETE \
 https://api.vadsro.eu/api/v1/auth/sign_out
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Content-Type: application/json; charset=utf-8
ETag: W/"c955e57777ec0d73639dca6748560d00"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: b4b69ac3-5cba-4e6e-b6a0-f6577298c166
X-Runtime: 0.141467
Transfer-Encoding: chunked
{"success":true}
```

## Sledeći koraci

Sada kada znate kako se obavlja autentifikacija, upoznajte se sa osnovnim resursima interfejsa API:

<Cards cols={2}>
  <Card
    icon="network"
    title="Snabdevači i potrošači"
    description="Preuzmite hijerarhiju snabdevača i listu potrošača koje opslužuju."
    link="/sr/api/v1/resource-providers-and-consumers"
  />
  <Card
    icon="gauge"
    title="Merna mesta"
    description="Preuzmite listu mernih mesta i njihove fizičke karakteristike."
    link="/sr/api/v1/metering-units"
  />
  <Card
    icon="archive"
    title="Arhive očitavanja"
    description="Preuzmite očitavanja kanala po tipu arhive i vremenskom intervalu."
    link="/sr/api/v1/readings-archives"
  />
  <Card
    icon="bell"
    title="Događaji i poruke"
    description="Pregledajte arhive događaja uređaja i šifarnik kodova poruka."
    link="/sr/api/v1/events-and-messages"
  />
</Cards>