Node.js e
MongoDB
http://www.luiztools.com.br
MongoDB - Movies
Server - Movies
Api - Movies
Index - Movies
CRONOGRAMA
MongoDB -
Movies
MongoDB - Movies
nano /cinema-microservice/movies-
service/src/repository/repository.js
nano /cinema-microservice/movies-
service/src/repository/repository.test.js
Repositório
MongoDB - Movies
const mongodb = require("../config/mongodb");
function getAllMovies(callback){
mongodb.connect((err, db) => {
db.collection("movies").find().toArray(callback);
})
}
repository.js
MongoDB - Movies
function getMovieById(id, callback){
mongodb.connect((err, db) => {
db.collection("movies").findOne({_id:
require("mongodb").ObjectId(id)}, callback);
});
}
repository.js
MongoDB - Movies
function getMoviePremiers(callback){
var monthAgo = new Date();
monthAgo.setMonth(monthAgo.getMonth() - 1);
monthAgo.setHours(0, 0, 0);
monthAgo.setMilliseconds(0);
mongodb.connect((err, db) => {
db.collection("movies").find({ dataLancamento: {
$gte: monthAgo } }).toArray(callback);
});
}
repository.js
MongoDB - Movies
function disconnect(){
return mongodb.disconnect();
}
module.exports = { getAllMovies, getMovieById,
getMoviePremiers, disconnect }
repository.js
MongoDB - Movies
const test = require('tape');
const repository = require('./repository');
function runTests(){
var id = null;
//tests here
}
module.exports = { runTests }
repository.test.js
MongoDB - Movies
var id = null;
test('Repository GetAllMovies', (t) => {
repository.getAllMovies((err, movies) => {
if(movies && movies.length > 0) id =
movies[0]._id;
t.assert(!err && movies && movies.length > 0,
"All Movies Returned");
t.end();
});
})
repository.test.js
MongoDB - Movies
test('Repository GetMovieById', (t) => {
if(!id) {
t.assert(false, "Movie by Id Returned");
t.end();
return;
}
repository.getMovieById(id, (err, movie) => {
t.assert(!err && movie, "Movie by Id
Returned");
t.end();
});
})
repository.test.js
MongoDB - Movies
test('Repository GetMoviePremiers', (t) => {
repository.getMoviePremiers((err, movies) => {
t.assert(!err && movies && movies.length > 0,
"Movie Premiers Returned");
t.end();
});
})
repository.test.js
MongoDB - Movies
test('Repository Disconnect', (t) => {
t.assert(repository.disconnect(), "Disconnect
Ok");
t.end();
})
repository.test.js
MongoDB - Movies
require("dotenv-safe").load();
require("./config/mongodb.test").runTests();
require("./repository/repository.test").runTests();
index.test.js
MongoDB - Movies
Server -
Movies
Server - Movies
nano /cinema-microservice/movies-
service/src/server/server.js
const express = require('express');
const morgan = require('morgan');
const helmet = require('helmet');
var server = null;
server.js
Server - Movies
function start(api, repository, callback){
const app = express();
app.use(morgan('dev'));
app.use(helmet());
app.use((err, req, res, next) => {
callback(new Error('Something went wrong!, err:' +
err), null);
res.status(500).send('Something went wrong!');
})
api(app, repository);
server = app.listen(parseInt(process.env.PORT), () =>
callback(null, server));
}
server.js
Server - Movies
function stop(){
if(server) server.close();
return true;
}
module.exports = { start, stop }
server.js
Server - Movies
nano /cinema-microservice/movies-
service/src/server/server.test.js
server.test.js
Server - Movies
const test = require('tape');
const server = require('./server');
function apiMock(app, repo){
console.log("do nothing");
}
function runTests(){
//tests here
}
module.exports = { runTests }
server.test.js
Server - Movies
test('Server Start', (t) => {
server.start(apiMock, null, (err, srv) => {
t.assert(!err && srv, "Server started");
t.end();
});
})
test('Server Stop', (t) => {
t.assert(server.stop(), "Server stopped");
t.end();
})
server.test.js
Tape
API -
Movies
API - Movies
nano /cinema-microservice/movies-
service/src/api/movies.js
movies.js
API - Movies
module.exports = (app, repository) => {
app.get('/movies', (req, res, next) => {
repository.getAllMovies((err, movies) => {
if(err) return next(err);
res.json(movies);
});
})
movies.js
API - Movies
app.get('/movies/premieres', (req, res, next) => {
repository.getMoviePremiers((err, movies) => {
if(err) return next(err);
res.json(movies)
});
})
movies.js
API - Movies
app.get('/movies/:id', (req, res, next) => {
repository.getMovieById(req.params.id, (err, movie)
=> {
if(err) return next(err);
res.json(movie)
});
})
}
movies.js
Server - Movies
npm install supertest
nano /cinema-microservice/movies-
service/src/api/movies.test.js
movies.test.js
Server - Movies
npm install supertest
nano /cinema-microservice/movies-
service/src/api/movies.test.js
const test = require('tape');
const supertest = require('supertest');
const movies = require('./movies');
const server = require("../server/server");
const repository = require("../repository/repository");
movies.test.js
Server - Movies
function runTests(){
var app = null;
server.start(movies, repository, (err, app) => {
//tests here
server.stop();
})
}
module.exports = { runTests }
movies.test.js
Server - Movies
var id = null;
test('GET /movies', (t) => {
supertest(app)
.get('/movies')
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) =>{
if(res.body && res.body.length > 0)
id = res.body[0]._id;
t.assert(res.body && res.body.length > 0,
"All Movies returned")
t.end()
})
})
movies.test.js
Server - Movies
test('GET /movies/:id', (t) => {
if(!id) {
t.assert(false, "Movie by Id Returned");
t.end();
return;
}
supertest(app)
.get('/movies/' + id)
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) =>{
t.assert(res.body, "Movies By Idreturned")
t.end()
})
})
movies.test.js
Server - Movies
test('GET /movies/premieres', (t) => {
supertest(app)
.get('/movies/premieres')
.expect('Content-Type', /json/)
.expect(200)
.end((err, res) =>{
t.assert(res.body && res.body.length
> 0, "Premiere Movies returned")
t.end()
})
})
movies.test.js
Server - Movies
Index -
Movies
Index - Movies
nano /cinema-microservice/movies-service/src/index.js
require("dotenv-safe").load();
const movies = require('./api/movies');
const server = require("./server/server");
const repository = require("./repository/repository");
server.start(movies, repository, (err, app) => {
console.log("just started");
});
index.js
Index - Movies
Dúvidas?
Exercícios
1 Adicione busca por nome no microservice
2 Adicione paginação no getAllMovies
3 Adicione o restante do CRUD ao microservice
Obrigado!

