SlideShare uma empresa Scribd logo
1 de 48
Node.js e
MongoDB
http://www.luiztools.com.br
Repositório
Api - Cinema-Catalog
Index - Cinema-Catalog
CRONOGRAMA
Repositóri
o
Repositório
● pesquisar cidades em que a rede possui
cinema;
● pesquisar cinemas por id da cidade;
● pesquisar filmes disponíveis em um cinema;
● pesquisar filmes disponíveis em uma cidade;
● pesquisar sessões disponíveis para um filme
em uma cidade;
● pesquisar sessões disponíveis para um filme
em um cinema;
Funcionalidades
Repositório
const mongodb = require("../config/mongodb");
const ObjectId = require("mongodb").ObjectId;
function getAllCities(callback){
mongodb.connect((err, db) => {
db.collection("cinemaCatalog").find({},
{cidade:1,uf:1,pais:1}).toArray(callback);
})
}
repository.js
Repositório
function getCinemasByCityId(cityId, callback){
var objCityId = ObjectId(cityId);
mongodb.connect((err, db) => {
db.collection("cinemaCatalog").find({_id: objCityId},
{cinemas: 1}).toArray((err, cities) => {
if(err) return callback(err, null);
callback(err, cities[0].cinemas);
});
});
}
repository.js
Repositório
function disconnect(){
return mongodb.disconnect();
}
module.exports = { getAllCities, getCinemasByCityId, disconnect }
repository.js
Repositório
const test = require('tape');
const repository = require('./repository');
function runTests(){
var cityId = null;
var cinemaId = null;
var movieId = null;
//tests here
}
module.exports = { runTests }
repository.test.js
Repositório
test('Repository getAllCities', (t) => {
repository.getAllCities((err, cities) => {
if(cities && cities.length > 0) cityId = cities[1]._id;//Porto
Alegre
t.assert(!err && cities && cities.length > 0, "All Cities
Returned");
t.end();
});
})
repository.test.js
Repositório
test('Repository getCinemasByCityId', (t) => {
repository.getCinemasByCityId(cityId, (err, cinemas) => {
if(cinemas && cinemas.length > 0) cinemaId =
cinemas[0]._id;
t.assert(!err && cinemas && cinemas.length > 0, "All
Cinemas Returned By City Id");
t.end();
});
})
repository.test.js
Repositório
test('Repository Disconnect', (t) => {
t.assert(repository.disconnect(), "Disconnect Ok");
t.end();
})
}
repository.test.js
Repositório
require("dotenv-safe").load();
require("./config/mongodb.test").runTests();
require("./server/server.test").runTests();
require("./repository/repository.test").runTests();
index.test.js
Repositório
Repositório
function getMoviesByCinemaId(cinemaId, callback){
var objCinemaId = ObjectId(cinemaId);
mongodb.connect((err, db) => {
db.collection("cinemaCatalog").aggregate([
{$match: {"cinemas._id": objCinemaId}},
{$unwind: "$cinemas"},
{$unwind: "$cinemas.salas"},
{$unwind: "$cinemas.salas.sessoes"},
{$group: {_id: { filme: "$cinemas.salas.sessoes.filme",
idFilme: "$cinemas.salas.sessoes.idFilme"}}}
]).toArray(callback);
});
}
repository.js
Repositório
function getMoviesByCityId(cityId, callback){
var objCityId = ObjectId(cityId);
mongodb.connect((err, db) => {
db.collection("cinemaCatalog").aggregate([
{$match: {"_id": objCityId}},
{$unwind: "$cinemas"},
{$unwind: "$cinemas.salas"},
{$unwind: "$cinemas.salas.sessoes"},
{$group: {_id: { filme: "$cinemas.salas.sessoes.filme", idFilme:
"$cinemas.salas.sessoes.idFilme"}}}
]).toArray((err, sessions) => {
if(err) return callback(err, null);
callback(err, sessions.map(item => {
return {idFilme: item._id.idFilme, filme: item._id.filme }
} )); }); });
}
repository.js
Repositório
function getMovieSessionsByCityId(movieId, cityId, callback){
var objMovieId = ObjectId(movieId);
var objCityId = ObjectId(cityId);
mongodb.connect((err, db) => {
db.collection("cinemaCatalog").aggregate([
{$match: {"_id": objCityId}},
{$unwind: "$cinemas"},
{$unwind: "$cinemas.salas"},
{$unwind: "$cinemas.salas.sessoes"},
{$match: {"cinemas.salas.sessoes.idFilme": objMovieId}},
{$group: {_id: { filme: "$cinemas.salas.sessoes.filme", idFilme:
"$cinemas.salas.sessoes.idFilme", idCinema: "$cinemas._id", sala:
"$cinemas.salas.nome", sessao: "$cinemas.salas.sessoes"}}}
]).toArray((err, sessions) => {
if(err) return callback(err, null);
callback(err, sessions.map(item => {
return {idFilme: item._id.idFilme, filme: item._id.filme,
idCinema: item._id.idCinema, sala: item._id.sala, sessao:
item._id.sessao } } )); }); });
}
repository.js
Repositório
function getMovieSessionsByCinemaId(movieId, cinemaId, callback){
var objCinemaId = ObjectId(cinemaId);
var objMovieId = ObjectId(movieId);
mongodb.connect((err, db) => {
db.collection("cinemaCatalog").aggregate([
{$match: {"cinemas._id": objCinemaId}},
{$unwind: "$cinemas"},
{$unwind: "$cinemas.salas"},
{$unwind: "$cinemas.salas.sessoes"},
{$match: {"cinemas.salas.sessoes.idFilme": objMovieId}},
{$group: {_id: { filme: "$cinemas.salas.sessoes.filme",
idFilme: "$cinemas.salas.sessoes.idFilme", sala:
"$cinemas.salas.nome", sessao: "$cinemas.salas.sessoes"}}}
]).toArray((err, sessions) => {
if(err) return callback(err, null);
callback(err, sessions.map(item => {
return {idFilme: item._id.idFilme, filme:
item._id.filme, sala: item._id.sala, sessao:
item._id.sessao } } )); }); });
}
repository.js
Repositório
module.exports = {
getAllCities,
getCinemasByCityId,
getMoviesByCityId,
getMoviesByCinemaId,
getMovieSessionsByCityId,
getMovieSessionsByCinemaId, disconnect
}
repository.js
Repositório
test('Repository getMoviesByCinemaId', (t) => {
repository.getMoviesByCinemaId(cinemaId, (err, movies)
=> {
t.assert(!err && movies && movies.length > 0, "Movies By
Cinema Id Returned");
t.end();
});
})
repository.test.js
Repositório
test('Repository getMoviesByCityId', (t) => {
repository.getMoviesByCityId(cityId, (err, movies) => {
if(movies && movies.length > 0) movieId =
movies[1].idFilme;//Era de Ultron
t.assert(!err && movies && movies.length > 0,
"Movies By City Id Returned");
t.end();
});
})
repository.test.js
Repositório
test('Repository getMovieSessionsByCityId', (t) => {
repository.getMovieSessionsByCityId(movieId, cityId, (err,
sessions) => {
t.assert(!err && sessions && sessions.length > 0, "Movie
Sessions By City Id Returned");
t.end();
});
})
repository.test.js
Repositório
test('Repository getMovieSessionsByCinemaId', (t) => {
repository.getMovieSessionsByCinemaId(movieId,
cinemaId, (err, sessions) => {
t.assert(!err && sessions && sessions.length > 0, "Movie
Sessions By Cinema Id Returned");
t.end();
});
})
repository.test.js
Repositório
API -
Cinema
Catalog
API - Cinema Catalog
GET /cities
lista todas cidades onde a rede possui cinema
GET /cities/:city/movies
lista todos os filmes em exibição na cidade especificada;
GET /cities/:city/movies/:movie
lista todos as sessões do filme escolhido na cidade
especificada;
GET /cities/:city/cinemas
lista todos os cinemas em determinada cidade;
GET /cinemas/:cinema/movies
lista todos os filmes em exibição no cinema especificado;
GET /cinemas/:cinema/movies/:movie
lista todas as sessões do filme escolhido no cinema
especificado;
Estrutura
API - Cinema Catalog
module.exports = (app, repository) => {
app.get('/cities', (req, res, next) => {
repository.getAllCities((err, cities) => {
if(err) return next(err);
res.json(cities);
});
})
//another routes here
}
cinema-catalog.js
API - Cinema Catalog
app.get('/cities/:city/movies', (req, res, next) => {
repository.getMoviesByCityId(req.params.city, (err, movies)
=> {
if(err) return next(err);
res.json(movies)
});
})
cinema-catalog.js
API - Cinema Catalog
app.get('/cities/:city/movies/:movie', (req, res, next) => {
repository.getMovieSessionsByCityId(req.params.movie,
req.params.city, (err, sessions) => {
if(err) return next(err);
res.json(sessions)
});
})
cinema-catalog.js
API - Cinema Catalog
app.get('/cities/:city/cinemas', (req, res, next) => {
repository.getCinemasByCityId(req.params.city, (err,
cinemas) => {
if(err) return next(err);
res.json(cinemas)
});
})
cinema-catalog.js
API - Cinema Catalog
app.get('/cinemas/:cinema/movies', (req, res, next) => {
repository.getMoviesByCinemaId(req.params.cinema, (err,
movies) => {
if(err) return next(err);
res.json(movies)
});
})
cinema-catalog.js
API - Cinema Catalog
app.get('/cinemas/:cinema/movies/:movie', (req, res, next) => {
repository.getMovieSessionsByCinemaId(req.params.movie
, req.params.cinema, (err, sessions) => {
if(err) return next(err);
res.json(sessions)
});
})
cinema-catalog.js
API - Cinema Catalog
const test = require('tape');
const supertest = require('supertest');
const movies = require('./cinema-catalog');
const server = require("../server/server");
const repository = require("../repository/repository");
function runTests(){
//run tests here
}
module.exports = { runTests }
cinema-catalog.test.js
API - Cinema Catalog
var app = null;
server.start(movies, repository, (err, app) => {
var cityId = null;
var movieId = null;
var cinemaId = null;
//test cases
})
repository.disconnect();
server.stop();
cinema-catalog.test.js
API - Cinema Catalog
test('GET /cities', (t) => {
supertest(app) .get('/cities')
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) =>{
if(res.body && res.body.length > 0)
cityId = res.body[1]._id;
t.error(err, 'No errors')
t.assert(res.body && res.body.length > 0, "All
Cities returned")
t.end()
})
})
cinema-catalog.test.js
API - Cinema Catalog
test('GET /cities/:city/movies', (t) => {
supertest(app)
.get('/cities/' + cityId + "/movies")
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) =>{
if(res.body && res.body.length > 0)
movieId = res.body[0].idFilme;
t.error(err, 'No errors')
t.assert(res.body, "Movies By City Id returned")
t.end()
})
})
cinema-catalog.test.js
API - Cinema Catalog
test('GET /cities/:city/movies/:movie', (t) => {
supertest(app)
.get('/cities/' + cityId + '/movies/' + movieId)
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) =>{
if(res.body && res.body.length > 0)
cinemaId = res.body[0].idCinema;
t.error(err, 'No errors')
t.assert(res.body && res.body.length > 0, "Movie
Sessions by City Id returned")
t.end()
})
})
cinema-catalog.test.js
API - Cinema Catalog
test('GET /cities/:city/cinemas', (t) => {
supertest(app)
.get('/cities/' + cityId + '/cinemas')
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) =>{
t.error(err, 'No errors')
t.assert(res.body, "Cinemas By City Id
returned")
t.end()
})
})
cinema-catalog.test.js
API - Cinema Catalog
test('GET /cinemas/:cinema/movies', (t) => {
supertest(app)
.get('/cinemas/' + cinemaId + "/movies")
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) =>{
t.error(err, 'No errors')
t.assert(res.body, "Movies By Cinema Id
returned")
t.end()
})
})
cinema-catalog.test.js
API - Cinema Catalog
test('GET /cinemas/:cinema/movies/:movie', (t) => {
supertest(app)
.get('/cinemas/' + cinemaId + "/movies/" + movieId)
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) =>{
t.error(err, 'No errors')
t.assert(res.body, "Movie Sessions By Cinema Id
returned")
t.end()
})
})
cinema-catalog.test.js
API - Cinema Catalog
require("dotenv-safe").load();
require("./config/mongodb.test").runTests();
require("./server/server.test").runTests();
require("./repository/repository.test").runTests();
require("./api/cinema-catalog.test").runTests();
index.test.js
API - Cinema Catalog
Index -
Cinema
Catalog
Index - Cinema Catalog
require("dotenv-safe").load();
const cinemaCatalog = require('./api/cinema-catalog');
const server = require("./server/server");
const repository = require("./repository/repository");
server.start(cinemaCatalog, repository, (err, app) => {
console.log("just started");
});
index.js
Index - Cinema Catalog
Dúvidas?
Exercícios
1 Adicione outra função no microservice
2 Aplique validação de entrada de dados
3 Adicione o restante do CRUD ao microservice
Obrigado!

