# Weboffice API

[vissza az API indexhez](./index.md)

## Összetett típusok, amiket ezek a végpontok használnak

> \<utc time>

```json
"2021-03-01T00:00:00.000000Z"
```

> \<photodata>

```json
{
  "photoid": 9243165,
  "userid": 8046305,
  "filehash": "c0f7bcb9e2b895ca2b6263a9854c65ed32cb6664f452cc9c0c427324e0d43571",
  "hash": "5009da3b9cfc460ca5a7b32b163e6d54a2426129fac3df2545f8852794f3ba13",
  "filename": "5f34ebe2bd083_8046305.jpg",
  "originext": "jpg",
  "name": "Csávó",
  "description": "csavo",
  "tags": ["csavo", "csávó", "box"],
  "catid": 12,
  "status": 2,
  "serviceid": 0,
  "sector": 0,
  "bantext": "",
  "created_at": <utc time>,
  "user": {
    "userid": 8046305,
    "username": "Bendzsi",
    "avatarimage": "5f34e6289ea16_halcyon-1352522_1920.jpg"
  },
  "disabledByUser": false,
  "categoryText": "Celebration",
  "statusText": "approved"
}
```

## Aktiváció

`POST /api/weboffice/activate` - private api
`POST /api/weboffice/activate/<serviceid>` - private api

Ha a serviceid-val megadott service nem létezik, akkor **404**-et (NOT FOUND) dob a végpont.

Ha nincs megadva a serviceid és nincs aktiválandó service, akkor a szerver létrehoz egy "dummy" service-t, különben 404-el tér ez is vissza. A dummy service id-ja visszajön a status-ban, további műveleteket ezzel kell végezni.

Ha viszont létezik, de az nem a bejelentkezett user tulajdona, akkor **401**-el (UNAUTHORIZED) tér vissza a szerver.

Adatot nem kell küldeni a szervernek, elég az url-ben átadott serviceid.

A végpont sikeres válaszok esetén minden esetben elküldi az adott service-hez tartozó státuszt:

```json
{
  "status": {
    "serviceId": <int>,
    "isActive": <bool>,                     // aktív-e a megadott service
    "haveBoughtService": <bool>,            // meg lett-e vásárolva a service? ez többnyire true, kivéve dummy service-eknél
    "haveUploadedEnoughPhotos": <bool>,     // fel van töltve legalább 15 fotója a usernek?
    "haveBoughtEnoughPhotos": <bool>,       // meg lett véve a 10 kép?
    "numberOfRemainingUnusedPhotos": <int>, // mennyi feltölött/fel nem használt fotónk van? ha még nem aktív a service, addig ebből lesz levonva a 15
    "isDummyService": <bool>,               // dummy service-e az adott service
    "isNormalService": <bool>,              // már megvásárolt service-e az adott service
    "isServiceInCart": <bool>,              // a megadott service a kosárban van?
    "arePhotosInCart": <bool>               // a service-hez tartozó 10 megvásárolandó kép a kosárban van?
  }
}
```

### 1. lépés - képek feltöltése

Ha nincs elég kép feltöltve (`status.haveUploadedEnoughPhotos === false`), akkor kiegészítjük a választ a feltöltött képek állapotáról:

```json
{
  "unusedPhotos": {
    "required": 2,
    "uploaded": [
      <photodata>
    ]
  }
}
```

### 2. lépés - képek vásárlása

Ha nincs elég vásárolt kép (`status.haveBoughtEnoughPhotos === false`), akkor kiegészítjük a választ a vásárolandó képekkel:

```json
{
  "buyablePhotos": {
    "orders": ["...", "...", "..."],
    "threeUsers": [
      {
        ...<photodata>,
        "ru_id": <int>,
        "position": <int>
      },
      ...
    ],
    "sevenUsers": [
      {
        ...<photodata>,
        "ru_id": <int>,
        "position": <int>
      },
      ...
    ]
  }
}
```

