Node.js e
MongoDB
http://www.luiztools.com.br
cinema-catalog-service
Modelagem
Testes
CRONOGRAMA
cinema
catalog
service
nano /cinema-microservice/movies-
service/src/api/movies.js
movies.js
cinema-catalog-service
● npm init
● criar mesma estrutura de pastas
● npm install express morgan tape
mongodb helmet supertest dotenv-
safe
● copiar arquivos mongodb.js,
server.js e .env.example
Estruturando
Modelagem
Modelagem
id da cidade;
nome da cidade;
uf da cidade (sigla string);
código do país (duas letras, opcional, caso internacional);
cinemas da cidade;
id do cinema;
nome do cinema
salas de cinema;
nome da sala (numérico simples);
sessões;
data e hora (date);
id do filme (referente ao banco de filmes);
nome do filme;
valor (decimal);
assentos (número e disponibilidade)
Domínio
Modelagem
● cada país tem N estados (1-N);
● cada estado tem N cidades (1-N);
● cada cidade tem N cinemas (1-N);
● cada cinema tem N salas (1-N);
● cada sala de cinema tem N sessões (1-
N);
● cada sessão tem N assentos (1-N);
● cada sessão tem 1 filme (1-1);
Relacionamentos
Modelagem
_id: ObjectId("sasacsa85s7sdc7sd"),
cidade: "Porto Alegre",
uf: "RS",
pais: "BR",
cinemas: [ {
_id: ObjectId("68df5gd5g6ddf"),
nome: "Cinemark Bourbon Ipiranga",
salas: [ … ]
} ]
} ] }
Schema
Modelagem
salas: [ {
nome: 1,
sessoes: [ {
data: ISODate("2018-06-01T09:00:00Z"),
idFilme: ObjectId("9ds68dsvdsvs876v"),
filme: "Vingadores: Guerra Infinita",
valor: 25.00,
assentos: [ ...]
},{
data: ISODate("2018-06-01T11:00:00Z"),
idFilme: ObjectId("9ds68dsvdsvs876v"),
filme: "Vingadores: Guerra Infinita",
valor: 25.00,
assentos: [...]
Schema
Modelagem
assentos: [ {
numero: 1,
disponivel: true
},
{
numero: 2,
disponivel: false
} ]
Schema
Modelagem
./mongod --dbpath /pasta-do-seu-
microservice/data --port 27018
./mongo --port 27018
use cinema-catalog-service
Subindo
Modelagem
db.cinemaCatalog.insert([ { cidade: "Gravataí", uf: "RS", cinemas: [] }, { cidade: "Porto Alegre", uf: "RS", pais: "BR", cinemas:
[ { _id: ObjectId(), nome: "Cinemark Bourbon Ipiranga", salas: [ { nome: 1, sessoes: [ { data: ISODate("2018-06-
01T09:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e57"), filme: "Vingadores: Guerra Infinita", valor: 25.00,
assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: false }, ] }, { data: ISODate("2018-06-01T11:00:00Z"),
idFilme: ObjectId("5aefc5029ce83b1eb6b89e57"), filme: "Vingadores: Guerra Infinita", valor: 25.00, assentos: [ { numero: 1,
disponivel: true }, { numero: 2, disponivel: true }, ] }, { data: ISODate("2018-06-01T13:00:00Z"), idFilme:
ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron", valor: 20.00, assentos: [ { numero: 1,
disponivel: true }, { numero: 2, disponivel: false }, { numero: 2, disponivel: true }, ] } ] }, { nome: 2, sessoes: [ { data:
ISODate("2018-06-01T09:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron",
valor: 25.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: false }, ] }, { data: ISODate("2018-06-
01T11:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron", valor: 25.00, assentos:
[ { numero: 1, disponivel: true }, { numero: 2, disponivel: true }, ] }, { data: ISODate("2018-06-01T13:00:00Z"), idFilme:
ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron", valor: 20.00, assentos: [ { numero: 1,
disponivel: true }, { numero: 2, disponivel: false }, { numero: 2, disponivel: true }, ] } ] } ] }, { _id: ObjectId(), nome: "GNC
Lindóia", salas: [ { nome: 100, sessoes: [ { data: ISODate("2018-06-01T09:00:00Z"), idFilme:
ObjectId("5aefc5029ce83b1eb6b89e59"), filme: "Os Vingadores", valor: 25.00, assentos: [ { numero: 1, disponivel: true }, {
numero: 2, disponivel: false }, ] }, { data: ISODate("2018-06-01T11:00:00Z"), idFilme:
ObjectId("5aefc5029ce83b1eb6b89e59"), filme: "Os Vingadores", valor: 25.00, assentos: [ { numero: 1, disponivel: true }, {
numero: 2, disponivel: true }, ] }, { data: ISODate("2018-06-01T13:00:00Z"), idFilme:
ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron", valor: 20.00, assentos: [ { numero: 1,
disponivel: true }, { numero: 2, disponivel: false }, { numero: 2, disponivel: true }, ] } ] } ] } ] }])
Bulk Insert
Modelagem
#.env, don't commit to repo
MONGO_CONNECTION=mongodb://localhost:27018
DATABASE=cinema-catalog-service PORT=3001
.env
Testes
Testes
require("dotenv-safe").load();
require("./config/mongodb.test").runTests();
require("./server/server.test").runTests();
..
test script no package.json
index.test.js
Testes
Dúvidas?
Exercícios
1 Adicione mais cidades, salas e sessões
2 Crie scripts de start do Mongo no projeto
3 Adicione um teste para ver se a coleção existe
Obrigado!