Mais conteúdo relacionado

Mais de Luiz Duarte

Mecanismo de busca em Node.js e MongoDB
Mecanismo de busca em Node.js e MongoDBMecanismo de busca em Node.js e MongoDB
Mecanismo de busca em Node.js e MongoDBLuiz Duarte
 
FDP, DEEP, INVEST e SMART: entendendo a sopa de letrinhas que todo PO deve co...
FDP, DEEP, INVEST e SMART: entendendo a sopa de letrinhas que todo PO deve co...FDP, DEEP, INVEST e SMART: entendendo a sopa de letrinhas que todo PO deve co...
FDP, DEEP, INVEST e SMART: entendendo a sopa de letrinhas que todo PO deve co...Luiz Duarte
 
Team Building: Passo a Passo
Team Building: Passo a PassoTeam Building: Passo a Passo
Team Building: Passo a PassoLuiz Duarte
 
Curso Scrum e Métodos Ágeis 07
Curso Scrum e Métodos Ágeis 07Curso Scrum e Métodos Ágeis 07
Curso Scrum e Métodos Ágeis 07Luiz Duarte
 
Curso Scrum e Métodos Ágeis 04
Curso Scrum e Métodos Ágeis 04Curso Scrum e Métodos Ágeis 04
Curso Scrum e Métodos Ágeis 04Luiz Duarte
 
