This shows you the differences between two versions of the page.
|
moby:backend:05 [2020/05/31 20:00] alexandru.hogea created |
moby:backend:05 [2020/07/31 15:56] (current) alexandru.hogea [Exercitii] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Sesiuna 5 - Implementarea serviciului CRUD ===== | + | ===== Sesiuna 5 - Implementarea serviciului de Notificari si cuplarea integrala a microserviciilor ===== |
| - | Vom implementa ultimul serviciu, care va avea rol sa scrie si sa citeasca din baza de date | + | In primul rand, felicitari tuturor celor care ati ajuns pana aici! |
| + | |||
| + | Astazi este ultima sesiune de scris cod si, pentru a celebra acest lucru, veti avea parte de o sesiune complet practica, in care va trebui sa dezvoltati **de la zero** serviciul de Notificari. | ||
| + | |||
| + | Ce veti invata? | ||
| + | * sa scrieti de la 0 un REST Api in NodeJS | ||
| + | * sa va cuplati cu alte servicii prin cereri HTTP | ||
| + | * sa testati complet o suita de microservicii | ||
| + | |||
| + | ==== Resurse ==== | ||
| + | |||
| + | Resursele sunt, ca intotdeauna, gasite pe [[https://gitlab.com/mobyworkshop|repository-ul grupului]]. | ||
| + | |||
| + | Aveti implementate complet: | ||
| + | * microserviciul de **library** | ||
| + | * microserviciul de **auth** | ||
| + | * microserviciul de **mailing** | ||
| + | |||
| + | Pentru a porni cele 3 microservicii, efectuati urmatoarele comenzi: | ||
| + | |||
| + | - in folderul **database-deploy** din **library** si **auth** | ||
| + | <code bash> | ||
| + | docker-compose up | ||
| + | </code> | ||
| + | |||
| + | - in toate cele 3 servicii: | ||
| + | <code bash> | ||
| + | npm run start-dev | ||
| + | </code> | ||
| + | |||
| + | <note warning>Serviciul de mailing **NU ARE** .env pus in git, ci are un .env.example. Va trebui sa va creati voi fisierul **.env** si sa va puneti credentialele de la serviciul de email pe care il veti folosi.</note> | ||
| + | |||
| + | <note warning>Dupa ce terminati de scris mailing, **PUNETI .env IN .gitignore** pentru ca acesta va contine date sensibile</note> | ||
| + | ==== Exercitii ==== | ||
| + | |||
| + | Trebuie sa implementati serviciul de notificari complet. Trebuie sa tineti cont de urmatoarele: | ||
| + | |||
| + | * veti avea o singura ruta **/api/newsletter** | ||
| + | * pe aceasta ruta veti avea urmatoarele sub-rute: | ||
| + | <code javascript> | ||
| + | |||
| + | -> GET /subscribe //autorizare pentru ADMIN si READER, adauga un subscriber in sistem | ||
| + | |||
| + | -> DELETE /unsubscribe //autorizare pe ADMIN si READER, scoate un subscriber din sistem | ||
| + | |||
| + | -> DELETE /unsubscribe/user/:userId //ruta interna ce va fi folosita pentru sincronizare atunci cand se sterge un user | ||
| + | |||
| + | -> POST /notify | ||
| + | /* ruta interna ce va fi folosita de microserviciul library, atunci cand se adauga o carte | ||
| + | * primeste un obiect JSON de forma | ||
| + | * { | ||
| + | * bookName, | ||
| + | * author | ||
| + | * } | ||
| + | */ | ||
| + | </code> | ||
| + | |||
| + | * atunci cand este apelat **notify**, se va trimite un POST catre serviciul de mail. Interactiunea cu serviciul de mail se face pe ruta | ||
| + | <code javascript> | ||
| + | -> POST http://${process.env.MAILING_SERVICE}/api/newsletter | ||
| + | </code> | ||
| + | * interactiunea cu serviciul de mail se va face prin trimiterea urmatorului obiect: | ||
| + | <code javascript> | ||
| + | class MailingPayload { | ||
| + | constructor(bookName, author, emails) { | ||
| + | this.mailingList = emails.map(e => e.to_email); | ||
| + | this.book = { | ||
| + | name: bookName, | ||
| + | author: author | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | * veti avea urmatorul fisier **.env** | ||
| + | <code javascript> | ||
| + | PGHOST=localhost | ||
| + | PGUSER=test | ||
| + | PGPASSWORD=test | ||
| + | PGPORT=5557 | ||
| + | PGDATABASE=workshop-newsletter | ||
| + | |||
| + | PORT=3002 | ||
| + | NODE_ENV=development | ||
| + | |||
| + | AUTH_SERVICE='localhost:3001' | ||
| + | MAILING_SERVICE='localhost:3003' | ||
| + | |||
| + | ADMIN_ROLE='administrator' | ||
| + | READER_ROLE='reader' | ||
| + | </code> | ||
| + | * folderul **database-deploy** va contine urmatoarele: | ||
| + | |||
| + | <code javascript> | ||
| + | // .env | ||
| + | PGUSER=test | ||
| + | PGPASSWORD=test | ||
| + | PGPORT=5557 | ||
| + | PGDATABASE=workshop-newsletter | ||
| + | |||
| + | // docker-compose.yml | ||
| + | version: "3.8" | ||
| + | |||
| + | services: | ||
| + | newsletter-db: | ||
| + | image: postgres | ||
| + | environment: | ||
| + | POSTGRES_USER: ${PGUSER} | ||
| + | POSTGRES_PASSWORD: ${PGPASSWORD} | ||
| + | POSTGRES_DB: ${PGDATABASE} | ||
| + | TZ: Europe/Bucharest | ||
| + | PGTZ: Europe/Bucharest | ||
| + | ports: | ||
| + | - ${PGPORT}:5432 | ||
| + | volumes: | ||
| + | - workshop-newsletter:/var/lib/postgresql/data | ||
| + | - ./init.sql:/docker-entrypoint-initdb.d/init.sql | ||
| + | |||
| + | newsletter-pgadmin: | ||
| + | image: dpage/pgadmin4 | ||
| + | ports: | ||
| + | - "30004:80" | ||
| + | environment: | ||
| + | PGADMIN_DEFAULT_EMAIL: test | ||
| + | PGADMIN_DEFAULT_PASSWORD: test | ||
| + | logging: | ||
| + | driver: none | ||
| + | |||
| + | volumes: | ||
| + | workshop-newsletter: | ||
| + | |||
| + | //init.sql | ||
| + | CREATE TABLE IF NOT EXISTS newsletter ( | ||
| + | id serial PRIMARY KEY, | ||
| + | id_user INTEGER NOT NULL UNIQUE, | ||
| + | to_email VARCHAR NOT NULL UNIQUE | ||
| + | ) | ||
| + | </code> | ||
| + | |||
| + | <note tip>De astazi, serviciul de auth va intoarce, in momentul interogarii de catre alte servicii, si **email**, pe langa userId si role</note> | ||
| + | |||
| + | * in middlewareul de autorizare, sa salvati in **req.state** si **email** | ||