### 3. lépés - aktiváció áttekintése

Ha a kapott képeket a user a kosarába teszi és kifizeti, akkor a fizetés után megtörténik az aktiváció és a `status.isActive = true` lesz, illetve a megvásárolt képeket visszaadjuk a status mellett:

```json
{
  "purchasedPhotos": [
    <photodata>,
    ...
  ]
}
```

## Service-ek lekérdezése

`GET /api/getservices` - private api

Visszaadja a user aktuális és jövőre szóló service-eit:

```json
[
  {
    "serviceid": 138,
    "userid": 6564336,
    "year": 2021,
    "month": 3,
    "day": 1,
    "active": 1,
    "created_at": "2021-03-10 13:30:32",
    "validFrom": <utc time>,
    "validTo": <utc time>,
    "isActive": true
  },
  ...
]
```

## Service vásárlás

`GET /api/webofficebuyservice` - private api

Ezzel lehet lekérdezni az árlistát, meg az aktuális service-eket, ami alapján meg lehet jeleníteni a buy service oldalt

```json
{
  "selectlist": [
    {
      "numberOfMonths": <int>,
      "numberOfDays": <int>, // 30 * numberOfMonths
      "price": <int>, // 5 * numberOfMonths
      "currency": "USD",
      "months": [
        {
          "id": 1,
          "validFrom": <utc time>,
          "validTo": <utc time>,
          "unix": <utc time> // ugyanaz, mint a "validFrom"
        },
        ... // annyi bejegyzés, ahány numberOfMonths
      ]
    },
    ... // 1, 3, 6 és 12 hónapnyi service-t listázunk
  ],
  "currentservices": [ // aktuális és jövőbeli service-ek
    {
      "serviceid": <int>,
      "isActive": <bool>,
      "validFrom": <utc time>,
      "validTo": <utc time>,
      "created_at": <utc time>, // ugyanaz, mint a "validFrom"
      "servicedate": <utc time> // ugyanaz, mint a "validTo"
    }
  ]
}
```

## Fel nem használt képek lekérdezése

`GET /api/unusedphotos` - private api

```json
{
  "total": <int>,
  "photos": [
    <photodata>,
    ...
  ]
}
```

---

## Sector-ok lekérdezése

```json
[
  {
    "sectorid": 53,
    "userid": 6564336,
    "sector": 1
  },
  {
    "sectorid": 245,
    "userid": 6564336,
    "sector": 2
  }
]
```

A photos a `intval(getenv('MINIMUM_UPLOAD_AMOUNT_FOR_ACTIVATION'))` értéke szerinti mennyiségre van korlátozva

## Szektorok lekérdezése level infókkal együtt

`GET /api/webofficesectors` - private api

```json
{
  "sectors": [
    {
      "sectorid": 53,
      "userid": 6564336,
      "sector": 1
    },
    {
      "sectorid": 245,
      "userid": 6564336,
      "sector": 2
    }
  ],
  "levels": [ // szektoronként hány user van alattunk
    [
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0
    ],
    [
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0
    ]
  ],
  "unusedPhotos": {
    "required": 2,
    "uploaded": [
      <photodata>
    ]
  }
}
```

## Alattam levő user-ek flat listája talán?

Nem tudom, hol van használva ez a fajta lista, de van rá végpont

`POST /api/webofficeyourusers` - private api

Form data body-ba:

> activeonly: "true"|"false"

```json
{
  "user": {
    "userid": 8261806,
    "username": "Dezsőfi",
    "avatarimage": "5ff2d1600f41f_5fe0643ae0d29_dog-5735837_1920.jpg",
    "lastsector": 1
  },
  "data": [],
  "active": 1,
  "level": 1
}
```

## Szektor vásárlás

`POST /api/webofficebuysector` - private api

A service aktivációhoz hasonlóan ez is több lépésből áll és itt se kell semmit küldeni a szervernek. Amennyiben van korában elkezdett sector vásárlási folyamat, akkor azt folytathatjuk ezzel a hívással.

