Você está na página 1de 48

http://www.luiztools.com.

br

Node.js e
MongoDB
CRONOGRAMA
Repositório
Api - Cinema-Catalog
Index - Cinema-Catalog
Repositóri
o
Repositório

Funcionalidades
● 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;
Repositório

repository.js

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);
})
}
Repositório

repository.js

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);
});
});
}
Repositório

repository.js

function disconnect(){
return mongodb.disconnect();
}

module.exports = { getAllCities, getCinemasByCityId, disconnect }


Repositório

repository.test.js
const test = require('tape');
const repository = require('./repository');

function runTests(){
var cityId = null;
var cinemaId = null;
var movieId = null;

//tests here
}

module.exports = { runTests }
Repositório

repository.test.js
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();
});
})
Repositório

repository.test.js
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();
});
})
Repositório

repository.test.js
test('Repository Disconnect', (t) => {
t.assert(repository.disconnect(), "Disconnect Ok");
t.end();
})
}
Repositório

index.test.js
require("dotenv-safe").load();
require("./config/mongodb.test").runTests();
require("./server/server.test").runTests();
require("./repository/repository.test").runTests();
Repositório
Repositório

repository.js
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);
});
}
Repositório

repository.js
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 }
} )); }); });
}
Repositório

repository.js
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 } } )); }); });
}
Repositório

repository.js
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 } } )); }); });
}
Repositório

repository.js
module.exports = {
getAllCities,
getCinemasByCityId,
getMoviesByCityId,
getMoviesByCinemaId,
getMovieSessionsByCityId,
getMovieSessionsByCinemaId, disconnect
}
Repositório

repository.test.js
test('Repository getMoviesByCinemaId', (t) => {
repository.getMoviesByCinemaId(cinemaId, (err, movies)
=> {
t.assert(!err && movies && movies.length > 0, "Movies By
Cinema Id Returned");
t.end();
});
})
Repositório

repository.test.js
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();
});
})
Repositório

repository.test.js
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();
});
})
Repositório

repository.test.js
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();
});
})
Repositório
API -
Cinema
Catalog
API - Cinema Catalog

Estrutura
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;
API - Cinema Catalog

cinema-catalog.js
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


}
API - Cinema Catalog

cinema-catalog.js
app.get('/cities/:city/movies', (req, res, next) => {
repository.getMoviesByCityId(req.params.city, (err, movies)
=> {
if(err) return next(err);
res.json(movies)
});
})
API - Cinema Catalog

cinema-catalog.js
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)
});
})
API - Cinema Catalog

cinema-catalog.js
app.get('/cities/:city/cinemas', (req, res, next) => {
repository.getCinemasByCityId(req.params.city, (err,
cinemas) => {
if(err) return next(err);
res.json(cinemas)
});
})
API - Cinema Catalog

cinema-catalog.js
app.get('/cinemas/:cinema/movies', (req, res, next) => {
repository.getMoviesByCinemaId(req.params.cinema, (err,
movies) => {
if(err) return next(err);
res.json(movies)
});
})
API - Cinema Catalog

cinema-catalog.js
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)
});
})
API - Cinema Catalog

cinema-catalog.test.js
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 }
API - Cinema Catalog

cinema-catalog.test.js
var app = null;
server.start(movies, repository, (err, app) => {
var cityId = null;
var movieId = null;
var cinemaId = null;

//test cases
})
repository.disconnect();
server.stop();
API - Cinema Catalog

cinema-catalog.test.js
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()
})
})
API - Cinema Catalog

cinema-catalog.test.js
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()
})
})
API - Cinema Catalog

cinema-catalog.test.js
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()
})
})
API - Cinema Catalog

cinema-catalog.test.js
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()
})
})
API - Cinema Catalog

cinema-catalog.test.js
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()
})
})
API - Cinema Catalog

cinema-catalog.test.js
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()
})
})
API - Cinema Catalog

index.test.js
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();
API - Cinema Catalog
Index -
Cinema
Catalog
Index - Cinema Catalog

index.js
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 - 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!