Skip to content
Awesome rest-maker node.js boilerplate
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
app
core
docs
.editorconfig
.env.example
.eslintignore
.eslintrc.js
.gitignore
.sequelizerc
README.md
REQUEST.md
jsconfig.json
package-lock.json
package.json
server.js

README.md

hpnode

Esta é a documentação dessa estrutura. Siga e não questione. Se tiver em dúvida, a resposta sempre será: você não pode.

Mas, caso você sinta dificuldade, pode me chamar @danielbonifacio.

Se encontrar um Bug, abra uma Issue. As vezes nem é um bug.

Compatibilidade

Essa estrutura foi desenvolvida em cima da versão 10.15.0 do node, mas deverá rodar na versão 8.24

Core:

  • Express 4
  • Node 10
  • Sequelize 4
# instala as dependencias
npm i

# roda o servidor de produção (sem livereload)
npm run production

# roda o servidor de desenvolvimento (com livereload)
npm run dev

GIT

Quando for subir uma nova feature ou correção, não se esqueça de subir em um novo branch:

# baixa a ultima versão do projeto
# CARA FAZ ISSO SÉRIO VC VAI EVITAR MT MERDA
git pull origin master

# cria um novo branch
git checkout -b nome-do-branch

# adiciona e commita as mudanças
git add . && git commit -m "fiz isso e isso e isso"

# sobe para o github com um novo branch
git push origin nome-do-branch

# volta para o master e apaga o branch que você criou
git checkout master && git branch -d nome-do-branch

Desenvolvimento

Futuramente um linting será adicionado e, bem possivelmente, será com base na style guide do AirBnb.

Controllers

O controller, aqui dentro, tem o papel de dar um norte e dizer o que precisa ser feito em determinada requisição.

Ele é um pouco diferente dos controllers tradicionais, pois ele aplica conceitos de rota nele mesmo.

Eis um exemplo de controller:

module.exports = new Controller ({
    // path raiz de todas as requisições
    route: 'users',

    /**
     * Middlewares que esse controller irá ter
     */
    middlewares:{
        // em todos os verbos
        '*': [ require('Middlewares/Auth') ],

        // em metodos especificos (get, post, put, delete)
        post: [ require('Middlewares/DecryptData') ],
        put: [ require('Middlewares/DecryptData') ],
    },

    /**
     * Array de módulos
     * Um módulo é um SubController
     */
    get: [
        /**
         * Submódulo com verbo get
         * -----------------------
         * @endpoint: GET -> /users/:email?
         */
        {
            endpoint: ':email?',

            // array de middlewares que ESTE módulo irá ter
            middlewares: [],

            // método a ser executado
            run(req, res, next) {
                // seu código aqui...
            }
        }
    ],

    /**
     * Atalho para módulo
     * ------------------
     * @endpoint: POST -> /users
     */
    post(req, res, next) {
        // seu código aqui
    }
})

No exemplo acima, a estrutura e abordagens mais comuns foram documentadas.

Caso o controller se encontre em uma subpasta, o nome dessa subpasta prefixará seu endpoint.

Por exemplo, se houver um arquivo de controller em Controllers/users/index.js todos os meu módulos serão prefixados com /users.

Models

Essa estrutura usa o Sequelize para gerenciar o banco de dados.

Exemplo de model:

const sql = require('sequelize')
const db = require('Services/database')

const User = db.define('user', {
    id: {
        type: sql.INTEGER,
        primaryKey: true,
        autoIncrement: true,
    },
    nome: {
        type: sql.STRING,
        unique: true,
    },
    email: {
        type: sql.STRING,
        unique: true,
        select: false,
    },
})

module.exports = User

Veja mais detalhes de implementação na documentação do Sequelize.

Services

Você pode importar serviços pelo alias de Services de qualquer diretório:

const myService = require('Services/MyService')

Existe um serviço padrão, que é o de conexão com o banco de dados e, atualmente, ele exporta uma conexão com o banco de dados usando o Sequelize.

Middlewares

Essa estrutura é baseada em Express, e a forma que aplicamos middlewares é a mesma.

Um exemplo de middleware:

module.exports = function(req, res, next) {
    Token.isValid(req.header('Authorization'))
        ? next() // prossegue para o módulo ou próximo middleware
        : res
            .status(403)
            .send(helpers.messages.unauthorized)
}

Helpers

Para não repetir e/ou poluir código, é mais inteligente que se crie helpers. Você pode criar os seus próprios Helpers compartihados em /core/helpers.

Detalhe: você estará compartilhando espaço com helpers internos, como requestManager e registerController. Seja uma boa pessoa e respeite a privacidade destes dois. Sério, não quero trocar eles de lugar por que você pode fazer merda com eles.

Exemplo de Helper:

module.exports = () => console.log('hi')
const sayHi = require('Helpers/sayHi')

sayHi()

Alias

Existem alguns alias de importação, que servem meio que como namespaces.

Services    /app/services
Models      /app/models
Middlewares /app/middlewares
Core        /core
Helpers     /core/helpers
Config      /core/config

Você pode importar qualquer arquivo de qualquer diretório usando esses alias:

// /app/controllers/batata/teste.js
const Users = require('Models/User') // => require('../../models/user')

Use os alias para manter o código limpo e legível.

Config

/core/config

Configurações diversas como dados de conexão com banco de dados, porta, etc. podem ser feitas no arquivo de configuração.

You can’t perform that action at this time.