# Rest API

[vissza](../../readme.md)

---

[Blog API](./blog.md)

[Ország / Város API](./country.md)

[Rendelés API](./orders.md)

[Profil API](./profile.md)

[Weboffice API](./weboffice.md)

[Kosár / Fizetés API](./cart.md)

[Tron Payment API](./tron.md)

---

[a régi doksi itt érhető el](https://writer.zoho.com/writer/open/kys4cea0bcb37a7eb444897bd190d2331f794)

[postman-hez is vannak cuccok](./postman/index.md)

---

## Szabványos interface-ek

Az új végpontok válaszait már az új szabványos formátumra kell hozni, a régieket meg szép lassan átírni az alábbiakra:

### Hibaüzenetek

```json
{
  "status": 400,
  "error": 400,
  "messages": {
    "errors": [
      {
        "field": "email", // opcionális
        "expected": <felsorolt értékek tömbben>|<típus string-be írva>, // opcionális
        "message": {
          "key": "hibaüzenet-nyelvi-kulcsa", // tartalmazhat paramétereket: "szöveg {{paramKulcs}}"
          "params": {
            "param1": "akármi", // ez egy változó, amit be lehet helyettesíteni a nyelvi kulcsba
            ...
          }
        }
      },
      ...
    ]
  }
}
```

### Service státusz user adatoknál

```json
{
  ...,
  "hasService": {
    "activeForToday": <bool>, // van-e a mai napot magába foglaló aktivált service?
    "inactiveForToday": <bool>, // van-e a mai napot magába foglaló még nem aktivált service?
    "anyInactive": <bool> // van-e akármilyen service-e, ami még nincs aktiválva?
  }
}
```

---

## Bejelentkezés, token kérése

Az API használatához először is be kell jelentkezni az /ologin-en keresztül és token-t szerezni. Ezt még basic auth-tal kell elvégezni. Ekkor kapunk egy token-t, amivel aztán a többi hívást tudjuk intézni.

Az alábbiakban ha egy funkcióhoz több API végpont van, akkor megjelölöm, hogy melyik igényel token-t (`private api`) és melyik érhető el a weboldalról is, bejelentkezés nélkül (`public api`).

### Authorization

`POST /ologin` - public api

Az API hívásnál kell egy api kulcs és api secret, amit basic auth-al kell átadni, mint username és password. A username és jelszó páros az `oauth_clients` adatbázis táblában találhatóak meg, mint `client_id` és `client_secret` (mind a kettő plain text).

Postman-ben az Authorization panelen az alábbi értékeket kell kitölteni, ami majd legenerálja az Authorization header-t:

> Type: Basic Auth
>
> Username: \<client_id>
>
> Password: \<client_secret>

Ha mi magunk akarjuk előállítani az Authorization headert, akkor a username és password mezőket kettősponttal elválasztva base64 encode-olni kell:

```javascript
const headers = {
  Authorization: `Basic ${btoa(clientID + ':' + clientSecret)}`
}
```

Az Axios library ezt elvégzi helyettünk, ha a config objektum auth részét kitöltjük:

```javascript
await axios.post(
  '/ologin',
  {},
  {
    auth: {
      username: clientID,
      password: clientSecret
    }
  }
)
```

### Belépési adatok

A POST kérés body-jába 3 mezőt kell felvinni és mint form-data elküldeni:

> grant_type: "password"
>
> username: \<felhasználó email címe>
>
> password: \<felhasználó jelszava>

Válaszul a szerver egy ehhez hasonló JSON-t fog küldeni:

```json
{
  "access_token": "901e35e3fbbdc0e741950198e6abfa454ff9d19f",
  "expires_in": 3600,
  "token_type": "Bearer",
  "scope": "app",
  "refresh_token": "2ec59e3e27c1bef3f7409ec6bd985b7211a24036",
  "user_id": 134534
}
```

A további API hívásokat a fent kapott token segítségével kell authorizálni:

Postman-ben az Authorization panel úgy módosul, hogy:

> Type: Bearer Token
>
> Token: \<access_token>

Akár axios-t használunk, akár bármilyen sima ajax megolást, a header-t nekünk kell előállítani és átadni minden kérésnél:

```javascript
const headers = {
  Authorization: `Bearer ${access_token}`
}
```

## Elfelejtett jelszó

`POST /guestapi/forgotpassword` - public api

> Type: No Auth
>
> email: \<felhasználó email címe>

```json
{
  "status": 400,
  "error": "400",
  "messages": {
    "error": "The email field is required."
  }
}
```

## Főoldali user-ek listája/allusers

`GET /api/allusers` - private api

`GET /guestapi/allusers` - public api

opcionális query paraméter:

`limit` - int, ha nincs megadva, akkor 24
`offset` - int, ha nincs megadva, akkor 0

Visszaadja a főoldali user-ek/populausers listáját:

```json
{
  "data": [<User>, <User>, ...],
  "totalCount": <int>,
  "limit": <int>,
  "offset": <int> // ez az oldalt számlálja, nem az SQL értelembe vett offset-et
}
```

## User beállítások

`GET /guestapi/settings` - public api

`GET /api/settings` - private api

Válaszként visszajön az aktuális config

```json
{
  "language": "hu",
  "timezone": "UTC"
}
```

`PATCH /guestapi/settings` - public api

`PATCH /api/settings` - private api

JSON-t kell küldeni, mint nyers adat

_még csak a language van bekötve_

```json
{
  "language": "hu" //ezek lehetnek: 'en', 'ru', 'hu', 'es', 'pt', 'kr', 'cn'
}
```

## Lábléc linkek

`GET /guestapi/cms/footer/links` - public api

`GET /api/cms/footer/links` - private api

JSON válasz jön

```json
[ // oszlopok
    {
        "title": "app.footer_other",
        "links": [ // sorok
            {
                "href": "http://photogram/about",
                "label": "app.head_about",
                "type": "internal"
            },
            {
                "href": "http://photogram/assets/docs/en/user_license_agreement.pdf",
                "label": "app.footer_ule",
                "type": "external"
            },
            ...
        ]
    },
    ...
]
```

## Promóciók/Kampányok adatai

`GET /api/campaign/<kampányazonosító>` - private api

Aktuális kampányazonosító: 2021-iPhone13

JSON válasz jön

```json
{
  "campaignName": "2021-iPhone13",
  "toplist": [
    {
      "userid": 1234,
      "username": "Béla",
      "avatarimage": "<teljes útvonal az avatarimage-hez>",
      "newReferrals": 12 // hány embert hozott be
    },
    ...
  ]
}
```

A helyezést az adja, hogy az adott user hanyadik a toplist tömbön belül.

## User blokkolás

### Blokkolt user-ek li

`GET /api/users/blocked` - private api

Visszaadja a letiltott user-ek listáját, name szerint rendezve

```json
[
  {
    "id": <int>,
    "link": <string>, // link a user blog-jához
    "avatarimage": <string>,
    "name": <string>, // blognév
    "photos": <int>, // hány fotója van a user-nek
    "likes": <int>, // hány lájkot kapott bármelyik fotójára a user
  },
  ...
]
```

`POST /api/user/<userId>/block` - private api

`POST /api/user/<userId>/unblock` - private api

Letiltja, illetve a tiltást feloldja a userId-ként megadott user-nél

Ha nem található az url-ben megadott userId, akkor 404-et dob az oldal,
különben 200-at üres json objektummal
