Manoel Quirino Neto
Segundo Meetup paraiba.js
Front-End na Soda virtual.
GitHub /manoelneto
Twitter @manoel_n
É um framework MVC escrito em cima do express.js bem parecido com o rails.
Utilizar waterline
Restfull
Socket.io
Perfeito para quem quer criar uma api rapida de teste.
sudo npm -g install sails
sails new sailsparaibajs cd sailsparaibajs sails lift
primeiro vamos criar um modelo e o controller de Person
sails generate Person
Create
POST http://127.0.0.1:1337/person { "name": "Manoel", "idade": "21", "sexo": "masculino" }
Retrieve
GET http://127.0.0.1:1337/person GET http://127.0.0.1:1337/person/1
Update
PUT http://127.0.0.1:1337/person/1 { "cargo": "Desenvolvedor Web", "idade": "22" }
Delete
DELETE http://127.0.0.1:1337/person/1
Agora que vimos o CRUD, vamos ver o MVC
api/models/
Ex: api/models/Cerveja.js
module.exports = { attributes: { name: { type: 'string', required: true }, category: { type: 'string', defaultsTo: 'sem categoria' }, price : { type: 'integer', max: 100 } } }
Veja que você pode setar validadores nos atributos, como também um
valor default caso o campo não for enviado.
api/controllers/
Ex: api/controller/CervejaController.js
module.exports = { }
Para a api RESTFull funcionar, é necessário criar um arquivo com o mesmo nome do modelo, seguido de Controller.js.
views/NOME_DO_CONTROLLER_SEM_CONTROLLER_E_MINUSCULO/FILE.ejs
Ex: views/cerveja/listagem.ejs
Listagem de cervejas <ul>
<% _.each(cervejas, function(cerveja){ %>
<li>
<p>Nome: <%= cerveja.name %></p>
<% if (cerveja.price) { %>
<p>Preço: <%= cerveja.price %></p>
<% } %>
<p>Categoria: <%= cerveja.category %></p>
</li>
<% }) %>
</ul>
E rota customizável?
config/routes.js
Ex: views/cerveja/listagem.ejs
'/listagem' : { controller : 'CervejaController', action : 'listagem' } '/': { view: 'user/signup' }, 'post /': 'UserController.createUser', '/': 'MessageController.inbox',
config.controllers.blueprints.actions = true
Rota dinamicamente ligada as controllers
`CervejaController.index` ::::::::::::::::::::::::::::::::::::::::::::::::::::::: `GET /cerveja/:id?` `GET /cerveja/index/:id?` `POST /cerveja/:id?` `POST /cerveja/index/:id?` `PUT /cerveja/:id?` `PUT /cerveja/index/:id?` `DELETE /cerveja/:id?` `DELETE /cerveja/index/:id? `CervejaController.show` ::::::::::::::::::::::::::::::::::::::::::::::::::::::: `GET /cerveja/show/:id?` `POST /cerveja/show/:id?` `PUT /cerveja/show/:id?` `DELETE /cerveja/show/:id?
Mesmo arquivo api/controller/CervejaController.js
module.exports = { listagem : function(req, res) { Cerveja.find().done(function(err, cervejas){ if (err) { res.view({message: 'Deu erro, oh =x'}); } return res.view({cervejas: cervejas}); }); } }
Por padrão, tudo pode ser acessado sem autenticação.
Mas a vida, é uma caixinha de surpresas e numa bela manhã de sol, seu chefe diz: bota uma senha pra acessar isso daqui ...
E agora?
config/policies
Uma middleware para suas views. Só chega na view se você quiser!!!!!
Policies ficam no diretório api/pollicies
# config/policies.js # A action listagem do controller CervejaController vai passar pela middleware soManoel CervejaController : { listagem : 'soManoel' }
# api/policies/soManoel var url = require('url'); module.exports = function(req, res, next) { var url_parts = url.parse(req.url, true); var query = url_parts.query; if ( query.usuario !== 'manoel' ) { return res.forbidden('Você não é Manoel. Se manda.'); } next(); }
Socket.io por padrão
Cada ação no model (CRUD) é mandado uma messagem aos sockets connectados
var socket = io.connect(); angular.module('cerveja', []) .controller('CervejaController', function($scope){ $scope.msg = 'carregando as cervejas'; socket.on('connect', function(){ socket.get('/cerveja', function(cervejas){ $scope.msg = 'Cervejas carregadas'; $scope.cervejas = cervejas; $scope.$apply(); }); socket.on('message', function(message){ if ( message.model == 'cerveja' ) { if ( message.verb == 'create' ) { $scope.msg = 'Cervejas adicionada'; $scope.cervejas.push(message.data); $scope.$apply(); } } }); }); });