By Sails.js Tech Brasil

Blueprints
(Alicerces do Desenvolvimento)

Como qualquer bom framework web, o Sails visa reduzir a quantidade de código que você escreve e o tempo necessário para colocar um aplicativo funcional em funcionamento. Blueprints são a maneira da Sails de gerar rapidamente rotas e ações de API com base no design do seu aplicativo.

Juntas, as rotas do blueprint e as ações do blueprint constituem a API do blueprint, a lógica interna que alimenta a API JSON RESTful que você obtém toda vez que cria um modelo e um controlador.

Por exemplo, se você criar um arquivo de modelo User.js em seu projeto, com os blueprints habilitados, você poderá navegar imediatamente para /user/create?name=joe e criar um usuário e depois para /user para ver a lista de usuários do seu aplicativo. Tudo sem escrever uma única linha de código!

Os Blueprints são uma ferramenta poderosa para prototipagem, mas em muitos casos também podem ser usados na produção, uma vez que podem ser substituídos, protegidos, estendidos ou desativados completamente.


Rotas Blueprint Implícitas (ou Shadown Routes)

Quando você executa o comando sails lift com blueprints habilitado, o framework inspeciona seus modelos e arquivos de configuração para vincular determinadas rotas automaticamente. Essas rotas de blueprint implícitas (às vezes chamadas de "rotas de sombra", ou mesmo apenas "sombras") permitem que seu aplicativo responda a determinadas solicitações sem que você precise vincular essas rotas manualmente em seu arquivo config/routes.js.

Quando habilitadas, as rotas de blueprint apontam para suas ações de blueprint correspondentes (consulte "Rotas de ação" abaixo), lembrando que qualquer uma delas pode ser substituída por código personalizado.
Existem quatro tipos de rotas de blueprint no Sails:

  1. Rotas RESTful
  2. Rotas de Atalho
  3. Rotas de Ação "Index"
  4. Rotas de Ação Implícita
Rotas RESTful