A végpont minden esetben visszaküldi az adott szektorvásárlás állapotát jelképező státuszt:

```json
{
  "status": {
    "sector": <int>, // a megvásárolandó szektor száma
    "haveBoughtSector": false,
    "haveUploadedEnoughPhotos": false,
    "haveBoughtEnoughPhotos": false,
    "numberOfRemainingUnusedPhotos": <int>
  }
}
```

### 1. lépés - képek feltöltése

Ha nincs elég kép feltöltve (`status.haveUploadedEnoughPhotos === false`), akkor kiegészítjük a választ a feltöltött képek állapotáról:

```json
{
  "unusedPhotos": {
    "required": 2,
    "uploaded": [
      <photodata>
    ]
  }
}
```

### 2. lépés - képek vásárlása

Ha nincs elég vásárolt kép (`status.haveBoughtEnoughPhotos === false`), akkor kiegészítjük a választ a vásárolandó képekkel:

```json
{
  "purchasedPhotos": {
    "orders": ["...", "...", "..."],
    "threeUsers": [
      {
        ...<photodata>,
        "ru_id": <int>,
        "position": <int>
      },
      ...
    ],
    "sevenUsers": [
      {
        ...<photodata>,
        "ru_id": <int>,
        "position": <int>
      },
      ...
    ]
  }
}
```

Ezekből a photoid-kat ki kell szedegetni és azokat kell a `photossectorcart` mezőn keresztül a kosárba rakni (lásd [kosár api > Kosárba rakás](./cart.md))

### 3. lépés - szektor vásárlása

A szektort is be kell rakni a kosárba és meg kell venni, ehhez a kosárba rakást meg kell hívni a `sectorcart` mezővel, ami egy tömbbe várja a megvásárolandó szektorok számát. Semmilyen más információt nem kell.

A kosár tartalmának kifizetése után megtörténik a szektor aktivációja. Ennek az URL-nek az újboli meghívása a service aktivációval ellentétben nem ad lehetőséget a korábbi szektorral kapcsolatos vásárlások áttekintésére, helyette rögtön a következő szektor vásárlást készíti elő

## Megvásárlásra felkínált fotó / user cseréje aktivációnál és szektor vásárlásnál

`POST /api/changerandomuser` - private api

> **DEPRECATED**
>
> Ehelyett használd az alábbi végpontok bármelyikét:
>
> `PATCH /api/service/random-photo/`
>
> `PATCH /api/service/random-user/`
>
> `PATCH /api/sector/random-photo/`
>
> `PATCH /api/sector/random-user/`

Szektor vásárlásnál és Service aktivációnál 3 véletlenszerű user-t kínál fel nekünk a rendszer ("threeuser"), illetve a
felettünk levő userek listájából 7-et (kihagyva azokat, akiknek nincs aktív service-e) ("sevenuser"). Ha egy user se aktív,
akkor is van 10 db cég által üzemeltetett user, így garantáltan kapunk usereket akiktől lehet képet
vásárolni.

Minden user-nél van lehetőség a felkínált képet lecserélni, illetve a 3 véletlenszerű user-nél magukat
a user-eket is lehet módosítani, erre szolgál ez a végpont.

Az alábbi 6 form data opció érhető el:

### 1) Szektor vásárlás - "threeuser" user csere

```
{
  new_userid: <int>
  position: <int>
  sector: <int>
  type: 0
}
```

### 2) Szektor vásárlás - "threeuser" kép csere

```
{
  new_photoid: <int>
  position: <int>
  sector: <int>
  type: 0
}
```

### 3) Szektor vásárlás - "sevenuser" kép csere

```
{
  new_photoid: <int>
  position: <int>
  sector: <int>
  type: 1
}
```

### 4) Service aktiválás - "threeuser" user csere

```
{
  new_userid: <int>
  position: <int>
  serviceid: <int>
  type: 0
}
```