Curso Scrum e Métodos Ágeis 02
Curso Scrum e Métodos Ágeis 02Curso Scrum e Métodos Ágeis 02
Curso Scrum e Métodos Ágeis 02Luiz Duarte
 
Curso Scrum e Métodos Ágeis 03
Curso Scrum e Métodos Ágeis 03Curso Scrum e Métodos Ágeis 03
Curso Scrum e Métodos Ágeis 03Luiz Duarte
 
Curso Scrum e Métodos Ágeis - Introdução
Curso Scrum e Métodos Ágeis - IntroduçãoCurso Scrum e Métodos Ágeis - Introdução
Curso Scrum e Métodos Ágeis - IntroduçãoLuiz Duarte
 
Curso Scrum e Métodos Ágeis 01
Curso Scrum e Métodos Ágeis 01Curso Scrum e Métodos Ágeis 01
Curso Scrum e Métodos Ágeis 01Luiz Duarte
 
Curso Scrum e Métodos Ágeis 05
Curso Scrum e Métodos Ágeis 05Curso Scrum e Métodos Ágeis 05
Curso Scrum e Métodos Ágeis 05Luiz Duarte
 
Curso Scrum e Métodos Ágeis 06
Curso Scrum e Métodos Ágeis 06Curso Scrum e Métodos Ágeis 06
Curso Scrum e Métodos Ágeis 06Luiz Duarte
 