Os blueprints REST são as rotas geradas automaticamente que o Sails usa para expor uma API REST convencional para um modelo (api/models/*.js), incluindo ações de localizar, criar, atualizar e destruir. O caminho para rotas RESTful é sempre /:modelIdentity ou /:modelIdentity/:id. Essas rotas usam o "verbo" HTTP para determinar a ação a ser executada.
Por exemplo, considerando um modelo api/models/Barco.js:

  • GET /barco - localiza todos os barcos do banco de dados. Executa, implicitamente, await Barco.find({})
  • GET /barco/:id - localiza um barco específico do banco de dados. Executa, implicitamente, await Barco.findOne({id: id})
  • POST /barco?nome=nome-do-barco&numero=numero-do-barco - adiciona um barco no banco de dados. Executa, implicitamente, await Barco.create({nome: nome-do-barco, numero: numero-do-barco})
  • PATH /barco/:id?nome=nome-do-barco&numero=numero-do-barco - atualiza o barco no banco de dados. Executa, implicitamente, await Barco.updateOne({id: id},{nome: nome-do-barco, numero: numero-do-barco})
  • DELETE /barco/:id - localiza e remove um barco específico do banco de dados. Executa, implicitamente, await Barco.destroy({id: id})

  • GET /barco/:id/pilotos - retorna a lista de pilotos do barco (1xn). Pode ser usado também para POST, PATH e DELETE.
  • DELETE /barco/:id/pilotos/:pk - estendendo o exemplo acima, remove somente o piloto cujo id seja igual ao valor da variável pk.
Você pode utilizar req.method() para capturar o método utilizado na requisição.
Rotas de Atalho

As rotas de atalho são um hack simples (apenas no modo de desenvolvimento) que fornece acesso aos seus modelos a partir da barra de URL do seu navegador (ou seja, tudo com HTTP GET).
As rotas de atalho são as seguintes:

* Rotas de atalho não devem ser utilizadas em ambientes de produção, pois os dados não estarão seguros pela criptografia SSH!
Rota de Atalho Ação Sombra Exemplo
GET /:modelIdentity/find find http://localhost:1337/user/find?name=bob
GET /:modelIdentity/find/:id findOne http://localhost:1337/user/find/123
GET /:modelIdentity/create create http://localhost:1337/user/create?name=bob&age=18
GET /:modelIdentity/update/:id update http://localhost:1337/user/update/123?name=joe
GET /:modelIdentity/destroy/:id destroy http://localhost:1337/user/destroy/123
GET /:modelIdentity/:id/:association/add/:fk add http://localhost:1337/user/123/pets/add/3
GET /:modelIdentity/:id/:association/remove/:fk remove http://localhost:1337/user/123/pets/remove/3
GET /:modelIdentity/:id/:association/replace?association=[1,2...] replace http://localhost:1337/user/123/pets/replace?pets=[3,4]
Rota de Ação "Index"

Quando as rotas de sombra (sails.config.blueprints.actions) são habilitadas, uma rota de sombra raiz adicional é automaticamente exposta, a ação index. Por exemplo, se você tiver um arquivo FooController.js com uma função index(), uma rota de sombra /foo será automaticamente vinculada a essa ação. Da mesma forma, se você tiver uma ação autônoma em api/controllers/foo/index.js, uma rota /foo será exposta automaticamente em seu nome.

Rotas de Ação Implícita

Quando as rotas de sombra estiverem ativadas, o Sails criará rotas genéricas (não faz diferença se é GET, POST, PUT ou DELETE) para uma determinada ação de um controlador (bastando que ele exista no diretório /api/controllers), automaticamente. Isso é útil (especialmente no início do processo de desenvolvimento) para acelerar o desenvolvimento de backend, eliminando a necessidade de vincular rotas manualmente.

Por exemplo, se você tiver um arquivo controllers/FooController.js com um método de ação bar(), uma rota /foo/bar será criada automaticamente para você, desde que sails.config.blueprints.actions esteja habilitado. Ao contrário das sombras RESTful e dos Atalhos, as Rotas de Ação não exigem que um controlador tenha um arquivo de modelo (api/models/*.js) correspondente e,de mesmo modo, não são capazes de acessar o modelo de dados, sem que isso esteja explicitamente definido do corpo da ação. Se existir uma ação index(), rotas adicionais serão criadas para ela. Finalmente, todas as Shadow Action oferecem suporte a um parâmetro de caminho opcional, :id, para conveniência.

Você pode utilizar Shadow Action em ambiente de produção, no entanto é preciso garantir que suas rotas mais vulneráveis estarão seguras. Por exemplo, você quer permitir todas as ações de POST, PUT, GET e não quer permitir a DELETE, então você pode, explicitamente, definir no arquivo config/routes.js uma rota que impeça isso do seguinte modo 'DELETE /user': {response: 'notFound'} ou testar, dentro do corpo da action, qual o VERBO foi utilizado na requisição req.method antes de continuar.
Deste modo, seja por teste explícito ou pelo fato de que a ação definida no routes.js terá precedência sobre a rota implícita, seu dado estará seguro.
Durante a inicialização do sistema, o Sails irá carregar todo o dicionário de dados existente nos arquivos config/*.js e os manterá em memória como atributos do objeto sails.config , ou seja, o valor de sails.config.blueprints.actions corresponderá ao contido no arquivo config/blueprints.js

 /**
 * Blueprint API Configuration
 * (sails.config.blueprints)
 *
 * For background on the blueprint API in Sails, check out:
 * https://sailsjs.com/docs/reference/blueprint-api
 *
 * For details and more available options, see:
 * https://sailsjs.com/config/blueprints
 */

module.exports.blueprints = {

  /***************************************************************************
  *                                                                          *
  * Automatically expose implicit routes for every action in your app?       *
  *                                                                          *
  ***************************************************************************/

  // actions: false,


  /***************************************************************************
  *                                                                          *
  * Automatically expose RESTful routes for your models?                     *
  *                                                                          *
  ***************************************************************************/

  rest: false,


  /***************************************************************************
  *                                                                          *
  * Automatically expose CRUD "shortcut" routes to GET requests?             *
  * (These are enabled by default in development only.)                      *
  *                                                                          *
  ***************************************************************************/

  shortcuts: false,

};

        
Antes de utilizar blueprints em ambientes de desenvolvimento, homologação ou produção, CERTIFIQUE-SE DE QUE o recurso foi ativado para o ambiente desejado e que NÃO HÁ exigência de CSRF para as requisições.
Estas definições podem ser verificadas nos arquivos: config/env/production.js, config/env/staging.js, config/blueprints.js, config/security.js e, caso exista, no config/local.js
Blueprints só funcionam com Classic Controller (ou Controle Clássico), logo não é possível explorar este recurso com Action 2.
Clique aqui e siga o passo a passo de um Protótipo com Blueprint
Para saber mais:
Início