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** |