Adrian Mejia Novatec
Copyright Packt Publishing 2015. First published in the English language under the title Building an E-Commerce Application with MEAN (9781785286551) Copyright Packt Publishing 2015. Publicação original em inglês intitulada Building an E-Commerce Application with MEAN (9781785286551) Esta tradução é publicada e vendida com a permissão da Packt Publishing. Novatec Editora Ltda. 2016. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates PY20160606 Tradução: Henrique Cesar Ulbrich Assistente editorial: Priscila Yoshimatsu Revisão gramatical: Sandro Andretta Editoração eletrônica: Carolina Kuwabata ISBN: 978-85-7522-509-7 Histórico de impressões: Junho/2016 Primeira edição Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 São Paulo, SP Brasil Tel.: +55 11 2959-6529 E-mail: novatec@novatec.com.br Site: novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec
Sumário Sobre o autor...11 Sobre os revisores...12 Prefácio...13 Capítulo 1 Fundamentos do MEAN...18 Introdução ao MEAN...19 NodeJS...21 ExpressJS...21 MongoDB...21 AngularJS... 22 Instalando os componentes do MEAN... 22 Instalando o NodeJS... 22 Instalando o ExpressJS... 23 Instalando o MongoDB... 23 Instalando o AngularJS...24 Depurador do AngularJS...26 Entendendo a estrutura do projeto...26 Estrutura de arquivos...27 Componentes... 28 Testes... 28 Ferramentas...29 Instaladores de pacotes de software...30 Pacotes do Bower...30 Aplicação exemplo de e-commerce...31 Capa...31 Catálogo...32 Administração...33 Entendendo os requisitos das aplicações de e-commerce...35 Produto Minimamente Viável para um site de e-commerce...35 Definindo os requisitos...35 Resumo...37 5
6 Construindo uma Aplicação E-commerce com MEAN Capítulo 2 Construindo uma frente de loja com o AngularJS...38 Entendendo o AngularJS e a estrutura de pastas do cliente...39 Estrutura no lado do cliente... 40 Diretivas...41 Módulos...42 Roteamento no AngularUI...43 Controladores e escopos...45 Templates... 46 Criando o layout do MVP de nosso e-commerce...47 Produtos...47 Fábricas e serviços...49 Criando a fábrica de produtos...49 Criando um catálogo...50 Filtros...52 Administrando produtos (com CRUD)...52 Serviços...52 Controladores...55 Rotas...56 Templates...58 Formulários parciais...58 Novo produto...59 Editar produto... 60 Visão do produto... 60 Lista de produtos...61 Estilo da página principal...62 Resumo... 64 Capítulo 3 Construindo um banco de dados flexível com o MongoDB...65 Entendendo o MongoDB... 66 MongoDB: daemons e CLI... 66 MongoDB para quem vem do SQL...67 Conceitos básicos...67 Buscas (queries)...67 Agregadores...68 Implementando CRUD com o Mongoose...69 Schemas...69 Criar (create)...71 Ler (read)...72 Atualizar (update)...73 Apagar (delete)...74
Sumário 7 Mongoose: recursos avançados...74 Métodos de instância...74 Métodos estáticos...75 Virtuais...75 Validações...76 Validação nativa...76 Validações personalizadas...76 Middleware... 77 Revisando modelos e a estrutura no servidor...78 Pasta server...78 Modelos atuais do Mongoose...79 Módulos CommonJS... 80 Modelo user...81 Resumo... 84 Capítulo 4 Criando uma API RESTful com NodeJS e ExpressJS...85 Fundamentos do REST... 86 Criando um esqueleto de API RESTful...87 Inicializando o ExpressJS...87 Entendendo as rotas do ExpressJS... 90 Testes, TDD, BDD e NodeJS...92 Criando o modelo de produtos...93 Testando o modelo de produtos... 94 Implementação do modelo de produtos...95 Implementando a API de produtos...95 Testando a API... 96 Teste das ações de índice... 96 Teste das ações de exibição... 96 Testes das ações de criação...97 Testes das ações de apagamento...97 Controlador de produtos...97 Resumo...97 Capítulo 5 Conectando o AngularJS à API REST do ExpressJS...98 Implementando um serviço de produtos RESTful...98 Montando o catálogo de produtos...100 Conectando o controlador de produtos aos novos métodos RESTful...100 Enviando imagens de produtos...102 Upload de arquivos no Angular...102 Upload de arquivos no Node...106
8 Construindo uma Aplicação E-commerce com MEAN Semeando produtos...108 Testando APIs RESTful no AngularJS...109 Teste de unidades...110 ngmock...110 Configurando os testes...110 Entendendo os testes de Serviços...111 Testando todos os métodos $resource...111 Testando o controlador de produtos...112 Testes fim a fim...112 Limpando o banco de dados a cada execução do e2e...113 Resumo...115 Capítulo 6 Gerenciando autenticação e autorização... 116 Fundamentos sobre estratégias de autenticação...116 Autenticação por sessão... 117 Autenticação por token JWT...118 Autenticação OAuth...120 Entendendo a autenticação no cliente...123 Gerenciamento da autenticação...123 Processo de cadastro...126 Entendendo a autenticação no servidor...130 Autenticação com PassportJS...131 Inicializando o PassportJS...131 Modelo do usuário...133 Estratégias e rotas de autenticação...135 Autenticação local...136 Testes fim a fim para a autenticação local...137 Autenticando com Facebook, Google e Twitter...137 Facebook...138 Twitter...140 Google... 141 Resumo...143 Capítulo 7 Fechando a compra e recebendo o pagamento...144 Configurando um carrinho de compras...144 Instalando o ngcart...145 Usando as diretivas do ngcart...146 Inclui ou exclui item do carrinho...146 Resumo da compra até agora... 147 Página de checkout e integração com Braintree...148
Sumário 9 Configurando o Braintree...151 Chaves da API...151 Gateway...152 Controlador...153 Roteamento...154 Criando um pedido...155 Modificando o modelo de pedido...155 Testando o modelo de pedidos...158 Usando a conta sandbox...160 Resumo...160 Capítulo 8 Busca e navegação... 161 Adicionando busca à barra de navegação...161 Categorias de produtos...163 Adicionando um painel lateral...163 Aprimorando os controladores e modelos de produto...166 Controlador e as rotas de Catalog...167 Modelo Catalog...169 Semeando produtos e categorias...170 Funcionalidade de busca e navegação...172 Adicionando os métodos $resource...172 Rotas e controladores...173 Amarrando tudo... 174 Como a navegação funciona no navegador... 174 Como a busca funciona no navegador...175 Resumo... 176 Capítulo 9 Colocando a aplicação de e-commerce em produção...177 Preparando a aplicação para produção...177 Ambientes de aplicação...177 Otimizações para ambientes de produção...178 Escalonamento de aplicações web...179 Escalonamento vertical um servidor...180 Escalonamento horizontal múltiplos servidores...181 Ambiente de computação em nuvem...182 Platform as a Service...183 Heroku...183 Virtual Private Servers e servidores na nuvem...184 Digital Ocean...184
10 Construindo uma Aplicação E-commerce com MEAN Ambiente multisservidor...186 Configurando o servidor de aplicações NodeJS...186 Configurando o servidor web Nginx...188 Testes de resistência...190 Benchmark de HTTP...190 ApacheBench...190 Benchmark da aplicação no Heroku...190 Benchmark de ambientes VPS multisservidores...190 Arquitetura de produção para escalonar o NodeJS...191 Fase 0 um servidor...191 Fase 1 múltiplas instâncias da aplicação no mesmo servidor...191 Fase 2 múltiplos servidores...192 Fase 3 microsserviços...194 Segurança...195 Resumo...195 Capítulo 10 Adicionando recursos personalizados com alta qualidade...196 Planejamento de novos recursos...196 Wireframe...197 Implementando a solução...198 Página HTML...198 Testando o novo recurso...200 Testes no AngularJS...200 Recursos a implementar (backlog)...203 Deploy de novas versões...204 Zero-downtime...204 Configurando um servidor de produção para zero-downtime...205 Fundamentos do Capistrano...205 Instalação do Capistrano...206 Entendendo o Capistrano...206 Preparando o servidor...207 Variáveis do Capistrano...208 Tarefas do Capistrano...209 Novas tarefas...210 Preparação do Nginx...212 Distribuição de carga (load balance)... 214 Servidor de conteúdo estático...215 WebSockets...215 Resumo...215