# Express API - MariaDB-hez A konténerizált NodeJS Express Api, ami a MariaDB adatbázist kiszolgálja. ## Endpointok ### [GET] `/` Egyszerű health check végpont az API elérhetőségének ellenőrzésére. Nem igényel autentikációt. > **példa:** > #### Request Body: > ```JSON > {} > ``` > #### Response: > ```JSON > { > "status": "ok" > } > ``` --- ### [POST] `/auth` Bejelentkezés: ellenőrzi, hogy a megadott felhasználónév és jelszó helyes-e, és visszaadja, hogy az illető admin-e. > **példa:** > #### Request Body: > ```JSON > { > "authUname": "admin", > "authPw": "secret" > } > ``` > #### Response (sikeres): > ```JSON > { > "ok": true, > "admin": true, > "userId": 1 > } > ``` > #### Response (hibás adatok): > ```JSON > { > "ok": false, > "admin": false > } > ``` --- ### Felhasználók (`/users`) Minden `/users` művelet **admin jogosultságot** igényel. Az admin azonosítása a body-ban küldött `authUname` és `authPw` mezőkkel történik. ### [GET] `/users` Összes felhasználó listázása (admin szükséges). > **példa:** > #### Request Body: > ```JSON > { > "authUname": "admin", > "authPw": "secret" > } > ``` > #### Response: > ```JSON > { > "ok": true, > "users": [ > { "id": 1, "uname": "admin", "admin": true, "note": "asd" }, > { "id": 2, "uname": "user1", "admin": false, "note": null } > ] > } > ``` ### [POST] `/users` Új felhasználó létrehozása (admin szükséges). A jelszó SHA-256-tal hash-elten kerül tárolásra. > **példa:** > #### Request Body: > ```JSON > { > "authUname": "admin", > "authPw": "secret", > > "uname": "ujuser", > "pw": "valami", > "admin": false, > "note": "Megjegyzés" > } > ``` > #### Response: > ```JSON > { > "ok": true, > "id": 3 > } > ``` ### [PATCH] `/users` Felhasználó módosítása (admin szükséges). Az `id` kötelező; a többi mező opcionális. A `pw`-t plaintext-ben kell küldeni, a szerver hash-eli. > **példa:** > #### Request Body: > ```JSON > { > "authUname": "admin", > "authPw": "secret", > > "id": 2, > "uname": "user2", > "pw": "ujjelszo", > "admin": false, > "note": "Frissített felhasználó" > } > ``` > #### Response: > ```JSON > { > "ok": true > } > ``` ### [DELETE] `/users` Felhasználó törlése (admin szükséges) az `id` alapján. > **példa:** > #### Request Body: > ```JSON > { > "authUname": "admin", > "authPw": "secret", > "id": 2 > } > ``` > #### Response: > ```JSON > { > "ok": true, > "deleted": 1 > } > ``` --- ### Kontaktok (`/contacts`) Minden `/contacts` művelet **auth-ot** igényel (bármely létező felhasználó). A body-ban `authUname` és `authPw` szükséges. ### [GET] `/contacts` Összes kontakt listázása (auth szükséges). > **példa:** > #### Request Body: > ```JSON > { > "authUname": "user1", > "authPw": "secret" > } > ``` > #### Response: > ```JSON > { > "ok": true, > "contacts": [ > { "id": 1, "name": "Teszt Elek", "phone": "+36 30 123 4567", "address": "Budapest", "note": "VIP" } > ] > } > ``` ### [POST] `/contacts` Új kontakt létrehozása (auth szükséges). > **példa:** > #### Request Body: > ```JSON > { > "authUname": "user1", > "authPw": "secret", > "name": "Teszt Elek", > "phone": "+36 30 123 4567", > "address": "Budapest", > "note": "VIP" > } > ``` > #### Response: > ```JSON > { > "ok": true, > "id": 5 > } > ``` ### [PATCH] `/contacts` Kontakt módosítása (auth szükséges). Az `id` kötelező; a `name`, `phone`/`phome`, `address`, `note` opcionálisak. > **példa:** > #### Request Body: > ```JSON > { > "authUname": "user1", > "authPw": "secret", > "id": 5, > "name": "Teszt Elek Jr.", > "phone": "+36 70 111 2222", > "note": "Frissítve" > } > ``` > #### Response: > ```JSON > { > "ok": true > } > ``` ### [DELETE] `/contacts` Kontakt törlése (auth szükséges) az `id` alapján. > **példa:** > #### Request Body: > ```JSON > { > "authUname": "user1", > "authPw": "secret", > "id": 5 > } > ``` > #### Response: > ```JSON > { > "ok": true, > "deleted": 1 > } > ``` ## Futtatás: A konténert a `docker-compose.yml` file írja le a `Dockerfile` alapján. Futtatása a következő: ### Indítás ```bash docker compose up -d ``` > *Bizonyos operációs rendszereken `docker-compose up -d`*. > > *Illetve első indításnál `docker compose up -d --build`* Logokkal való indításhoz a `docker compose logs` használható, folyamatos debug logokért a következő indítóparancs használatos Windows-on: ```bash docker compose up -d ; docker compose logs -f ``` > Linux alatt `docker compose up -d && docker compose logs -f` > Vagy `docker-compose up -d && docker-compose logs -f` ### Leállítás A konténer és hozzá tartozó network leállítása a következővel érhető el: ```bash docker compose down ``` > *Bizonyos operációs rendszereken `docker-compose down`* ### Linux - *sudo* probléma Néha Linux alatt - verziótól függően - gyakori probléma az, hogy minden docker és docker compose process *root* alatt fut. Ezért ilyenkör a következő parancsokkat érdemes használni: ```bash # Indítás: sudo docker compose up -d # Logok: sudo docker compose logs -f # Indítás - logokkal: sudo docker compose up -d && sudo docker compose logs -f # Leállítás: sudo docker compose down ``` Illetve a *Docker Compose* verziójától függően ugyan ez vonatkozik: ```bash # Indítás: sudo docker-compose up -d # Logok: sudo docker-compose logs -f # Indítás - logokkal: sudo docker-compose up -d && sudo docker-compose logs -f # Leállítás: sudo docker-compose down ``` ### Windows A Docker Dekstopot telepítve egyből lejön a `docker compose` parancs, amit cmd-ből, vagy PowerShell-ből tudunk használni, ugyan úgy, mint Linux alatt. > #### Fontos! > Fontos, hogy a cmd-t és a PowerShellt is ***adminisztrátorként*** futtassuk! # Network Ahhoz, hogy a telefonkönyv alkalmazás konténerjei lássák egymást, egy közös networkön kell lenniük a fejlesztési időszak alatt. Ehhez a `telefonkonyv-net` network-öt létrehozzuk mindegyik Compose file alján. Így ugyan nem számít a sorrend, ahogy fel "up"-oljuk a konténereket, de néha warning-ot fog dobni, hogy a network már létezik. Tudjuk ellenőrizni, hogy fel connectelt-e minden konténer a ```bash docker network inspect telefonkonyv-net ``` paranccsal. Ezzel a következőket kell lássuk az inspect közepén: ```JSON { ... "Containers": { "...hash...": { "Name": "telefonkonyv-api", "EndpointID": "...hash...", "MacAddress": "fa:25:0e:90:af:90", "IPv4Address": "172.20.0.3/16", "IPv6Address": "" }, "...hash...": { "Name": "telefonkonyv-db", "EndpointID": "...hash..", "MacAddress": "66:4f:c8:20:5c:5a", "IPv4Address": "172.20.0.2/16", "IPv6Address": "" } }, ... } ```