sistema, então iremos criá-lo dentro de views/exit.ejs:
<section>
<a href='/sair'>Sair</a>
</section>
Agora vamos criar o seu controller chamado de contatos.js, contendo ape-
nas a action index. Ele basicamente vai pegar os dados de um usuário logado atra-
vés da variável req.session.usuario e vai enviá-los para view através da função:
res.render().
module.exports = function(app) {
var ContatoController = {
index: function(req, res) {
var usuario = req.session.usuario
, params = {usuario: usuario};
res.render('contatos/index', params);
}
}
return ContatoController;
};
Para finalizar, criaremos um novo routes, por convenção, utilizamos o mesmo
nome do seu controller e por enquanto, vamos incluir a rota GET com o path:
/contatos.
48
Casa do Código
Capítulo 5. Dominando o Express
module.exports = function(app) {
var contatos = app.controllers.contatos;
app.get('/contatos', contatos.index);
};
Vamos testar novamente? Reinicie o servidor teclando no terminal CTRL+C
(no Windows ou Linux) ou Command+C (no MacOSX), em seguida execute node
app.js, por último acesse em seu browser: http://localhost:3000 . Faça novamente
um login no sistema, dessa vez temos uma nova tela no sistema, a agenda de contatos.
Acabamos de expandir nosso projeto, incluímos a área principal. Aprendemos
como habilitar session para implementar um controle de login e logout. Deixamos
todas as
views enxutas, isolando possíveis trechos de repetição de código html, além
explorarmos novos itens da stack de configuração do servidor Node.
5.3
Criando rotas no padrão REST
A nossa agenda de contatos precisa ter como requisito mínimo um meio de permi-
tir o usuário criar, listar, atualizar e excluir contatos. Esse é o conjunto clássico de funcionalidades, mais conhecido como CRUD (Create, Receive, Update e Delete).
As rotas que utilizaremos para implementar o CRUD da agenda de contatos será
aplicando o padrão de rotas REST. Esse padrão consiste em criar rotas utilizando os
principais métodos do HTTP (GET, POST, PUT e DELETE). Para isso teremos
que habilitar um novo item na stack de configurações no app.js:
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.cookieParser('ntalk'));
app.use(express.session());
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
Incluímos o express.methodOverride() que permite utilizar um mesmo
path entre os métodos do HTTP, fazendo uma sobrescrita de métodos. Também foi
adicionado o middleware app.router, que gerencia as rotas da aplicação, permi-
tindo a implementação de rotas para páginas de erros (muita calma! Isso ainda será
49
5.3. Criando rotas no padrão REST
Casa do Código
explicado neste capítulo.) e rotas para arquivos estáticos, sem conflitar com as rotas da aplicação.
Abra o arquivo routes/contatos.js, nele vamos implementar as futuras
rotas para implementar o CRUD da agenda de contatos:
module.exports = function(app) {
var contatos = app.controllers.contatos;
app.get('/contatos', contatos.index);
app.get('/contato/:id', contatos.show);
app.post('/contato', contatos.create);
app.get('/contato/:id/editar', contatos.edit);
app.put('/contato/:id', contatos.update);
app.del('/contato/:id', contatos.destroy);
};
Com as rotas criadas, precisamos agora implementar as regras de negócio den-
tro do controller contatos.js. Como ainda não utilizaremos um banco de da-
dos, todos os dados serão persistidos na própria sessão do usuário, ou seja, todos os
contatos serão gravados em memória e não em um banco de dados dedicado. Em
controller/contatos.js implemente a seguinte lógica na action index:
module.exports = function(app) {
var ContatoController = {
index: function(req, res) {
var usuario = req.session.usuario
, contatos = usuario.contatos
, params = {usuario: usuario
, contatos: contatos};
res.render('contatos/index', params);
},
// continuação do controller...
}
Já na action create utilizaremos um simples array para persistir os contatos do
usuário usuario.contatos.push(contato); para em seguida redireci-
onar o usuário para rota /contatos:
create: function(req, res) {
var contato = req.body.contato
, usuario = req.session.usuario;
usuario.contatos.push(contato);
50
Casa do Código
Capítulo 5. Dominando o Express
res.redirect('/contatos');
},
// continuação do controller...
Em
show e
edit enviamos via parâmetro no path, o ID do usuário.
Neste caso, passamos apenas o índice do contato referente a sua posição no ar-
ray e em seguida enviamos o contato para a renderização de sua respectiva view
res.render('contatos/show') e res.render('contatos/edit');:
show: function(req, res) {
var id = req.params.id
, contato = req.session.usuario.contatos[id]
, params = {contato: contato, id: id};
res.render('contatos/show', params);
},
edit: function(req, res) {
var id = req.params.id
, usuario = req.session.usuario