Carreira em Agilidade
Carreira em AgilidadeCarreira em Agilidade
Carreira em AgilidadeLuiz Duarte
 
Gamification em Modelos de Maturidade
Gamification em Modelos de MaturidadeGamification em Modelos de Maturidade
Gamification em Modelos de MaturidadeLuiz Duarte
 
Curso de Node.js e MongoDB - 20
Curso de Node.js e MongoDB - 20Curso de Node.js e MongoDB - 20
Curso de Node.js e MongoDB - 20Luiz Duarte
 
Curso de Node.js e MongoDB - 19
Curso de Node.js e MongoDB - 19Curso de Node.js e MongoDB - 19
Curso de Node.js e MongoDB - 19Luiz Duarte
 
Curso de Node.js e MongoDB - 17
Curso de Node.js e MongoDB - 17Curso de Node.js e MongoDB - 17
Curso de Node.js e MongoDB - 17Luiz Duarte
 
Curso de Node.js e MongoDB - 16
Curso de Node.js e MongoDB - 16Curso de Node.js e MongoDB - 16
Curso de Node.js e MongoDB - 16Luiz Duarte
 
Curso de Node.js e MongoDB - 15
Curso de Node.js e MongoDB - 15Curso de Node.js e MongoDB - 15
Curso de Node.js e MongoDB - 15Luiz Duarte
 
