Escolar Documentos
Profissional Documentos
Cultura Documentos
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
function getAllCities(callback){
mongodb.connect((err, db) => {
db.collection("cinemaCatalog").find({},
{cidade:1,uf:1,pais:1}).toArray(callback);
})
}
Repositório
repository.js
repository.js
function disconnect(){
return mongodb.disconnect();
}
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
repository.test.js
test('Repository getCinemasByCityId', (t) => {
repository.getCinemasByCityId(cityId, (err, cinemas) => {
if(cinemas && cinemas.length > 0) cinemaId =
cinemas[0]._id;
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);
});
})
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");