Curso de Node.js e MongoDB - 17

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
    cinema-catalog-service ● npm init ●criar mesma estrutura de pastas ● npm install express morgan tape mongodb helmet supertest dotenv- safe ● copiar arquivos mongodb.js, server.js e .env.example Estruturando
  • 6.
  • 7.
    Modelagem id da cidade; nomeda cidade; uf da cidade (sigla string); código do país (duas letras, opcional, caso internacional); cinemas da cidade; id do cinema; nome do cinema salas de cinema; nome da sala (numérico simples); sessões; data e hora (date); id do filme (referente ao banco de filmes); nome do filme; valor (decimal); assentos (número e disponibilidade) Domínio
  • 8.
    Modelagem ● cada paístem N estados (1-N); ● cada estado tem N cidades (1-N); ● cada cidade tem N cinemas (1-N); ● cada cinema tem N salas (1-N); ● cada sala de cinema tem N sessões (1- N); ● cada sessão tem N assentos (1-N); ● cada sessão tem 1 filme (1-1); Relacionamentos
  • 9.
    Modelagem _id: ObjectId("sasacsa85s7sdc7sd"), cidade: "PortoAlegre", uf: "RS", pais: "BR", cinemas: [ { _id: ObjectId("68df5gd5g6ddf"), nome: "Cinemark Bourbon Ipiranga", salas: [ … ] } ] } ] } Schema
  • 10.
    Modelagem salas: [ { nome:1, sessoes: [ { data: ISODate("2018-06-01T09:00:00Z"), idFilme: ObjectId("9ds68dsvdsvs876v"), filme: "Vingadores: Guerra Infinita", valor: 25.00, assentos: [ ...] },{ data: ISODate("2018-06-01T11:00:00Z"), idFilme: ObjectId("9ds68dsvdsvs876v"), filme: "Vingadores: Guerra Infinita", valor: 25.00, assentos: [...] Schema
  • 11.
    Modelagem assentos: [ { numero:1, disponivel: true }, { numero: 2, disponivel: false } ] Schema
  • 12.
    Modelagem ./mongod --dbpath /pasta-do-seu- microservice/data--port 27018 ./mongo --port 27018 use cinema-catalog-service Subindo
  • 13.
    Modelagem db.cinemaCatalog.insert([ { cidade:"Gravataí", uf: "RS", cinemas: [] }, { cidade: "Porto Alegre", uf: "RS", pais: "BR", cinemas: [ { _id: ObjectId(), nome: "Cinemark Bourbon Ipiranga", salas: [ { nome: 1, sessoes: [ { data: ISODate("2018-06- 01T09:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e57"), filme: "Vingadores: Guerra Infinita", valor: 25.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: false }, ] }, { data: ISODate("2018-06-01T11:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e57"), filme: "Vingadores: Guerra Infinita", valor: 25.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: true }, ] }, { data: ISODate("2018-06-01T13:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron", valor: 20.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: false }, { numero: 2, disponivel: true }, ] } ] }, { nome: 2, sessoes: [ { data: ISODate("2018-06-01T09:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron", valor: 25.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: false }, ] }, { data: ISODate("2018-06- 01T11:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron", valor: 25.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: true }, ] }, { data: ISODate("2018-06-01T13:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron", valor: 20.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: false }, { numero: 2, disponivel: true }, ] } ] } ] }, { _id: ObjectId(), nome: "GNC Lindóia", salas: [ { nome: 100, sessoes: [ { data: ISODate("2018-06-01T09:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e59"), filme: "Os Vingadores", valor: 25.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: false }, ] }, { data: ISODate("2018-06-01T11:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e59"), filme: "Os Vingadores", valor: 25.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: true }, ] }, { data: ISODate("2018-06-01T13:00:00Z"), idFilme: ObjectId("5aefc5029ce83b1eb6b89e58"), filme: "Vingadores: Era de Ultron", valor: 20.00, assentos: [ { numero: 1, disponivel: true }, { numero: 2, disponivel: false }, { numero: 2, disponivel: true }, ] } ] } ] } ] }]) Bulk Insert
  • 14.
    Modelagem #.env, don't committo repo MONGO_CONNECTION=mongodb://localhost:27018 DATABASE=cinema-catalog-service PORT=3001 .env
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
    1 Adicione maiscidades, salas e sessões 2 Crie scripts de start do Mongo no projeto 3 Adicione um teste para ver se a coleção existe
  • 21.