CRUD API Restful Express e Mongo DB [parte 2]

Antes de começar, tecle CTR+C para parar o serviço do express e continuarmos nossa implementação. 

Vamos criar um arquivo chamado Produto.js com o seguinte conteúdo:

   const restful = require('node-restful');
   const mongooseRestful = restful.mongoose;
    
    const categoria = new mongooseRestful.Schema({
       name: {
           type: String,
           required: 'Nome obrigatório.'
       },
       status: {
               type:String,
               required: 'status obrigatório.', 
               uppercase:true, 
               enum:['ATIVO','INATIVO']
       },
       created: {
           type: Date,
           default: Date.now
       }
    });
    
    const produto = new mongooseRestful.Schema({
       nome: {
           type:String, 
           required:'Nome obrigatório'
       },
       ano_fabricacao:{
           type: Number, 
           min:1, 
           max:12, 
           required:'ano de fabricação obrigatório'
       },
       status:{
           type:String,
           required: 'status obrigatório', 
           uppercase:true, 
           enum:['ATIVO','INATIVO']
       },
       categoria:[categoria]
    });
    
    module.exports = restful.model('Produto',produto);

Esse arquivo corresponde ao modelo de dados que vamos implementar o CRUD. Feito isso vamos criar um outro arquivo chamado ProdutoService.js com seguinte conteúdo:

   const produto = require('./Produto');
   
   produto.methods(['get','post','put','delete']);
   //quando faz update, garante de vai retornar o objeto novo (que foi atualizado) e não o antigo
   produto.updateOptions({new:true}, runValidators: true);
   
   module.exports = produto;

Nesse arquivo definimos os verbos http que nossa api vai responder. Note que usamos o mesmo objeto que foi criado no Produto.js

Por fim vamos implementar nossa rota criando outro arquivo chamado routes.js:

   const express = require('express');
   
   //constante server vem como parametro do arquivo index.js
   module.exports = function(server){
       //url base para todas as rotas
       const router = express.Router();
       server.use('/api',router);
       
       //Rotas relacionadas ao produto
       const produtoService = require('./ProdutoService');
       produtoService.register(router,'/produto');
   }

O module.exports recebe a constante server como parâmetro. Essa constante foi criada no arquivo index.js. Agora vamos no arquivo index.js e fazer um require da rota passando como parâmetro a constante server. O arquivo index.js deve ficar assim:

   const port = 3000;
    
    const bodyParser = require('body-parser');
    const express = require('express');
    
    const server = express();
    
    server.use(bodyParser.urlencoded({extended: true}));
    server.use(bodyParser.json());
    
    server.listen(port,function(){
              console.log(`Rodando na porta ${port}`);
    });
    
    //configurações mongoose
    const mongoose = require('mongoose');
    mongoose.Promise = global.Promise;
    module.exports = mongoose.connect('mongodb://localhost/db_teste');
   
    mongoose.Error.messages.Number.min = "O '{VALUE}' informado é menor que o limite mínimo de '{MIN}'";
    mongoose.Error.messages.Number.max = "O '{VALUE}' informado é maior que o limite mínimo de '{MAX}'";
    mongoose.Error.messages.String.enum = "'{VALUE}' não é válido para o atributo '{PATH}'";
    
    //constante server é passada como parametro para routes
    require('./routes')(server);

Tudo pronto. Agora vamos subir o express novamente e testar nossa API. Vou usar postman (Plugin do google chrome) mas se quiser pode usar outra de sua preferência.

Primeira requisição que vamos testar é localhost:3000/api/produto do tipo GET:

Imagem

Status 200 OK. Como ainda não temos registro gravado, retornou um objeto vazio. Beleza! tudo certo. Agora vamos inserir um registro pelo método POST:

Imagem

Depois que enviar a requisição, o valor inserido é retornado no body:

Imagem

Vamos enviar sem nome para testar a validação:

Imagem

Beleza! tudo certo. Testando agora update pelo método PUT. Primeiro vamos colocar no final da URL /:id e depois clicar em params:

Imagem

e adicionar o parametro id com valor do id do produto:

Imagem

Ao clicar em send, é retornado o objeto alterado:

Imagem

Da mesma forma, vamos testar o método DELETE:

Imagem

Nesse caso retornou 204 (No content). Vamos conferir se excluiu pelo método GET:

Imagem

Tudo certo. Como só tinha um registro e o mesmo foi excluído, agora retorna objeto vazio no método GET.

Segue o projeto finalizado para download. Basta baixar e executar npm i para instalar as dependências.

 

Comentários

 

Quem Sou

Graduado em ADS (Análise e desenvolvimento de sistemas).

Não sou "devoto" de nenhuma linguagem de programação. Procuro aproveitar o melhor de cada uma de acordo com a necessidade do projeto. Prezo por uma arquitetura bem feita, código limpo, puro e simples! 

anuncio atendente