Curso de Node.js e MongoDB - 16

  • 1.
  • 2.
    MongoDB - Movies Server- Movies Api - Movies Index - Movies CRONOGRAMA
  • 3.
  • 4.
    MongoDB - Movies nano/cinema-microservice/movies- service/src/repository/repository.js nano /cinema-microservice/movies- service/src/repository/repository.test.js Repositório
  • 5.
    MongoDB - Movies constmongodb = require("../config/mongodb"); function getAllMovies(callback){ mongodb.connect((err, db) => { db.collection("movies").find().toArray(callback); }) } repository.js
  • 6.
    MongoDB - Movies functiongetMovieById(id, callback){ mongodb.connect((err, db) => { db.collection("movies").findOne({_id: require("mongodb").ObjectId(id)}, callback); }); } repository.js
  • 7.
    MongoDB - Movies functiongetMoviePremiers(callback){ var monthAgo = new Date(); monthAgo.setMonth(monthAgo.getMonth() - 1); monthAgo.setHours(0, 0, 0); monthAgo.setMilliseconds(0); mongodb.connect((err, db) => { db.collection("movies").find({ dataLancamento: { $gte: monthAgo } }).toArray(callback); }); } repository.js
  • 8.
    MongoDB - Movies functiondisconnect(){ return mongodb.disconnect(); } module.exports = { getAllMovies, getMovieById, getMoviePremiers, disconnect } repository.js
  • 9.
    MongoDB - Movies consttest = require('tape'); const repository = require('./repository'); function runTests(){ var id = null; //tests here } module.exports = { runTests } repository.test.js
  • 10.
    MongoDB - Movies varid = null; test('Repository GetAllMovies', (t) => { repository.getAllMovies((err, movies) => { if(movies && movies.length > 0) id = movies[0]._id; t.assert(!err && movies && movies.length > 0, "All Movies Returned"); t.end(); }); }) repository.test.js
  • 11.
    MongoDB - Movies test('RepositoryGetMovieById', (t) => { if(!id) { t.assert(false, "Movie by Id Returned"); t.end(); return; } repository.getMovieById(id, (err, movie) => { t.assert(!err && movie, "Movie by Id Returned"); t.end(); }); }) repository.test.js
  • 12.
    MongoDB - Movies test('RepositoryGetMoviePremiers', (t) => { repository.getMoviePremiers((err, movies) => { t.assert(!err && movies && movies.length > 0, "Movie Premiers Returned"); t.end(); }); }) repository.test.js
  • 13.
    MongoDB - Movies test('RepositoryDisconnect', (t) => { t.assert(repository.disconnect(), "Disconnect Ok"); t.end(); }) repository.test.js
  • 14.
  • 15.
  • 16.
  • 17.
    Server - Movies nano/cinema-microservice/movies- service/src/server/server.js const express = require('express'); const morgan = require('morgan'); const helmet = require('helmet'); var server = null; server.js
  • 18.
    Server - Movies functionstart(api, repository, callback){ const app = express(); app.use(morgan('dev')); app.use(helmet()); app.use((err, req, res, next) => { callback(new Error('Something went wrong!, err:' + err), null); res.status(500).send('Something went wrong!'); }) api(app, repository); server = app.listen(parseInt(process.env.PORT), () => callback(null, server)); } server.js
  • 19.
    Server - Movies functionstop(){ if(server) server.close(); return true; } module.exports = { start, stop } server.js
  • 20.
    Server - Movies nano/cinema-microservice/movies- service/src/server/server.test.js server.test.js
  • 21.
    Server - Movies consttest = require('tape'); const server = require('./server'); function apiMock(app, repo){ console.log("do nothing"); } function runTests(){ //tests here } module.exports = { runTests } server.test.js
  • 22.
    Server - Movies test('ServerStart', (t) => { server.start(apiMock, null, (err, srv) => { t.assert(!err && srv, "Server started"); t.end(); }); }) test('Server Stop', (t) => { t.assert(server.stop(), "Server stopped"); t.end(); }) server.test.js
  • 23.
  • 24.
  • 25.
    API - Movies nano/cinema-microservice/movies- service/src/api/movies.js movies.js
  • 26.
    API - Movies module.exports= (app, repository) => { app.get('/movies', (req, res, next) => { repository.getAllMovies((err, movies) => { if(err) return next(err); res.json(movies); }); }) movies.js
  • 27.
    API - Movies app.get('/movies/premieres',(req, res, next) => { repository.getMoviePremiers((err, movies) => { if(err) return next(err); res.json(movies) }); }) movies.js
  • 28.
    API - Movies app.get('/movies/:id',(req, res, next) => { repository.getMovieById(req.params.id, (err, movie) => { if(err) return next(err); res.json(movie) }); }) } movies.js
  • 29.
    Server - Movies npminstall supertest nano /cinema-microservice/movies- service/src/api/movies.test.js movies.test.js
  • 30.
    Server - Movies npminstall supertest nano /cinema-microservice/movies- service/src/api/movies.test.js const test = require('tape'); const supertest = require('supertest'); const movies = require('./movies'); const server = require("../server/server"); const repository = require("../repository/repository"); movies.test.js
  • 31.
    Server - Movies functionrunTests(){ var app = null; server.start(movies, repository, (err, app) => { //tests here server.stop(); }) } module.exports = { runTests } movies.test.js
  • 32.
    Server - Movies varid = null; test('GET /movies', (t) => { supertest(app) .get('/movies') .expect('Content-Type', /json/) .expect(200) .end((err, res) =>{ if(res.body && res.body.length > 0) id = res.body[0]._id; t.assert(res.body && res.body.length > 0, "All Movies returned") t.end() }) }) movies.test.js
  • 33.
    Server - Movies test('GET/movies/:id', (t) => { if(!id) { t.assert(false, "Movie by Id Returned"); t.end(); return; } supertest(app) .get('/movies/' + id) .expect('Content-Type', /json/) .expect(200) .end((err, res) =>{ t.assert(res.body, "Movies By Idreturned") t.end() }) }) movies.test.js
  • 34.
    Server - Movies test('GET/movies/premieres', (t) => { supertest(app) .get('/movies/premieres') .expect('Content-Type', /json/) .expect(200) .end((err, res) =>{ t.assert(res.body && res.body.length > 0, "Premiere Movies returned") t.end() }) }) movies.test.js
  • 35.
  • 36.
  • 37.
    Index - Movies nano/cinema-microservice/movies-service/src/index.js require("dotenv-safe").load(); const movies = require('./api/movies'); const server = require("./server/server"); const repository = require("./repository/repository"); server.start(movies, repository, (err, app) => { console.log("just started"); }); index.js
  • 38.
  • 39.
  • 40.
  • 41.
    1 Adicione buscapor nome no microservice 2 Adicione paginação no getAllMovies 3 Adicione o restante do CRUD ao microservice
  • 42.