Používané technologie:
- TypeScript
- TypeORM
- GraphQL
- Swagger
- RabbitMQ
Prerequisite
Instalace
git clone git@github.com:chomenko/NestJs.git
- uvnitř stažené složky spustit command docker-compose up
- po instalaci projektu je nutné se connectnout do docker containeru přes “
docker-compose exec server bash
” a vytvořit nového uživatele “npm run command user:create:admin admin admin
”
Moduly
- Aplikace je uzpůsobena k psaní modulů, kde se dá jednoduše říci, jestli chceme modul zpřístupnit v jiném modulu, nebo ho uzavřít.
- Jeden kořenový modul
- Dynamický modul - Tato funkce umožňuje snadno vytvářet přizpůsobitelné moduly, které se mohou dynamicky registrovat a konfigurovat.
- Globální modul - distribuován po celé části aplikace přes dekorátor @Global()
TypeORM
- Vychází z Hibernate, Doctrine a Entity Framework
- Multiplatform (MySQL / MariaDB / Postgres / CockroachDB / SQLite / Microsoft SQL Server / Oracle / SAP Hana, MongoDB NoSQL database)
Vytvoření entity
- Definice tabulky přes dekorátor @Entity
- Definice fieldů přes dekorátor @Column
- Dokumentace https://typeorm.io/
Vytvoření repozitáře
- V repozitáři je nutno říct s jakou entitou má pracovat dekorátor @EntityRepository a generika do base Repository < UserEntity >, aby nám vše hezky napovídalo
- Repozitář si mohu jednoduše naincludit přes constructor v servisách/controllerech
Z repozitáře si mohu volat základní metody, které obsahuje base Repository, jako je například (findOne, find, save, atd…) vice na https://typeorm.io/repository-api
Controller & Swagger
- Zpracovávání requestů od klienta
- Automatické generování API doc
- Třídu je nutno označit dekorátorem @Controller(), kde si definujeme základní path pro endpoint
- Funkce uvnitř controlleru označujeme dále přes dekorátory (Get, Post, Put, Delete….)
- Převodník parametrů requestu řešíme přes dekorátor Param, v našem případě productId
- Pokud si Controller označíme dekorátorem ApiTags, vygeneruje se nám automaticky Swagger doc na endpointu http://localhost:3000/api/
DTO
- Třída, která validuje vstupy a výstupy requestu
- Používáme Class Validator a Class Transformer
Jednotlivé parametry obohatíme o dekorátory podle potřeby. Např:
- IsString validuje proměnnou jako string
- IsNumber validuje proměnnou jako číslo
- IsNotEmpty musí být vyplněno, resp. nemůže být null
Více deklarací nalezneme zde: https://github.com/typestack/class-validator
Použití vytvořeného DTO uvnitř controlleru
Zde se akorát řekne, co má obsahovat Body HTTP requestu
Následně se nám vše vygeneruje do Swagger doc
GraphQL
- Dotazovací jazyk pro API
- Dotazy s možností úpravy obsahu/skládání dotazů
- Vytváří testovací rozhraní
- Rozdělení requestů na 2 typy - query (slouží pro výpisy, filtry atd..), mutation (vytváření, editace, mazání)
Po vytvoření resolveru se nám zpřístupní na endpointu http://localhost:3000/graphql API dokumentace GraphQL, kde si můžeme jednoduše odzkoušet metody.
Stejným principem jako u controlleru se dají do resolveru psát DTO
Kde si zase definujeme jednotlivé fieldy přes dekorátor @Field
Více na https://docs.nestjs.com/graphql/mapped-types
Následně použití uvnitř resolveru, obdobně jako v controlleru
V GraphQL Doc můžeme pak vyzkoušet
Metoda usersWhoAmI vyžaduje přihlášeného uživatele, proto je nutné do hlavičky requestu vložit username a password uživatele, kterého jsme vytvořili při instalaci projektu.
Skvělá věc na GraphQL je hlavně to, že si můžeme upravovat response dle potřeby. V tomto případě potřebuji z modelu UserTypeModel pouze id a name. Tak si upravím request tak, aby se mi vracela jen určitá část modelu.
RabbitMQ
- Jednoduchá implementace
- Snadné používání
Registrace do modulu + config
Client
Subscriber