Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 randfelicitari 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**
moby/backend/05.1590944455.txt.gz · Last modified: 2020/05/31 20:00 by alexandru.hogea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0