### 5) Service aktiválás - "threeuser" kép csere

```
{
  new_photoid: <int>
  position: <int>
  serviceid: <int>
  type: 0
}
```

### 6) Service aktiválás - "sevenuser" kép csere

```
{
  new_photoid: <int>
  position: <int>
  serviceid: <int>
  type: 1
}
```

## Megvásárolható fotók lekérdezése

`GET /api/user/<userid>/purchasable-photos`

paraméterek GET-ben:

- limit - int, alapérték: 10, hány találat látszódjon egy oldalon
- offset - int, alapérték: 0, hanyadik elemtől számolja a találatokat (ha 1 oldalon 10 elem van, akkor 10-esével kell növelni az offset-et, mint az SQL lekérésekben)
- search - string

`/api/user/7435514/purchasable-photos`

```json
{
  "data": [
    <Photo>,
    ...
  ],
  "totalCount": 82,
  "limit": 10,
  "offset": 0
}
```

Ha nincs a megadott user, akkor 404-et ad vissza

## Changeuser-nél mutatott user-ek lekérdezése

`GET /api/sector/users-for-changing`

`GET /api/service/<serviceId>/users-for-changing`

paraméterek GET-ben:

- limit - int, alapérték: 10, hány találat látszódjon egy oldalon
- offset - int, alapérték: 0, hanyadik elemtől számolja a találatokat (ha 1 oldalon 10 elem van, akkor 10-esével kell növelni az offset-et, mint az SQL lekérésekben)
- search - string - **jelenleg nem működik**
- showInactiveUsers - <"true"|"false">, alapból "true" - mutassa-e a listában az amúgy nem kiválasztható inaktív user-eket is, vagy csak azokat, akiket ki lehet választani

Mindkettőnél a válasz azonos felépítésű:

```json
{
  "data": [
    <User>
  ],
  "totalCount": 82,
  "limit": 10,
  "offset": 0,
  "showInactiveUsers": true
}
```

Minden user tartalmazza az alábbi 2 mezőt:

```
"hasPhotos": <bool>,
"hasService": <bool>
```

Ha ezek bármelyike false, akkor a user inaktívnak minősül és nem lesz mutatva, ha a showInactiveUsers paraméter false

## random user/photo változtatások

`PATCH /api/sector/random-photo/`

A body-ba egy JSON-t vár a szerver:

```json
{
  "sector": int, // a szektor azonosítója
  "position": int, // threeuser-nél 0..2, sevenuser-nél 0..6
  "newPhotoId": int, // az új fotó ID-ja, erre lesz lecserélve
  "type": string // "threeuser" vagy "sevenuser"
}
```

Válasz JSON-ban:

```json
{
  "photo": <photodata>
}
```

`PATCH /api/sector/random-user/`

A body-ba egy JSON-t vár a szerver:

```json
{
  "sector": int, // a szektor azonosítója
  "position": int, // 0..2
  "newUserId": int, // az új user ID-ja, erre lesz lecserélve
}
```

Válasz JSON-ban:

```json
{
  "photo": <photodata>,
  "user": <userdata>
}
```

`PATCH /api/service/random-photo/`

A body-ba egy JSON-t vár a szerver:

```json
{
  "serviceId": int, // a service azonosítója
  "position": int, // threeuser-nél 0..2, sevenuser-nél 0..6
  "newPhotoId": int, // az új fotó ID-ja, erre lesz lecserélve
  "type": string // "threeuser" vagy "sevenuser"
}
```

Válasz JSON-ban:

```json
{
  "photo": <photodata>
}
```

`PATCH /api/service/random-user/`

A body-ba egy JSON-t vár a szerver:

```json
{
  "serviceId": int, // a service azonosítója
  "position": int, // 0..2
  "newUserId": int, // az új user ID-ja, erre lesz lecserélve
}
```

Válasz JSON-ban:

```json
{
  "photo": <photodata>,
  "user": <userdata>
}
```