Curso de Node.js e MongoDB - 14
Curso de Node.js e MongoDB - 14Curso de Node.js e MongoDB - 14
Curso de Node.js e MongoDB - 14Luiz Duarte
 
Curso de Node.js e MongoDB - 13
Curso de Node.js e MongoDB - 13Curso de Node.js e MongoDB - 13
Curso de Node.js e MongoDB - 13Luiz Duarte
 

Mais de Luiz Duarte (20)

Mecanismo de busca em Node.js e MongoDB
Mecanismo de busca em Node.js e MongoDBMecanismo de busca em Node.js e MongoDB
Mecanismo de busca em Node.js e MongoDB
 
FDP, DEEP, INVEST e SMART: entendendo a sopa de letrinhas que todo PO deve co...
FDP, DEEP, INVEST e SMART: entendendo a sopa de letrinhas que todo PO deve co...FDP, DEEP, INVEST e SMART: entendendo a sopa de letrinhas que todo PO deve co...
FDP, DEEP, INVEST e SMART: entendendo a sopa de letrinhas que todo PO deve co...
 
Team Building: Passo a Passo
Team Building: Passo a PassoTeam Building: Passo a Passo
Team Building: Passo a Passo
 
Curso Scrum e Métodos Ágeis 07
Curso Scrum e Métodos Ágeis 07Curso Scrum e Métodos Ágeis 07
Curso Scrum e Métodos Ágeis 07
 
Curso Scrum e Métodos Ágeis 04
Curso Scrum e Métodos Ágeis 04Curso Scrum e Métodos Ágeis 04
Curso Scrum e Métodos Ágeis 04
 
Curso Scrum e Métodos Ágeis 02
Curso Scrum e Métodos Ágeis 02Curso Scrum e Métodos Ágeis 02
Curso Scrum e Métodos Ágeis 02
 
Curso Scrum e Métodos Ágeis 03
Curso Scrum e Métodos Ágeis 03Curso Scrum e Métodos Ágeis 03
Curso Scrum e Métodos Ágeis 03
 
Curso Scrum e Métodos Ágeis - Introdução
Curso Scrum e Métodos Ágeis - IntroduçãoCurso Scrum e Métodos Ágeis - Introdução
Curso Scrum e Métodos Ágeis - Introdução
 
Curso Scrum e Métodos Ágeis 01
Curso Scrum e Métodos Ágeis 01Curso Scrum e Métodos Ágeis 01
Curso Scrum e Métodos Ágeis 01
 
Curso Scrum e Métodos Ágeis 05
Curso Scrum e Métodos Ágeis 05Curso Scrum e Métodos Ágeis 05
Curso Scrum e Métodos Ágeis 05
 
Curso Scrum e Métodos Ágeis 06
Curso Scrum e Métodos Ágeis 06Curso Scrum e Métodos Ágeis 06
Curso Scrum e Métodos Ágeis 06
 
Carreira em Agilidade
Carreira em AgilidadeCarreira em Agilidade
Carreira em Agilidade
 
Gamification em Modelos de Maturidade
Gamification em Modelos de MaturidadeGamification em Modelos de Maturidade
Gamification em Modelos de Maturidade
 
Curso de Node.js e MongoDB - 20
Curso de Node.js e MongoDB - 20Curso de Node.js e MongoDB - 20
Curso de Node.js e MongoDB - 20
 
Curso de Node.js e MongoDB - 19
Curso de Node.js e MongoDB - 19Curso de Node.js e MongoDB - 19
Curso de Node.js e MongoDB - 19
 
Curso de Node.js e MongoDB - 17
Curso de Node.js e MongoDB - 17Curso de Node.js e MongoDB - 17
Curso de Node.js e MongoDB - 17
 
Curso de Node.js e MongoDB - 16
Curso de Node.js e MongoDB - 16Curso de Node.js e MongoDB - 16
Curso de Node.js e MongoDB - 16
 
Curso de Node.js e MongoDB - 15
Curso de Node.js e MongoDB - 15Curso de Node.js e MongoDB - 15
Curso de Node.js e MongoDB - 15
 
Curso de Node.js e MongoDB - 14
Curso de Node.js e MongoDB - 14Curso de Node.js e MongoDB - 14
Curso de Node.js e MongoDB - 14
 
Curso de Node.js e MongoDB - 13
Curso de Node.js e MongoDB - 13Curso de Node.js e MongoDB - 13
Curso de Node.js e MongoDB - 13
 

Node MongoDB API Cinema

  • 2. Repositório Api - Cinema-Catalog Index - Cinema-Catalog CRONOGRAMA
  • 4. Repositório ● pesquisar cidades em que a rede possui cinema; ● pesquisar cinemas por id da cidade; ● pesquisar filmes disponíveis em um cinema; ● pesquisar filmes disponíveis em uma cidade; ● pesquisar sessões disponíveis para um filme em uma cidade; ● pesquisar sessões disponíveis para um filme em um cinema; Funcionalidades
  • 5. Repositório const mongodb = require("../config/mongodb"); const ObjectId = require("mongodb").ObjectId; function getAllCities(callback){ mongodb.connect((err, db) => { db.collection("cinemaCatalog").find({}, {cidade:1,uf:1,pais:1}).toArray(callback); }) } repository.js
  • 6. Repositório function getCinemasByCityId(cityId, callback){ var objCityId = ObjectId(cityId); mongodb.connect((err, db) => { db.collection("cinemaCatalog").find({_id: objCityId}, {cinemas: 1}).toArray((err, cities) => { if(err) return callback(err, null); callback(err, cities[0].cinemas); }); }); } repository.js
  • 7. Repositório function disconnect(){ return mongodb.disconnect(); } module.exports = { getAllCities, getCinemasByCityId, disconnect } repository.js
  • 8. Repositório const test = require('tape'); const repository = require('./repository'); function runTests(){ var cityId = null; var cinemaId = null; var movieId = null; //tests here } module.exports = { runTests } repository.test.js
  • 9. Repositório test('Repository getAllCities', (t) => { repository.getAllCities((err, cities) => { if(cities && cities.length > 0) cityId = cities[1]._id;//Porto Alegre t.assert(!err && cities && cities.length > 0, "All Cities Returned"); t.end(); }); }) repository.test.js
  • 10. Repositório test('Repository getCinemasByCityId', (t) => { repository.getCinemasByCityId(cityId, (err, cinemas) => { if(cinemas && cinemas.length > 0) cinemaId = cinemas[0]._id; t.assert(!err && cinemas && cinemas.length > 0, "All Cinemas Returned By City Id"); t.end(); }); }) repository.test.js
  • 11. Repositório test('Repository Disconnect', (t) => { t.assert(repository.disconnect(), "Disconnect Ok"); t.end(); }) } repository.test.js
  • 14. Repositório function getMoviesByCinemaId(cinemaId, callback){ var objCinemaId = ObjectId(cinemaId); mongodb.connect((err, db) => { db.collection("cinemaCatalog").aggregate([ {$match: {"cinemas._id": objCinemaId}}, {$unwind: "$cinemas"}, {$unwind: "$cinemas.salas"}, {$unwind: "$cinemas.salas.sessoes"}, {$group: {_id: { filme: "$cinemas.salas.sessoes.filme", idFilme: "$cinemas.salas.sessoes.idFilme"}}} ]).toArray(callback); }); } repository.js
  • 15. Repositório function getMoviesByCityId(cityId, callback){ var objCityId = ObjectId(cityId); mongodb.connect((err, db) => { db.collection("cinemaCatalog").aggregate([ {$match: {"_id": objCityId}}, {$unwind: "$cinemas"}, {$unwind: "$cinemas.salas"}, {$unwind: "$cinemas.salas.sessoes"}, {$group: {_id: { filme: "$cinemas.salas.sessoes.filme", idFilme: "$cinemas.salas.sessoes.idFilme"}}} ]).toArray((err, sessions) => { if(err) return callback(err, null); callback(err, sessions.map(item => { return {idFilme: item._id.idFilme, filme: item._id.filme } } )); }); }); } repository.js
  • 16. Repositório function getMovieSessionsByCityId(movieId, cityId, callback){ var objMovieId = ObjectId(movieId); var objCityId = ObjectId(cityId); mongodb.connect((err, db) => { db.collection("cinemaCatalog").aggregate([ {$match: {"_id": objCityId}}, {$unwind: "$cinemas"}, {$unwind: "$cinemas.salas"}, {$unwind: "$cinemas.salas.sessoes"}, {$match: {"cinemas.salas.sessoes.idFilme": objMovieId}}, {$group: {_id: { filme: "$cinemas.salas.sessoes.filme", idFilme: "$cinemas.salas.sessoes.idFilme", idCinema: "$cinemas._id", sala: "$cinemas.salas.nome", sessao: "$cinemas.salas.sessoes"}}} ]).toArray((err, sessions) => { if(err) return callback(err, null); callback(err, sessions.map(item => { return {idFilme: item._id.idFilme, filme: item._id.filme, idCinema: item._id.idCinema, sala: item._id.sala, sessao: item._id.sessao } } )); }); }); } repository.js
  • 17. Repositório function getMovieSessionsByCinemaId(movieId, cinemaId, callback){ var objCinemaId = ObjectId(cinemaId); var objMovieId = ObjectId(movieId); mongodb.connect((err, db) => { db.collection("cinemaCatalog").aggregate([ {$match: {"cinemas._id": objCinemaId}}, {$unwind: "$cinemas"}, {$unwind: "$cinemas.salas"}, {$unwind: "$cinemas.salas.sessoes"}, {$match: {"cinemas.salas.sessoes.idFilme": objMovieId}}, {$group: {_id: { filme: "$cinemas.salas.sessoes.filme", idFilme: "$cinemas.salas.sessoes.idFilme", sala: "$cinemas.salas.nome", sessao: "$cinemas.salas.sessoes"}}} ]).toArray((err, sessions) => { if(err) return callback(err, null); callback(err, sessions.map(item => { return {idFilme: item._id.idFilme, filme: item._id.filme, sala: item._id.sala, sessao: item._id.sessao } } )); }); }); } repository.js
  • 19. Repositório test('Repository getMoviesByCinemaId', (t) => { repository.getMoviesByCinemaId(cinemaId, (err, movies) => { t.assert(!err && movies && movies.length > 0, "Movies By Cinema Id Returned"); t.end(); }); }) repository.test.js
  • 20. Repositório test('Repository getMoviesByCityId', (t) => { repository.getMoviesByCityId(cityId, (err, movies) => { if(movies && movies.length > 0) movieId = movies[1].idFilme;//Era de Ultron t.assert(!err && movies && movies.length > 0, "Movies By City Id Returned"); t.end(); }); }) repository.test.js
  • 21. Repositório test('Repository getMovieSessionsByCityId', (t) => { repository.getMovieSessionsByCityId(movieId, cityId, (err, sessions) => { t.assert(!err && sessions && sessions.length > 0, "Movie Sessions By City Id Returned"); t.end(); }); }) repository.test.js
  • 22. Repositório test('Repository getMovieSessionsByCinemaId', (t) => { repository.getMovieSessionsByCinemaId(movieId, cinemaId, (err, sessions) => { t.assert(!err && sessions && sessions.length > 0, "Movie Sessions By Cinema Id Returned"); t.end(); }); }) repository.test.js
  • 25. API - Cinema Catalog GET /cities lista todas cidades onde a rede possui cinema GET /cities/:city/movies lista todos os filmes em exibição na cidade especificada; GET /cities/:city/movies/:movie lista todos as sessões do filme escolhido na cidade especificada; GET /cities/:city/cinemas lista todos os cinemas em determinada cidade; GET /cinemas/:cinema/movies lista todos os filmes em exibição no cinema especificado; GET /cinemas/:cinema/movies/:movie lista todas as sessões do filme escolhido no cinema especificado; Estrutura
  • 26. API - Cinema Catalog module.exports = (app, repository) => { app.get('/cities', (req, res, next) => { repository.getAllCities((err, cities) => { if(err) return next(err); res.json(cities); }); }) //another routes here } cinema-catalog.js
  • 27. API - Cinema Catalog app.get('/cities/:city/movies', (req, res, next) => { repository.getMoviesByCityId(req.params.city, (err, movies) => { if(err) return next(err); res.json(movies) }); }) cinema-catalog.js
  • 28. API - Cinema Catalog app.get('/cities/:city/movies/:movie', (req, res, next) => { repository.getMovieSessionsByCityId(req.params.movie, req.params.city, (err, sessions) => { if(err) return next(err); res.json(sessions) }); }) cinema-catalog.js
  • 29. API - Cinema Catalog app.get('/cities/:city/cinemas', (req, res, next) => { repository.getCinemasByCityId(req.params.city, (err, cinemas) => { if(err) return next(err); res.json(cinemas) }); }) cinema-catalog.js
  • 30. API - Cinema Catalog app.get('/cinemas/:cinema/movies', (req, res, next) => { repository.getMoviesByCinemaId(req.params.cinema, (err, movies) => { if(err) return next(err); res.json(movies) }); }) cinema-catalog.js
  • 31. API - Cinema Catalog app.get('/cinemas/:cinema/movies/:movie', (req, res, next) => { repository.getMovieSessionsByCinemaId(req.params.movie , req.params.cinema, (err, sessions) => { if(err) return next(err); res.json(sessions) }); }) cinema-catalog.js
  • 32. API - Cinema Catalog const test = require('tape'); const supertest = require('supertest'); const movies = require('./cinema-catalog'); const server = require("../server/server"); const repository = require("../repository/repository"); function runTests(){ //run tests here } module.exports = { runTests } cinema-catalog.test.js
  • 33. API - Cinema Catalog var app = null; server.start(movies, repository, (err, app) => { var cityId = null; var movieId = null; var cinemaId = null; //test cases }) repository.disconnect(); server.stop(); cinema-catalog.test.js
  • 34. API - Cinema Catalog test('GET /cities', (t) => { supertest(app) .get('/cities') .expect('Content-Type', /json/) .expect(200) .end((err, res) =>{ if(res.body && res.body.length > 0) cityId = res.body[1]._id; t.error(err, 'No errors') t.assert(res.body && res.body.length > 0, "All Cities returned") t.end() }) }) cinema-catalog.test.js
  • 35. API - Cinema Catalog test('GET /cities/:city/movies', (t) => { supertest(app) .get('/cities/' + cityId + "/movies") .expect('Content-Type', /json/) .expect(200) .end((err, res) =>{ if(res.body && res.body.length > 0) movieId = res.body[0].idFilme; t.error(err, 'No errors') t.assert(res.body, "Movies By City Id returned") t.end() }) }) cinema-catalog.test.js
  • 36. API - Cinema Catalog test('GET /cities/:city/movies/:movie', (t) => { supertest(app) .get('/cities/' + cityId + '/movies/' + movieId) .expect('Content-Type', /json/) .expect(200) .end((err, res) =>{ if(res.body && res.body.length > 0) cinemaId = res.body[0].idCinema; t.error(err, 'No errors') t.assert(res.body && res.body.length > 0, "Movie Sessions by City Id returned") t.end() }) }) cinema-catalog.test.js
  • 37. API - Cinema Catalog test('GET /cities/:city/cinemas', (t) => { supertest(app) .get('/cities/' + cityId + '/cinemas') .expect('Content-Type', /json/) .expect(200) .end((err, res) =>{ t.error(err, 'No errors') t.assert(res.body, "Cinemas By City Id returned") t.end() }) }) cinema-catalog.test.js
  • 38. API - Cinema Catalog test('GET /cinemas/:cinema/movies', (t) => { supertest(app) .get('/cinemas/' + cinemaId + "/movies") .expect('Content-Type', /json/) .expect(200) .end((err, res) =>{ t.error(err, 'No errors') t.assert(res.body, "Movies By Cinema Id returned") t.end() }) }) cinema-catalog.test.js
  • 39. API - Cinema Catalog test('GET /cinemas/:cinema/movies/:movie', (t) => { supertest(app) .get('/cinemas/' + cinemaId + "/movies/" + movieId) .expect('Content-Type', /json/) .expect(200) .end((err, res) =>{ t.error(err, 'No errors') t.assert(res.body, "Movie Sessions By Cinema Id returned") t.end() }) }) cinema-catalog.test.js
  • 40. API - Cinema Catalog require("dotenv-safe").load(); require("./config/mongodb.test").runTests(); require("./server/server.test").runTests(); require("./repository/repository.test").runTests(); require("./api/cinema-catalog.test").runTests(); index.test.js
  • 41. API - Cinema Catalog
  • 43. Index - Cinema Catalog require("dotenv-safe").load(); const cinemaCatalog = require('./api/cinema-catalog'); const server = require("./server/server"); const repository = require("./repository/repository"); server.start(cinemaCatalog, repository, (err, app) => { console.log("just started"); }); index.js
  • 44. Index - Cinema Catalog
  • 47. 1 Adicione outra função no microservice 2 Aplique validação de entrada de dados 3 Adicione o restante do CRUD ao microservice