Giter Site home page Giter Site logo

desafio-backend-buzzmonitor's Introduction

Desafio Livraria da Buzz 💻

TecnologiasComeçandoEndpoints da API

A aplicação consiste em um sistema simples de e-commerce de livros, com gestão de estoque, realização de pedidos, filtros por diversos parâmetros e visualização dos produtos vendidos.

💻 Tecnologias

  • JavaScript
  • Jest
  • Supertest
  • Sequelize
  • NodeJS
  • PostgreSQL
  • Git

⚙ Arquitetura

/bookstore
├── /db
│   ├── /migrations
│   ├── /config
│   └── /seeders
├── /src
│   ├── /controllers
│   ├── /models
│   ├── /routes
│   ├── /services
│   ├── app.js
│   └── server.js
├── /tests
│   ├── bookController.test.js
│   └── orderController.test.js
├── jest.config.js
├── package.json
├── .env
└── README.md

Componentes Principais

  • db/migrations: Contém todos os arquivos de migração do banco de dados gerados pelo Sequelize. As migrations são utilizadas para criar, alterar ou remover tabelas e colunas no banco de dados de forma versionada e controlada.

  • db/config: Contém o arquivo de configuração do Sequelize que define os parâmetros de conexão para os diferentes ambientes (desenvolvimento, teste, produção).

  • src/controllers: Contém os controladores que lidam com a lógica de processamento das requisições HTTP. Eles são responsáveis por receber as requisições, chamar os serviços apropriados e retornar a resposta adequada ao cliente.

  • src/models: Contém os modelos Sequelize que definem a estrutura das tabelas do banco de dados e suas relações.

  • src/routes: Contém os arquivos de definição das rotas da API. Cada rota é associada a um controlador que trata as requisições para aquela rota.

  • src/services: Contém os serviços que encapsulam a lógica de negócio da aplicação. Os serviços são responsáveis por interagir com os modelos do banco de dados e realizar operações como criação, leitura, atualização e exclusão de registros.

  • src/app.js: O ponto de entrada da aplicação. Configura o Express, inicializa os middlewares, define as rotas.

  • src/server.js: Encapsulamento feito para separar as configurações do app e o servidor.

  • tests: Contém os arquivos de testes unitários escritos com Jest e Supertest. Os testes garantem que os controladores e os serviços funcionem corretamente.

  • package.json: Define as dependências do projeto, scripts de execução e configuração do npm.

  • .env: Arquivo de configuração que guarda variáveis de ambiente sensíveis como credenciais de acesso ao banco de dados.

Decisões de arquitetura

Optei por uma arquitetura modular, separando responsabilidades em controladores, serviços, modelos e rotas, visando a clareza e a manutenção do código. Utilizei também o Sequelize como ORM para facilitar a interação com o banco de dados PostgreSQL, garantindo consistência e facilidade nas migrações. A organização dos arquivos em diretórios específicos melhora a legibilidade e facilita a navegação no projeto. Os testes unitários escritos com Jest e Supertest, asseguram a qualidade do código e a correta funcionalidade da aplicação. A utilização de variáveis de ambiente centraliza configurações sensíveis, promovendo segurança e flexibilidade na configuração do ambiente.

🚀 Começando

Pré-Requisitos

Clonando

Como clonar o projeto:

git clone https://github.com/danilomfreitas/desafio-backend-buzzmonitor.git

Configurando variáveis .env

Use o .env.sample como referência para criar seu arquivo de configuração .env com suas credenciais do banco de dados

DB_USERNAME=your_username
DB_PASSWORD=your_password
DB_DATABASE_DEV=database_name
DB_DATABASE_TEST=database_name
DB_DATABASE_PROD=database_name
DB_HOST=your_host
DB_DIALECT=postgres
PORT=your_port
NODE_ENV=development/production/test

Configurando o ambiente

Instalando as dependências:

npm install

Conecte-se ao PostgreSQL e crie o banco de dados, após isso execute as migrações:

npx sequelize-cli db:migrate --config=db/config/config.js --migrations-path=db/migrations

Executando o projeto:

npm start

Executando os testes unitários:

npm test

📍 Endpoints da API

rota descrição
GET /books recupera a lista de todos os livros registrados no sistema (ver detalhes)
POST /books cadastra um novo livro ao sistema (ver detalhes)
GET /books/:id recupera um livro por seu ID (ver detalhes)
GET /books/search recupera uma lista de livros baseados nos filtros escolhidos (ver detalhes)
PUT /books/:id edita as informações de um livro específico (ver detalhes)
DELETE /books/:id exclui um dos livros cadastrados a partir do ID (ver detalhes)
POST /orders/ solicita um pedido de venda de um livro (ver detalhes)
GET /orders/ recupera a lista de todos os pedidos solicitados (ver detalhes)
GET /orders/search recupera uma lista de pedidos baseado nos filtros escolhidos (ver detalhes)

GET /books

RESPONSE

[
    {
        "id": 2,
        "title": "Harry Potter and the Philosopher's Stone",
        "author": "JK Rowling",
        "release_year": 1997,
        "inventory": 12,
        "createdAt": "2024-06-23T18:39:07.672Z",
        "updatedAt": "2024-06-23T19:59:48.324Z"
    },
    {
        "id": 4,
        "title": "Lord of the Rings",
        "author": "JRR Tolkien",
        "release_year": 1954,
        "inventory": 12,
        "createdAt": "2024-06-24T14:30:41.346Z",
        "updatedAt": "2024-06-24T14:30:41.346Z"
    }
]

POST /books

REQUEST

{
  "title": "Harry Potter and the Philosopher's Stone",
  "author": "JK Rowling",
  "release_year": 1997,
  "inventory":12
}

GET /books/:id

RESPONSE

{
    "id": 2,
    "title": "Harry Potter and the Philosopher's Stone",
    "author": "JK Rowling",
    "release_year": 1997,
    "inventory": 2,
    "createdAt": "2024-06-23T18:39:07.672Z",
    "updatedAt": "2024-06-23T19:59:48.324Z"
}

RESPONSE

{
    "id": 2,
    "title": "Harry Potter and the Philosopher's Stone",
    "author": "JK Rowling",
    "release_year": 1997,
    "inventory": 2,
    "createdAt": "2024-06-23T18:39:07.672Z",
    "updatedAt": "2024-06-23T19:59:48.324Z"
}

PUT /books/:id

REQUEST

{
  "inventory":10
}

DELETE /books/:id

Retorna um status code 204, código de sucesso sem conteúdo adicional

POST /orders/

REQUEST

{
  "book_id":2,
  "quantity":5
}

RESPONSE

{
    "id": 7,
    "book_id": 2,
    "quantity": 2,
    "status": "Accepted",
    "updatedAt": "2024-06-24T14:58:15.421Z",
    "createdAt": "2024-06-24T14:58:15.421Z"
}

GET /orders/

RESPONSE

[
    {
        "id": 1,
        "book_id": 2,
        "quantity": 4,
        "status": "Accepted",
        "createdAt": "2024-06-23T18:48:36.858Z",
        "updatedAt": "2024-06-23T18:48:36.858Z",
        "book": {
            "id": 2,
            "title": "Harry Potter and the Philosopher's Stone",
            "author": "JK Rowling",
            "release_year": 1997,
            "inventory": 8,
            "createdAt": "2024-06-23T18:39:07.672Z",
            "updatedAt": "2024-06-24T14:58:15.425Z"
        }
    },
    {
        "id": 2,
        "book_id": 2,
        "quantity": 20,
        "status": "Refused",
        "createdAt": "2024-06-23T18:48:44.975Z",
        "updatedAt": "2024-06-23T18:48:44.975Z",
        "book": {
            "id": 2,
            "title": "Harry Potter and the Philosopher's Stone",
            "author": "JK Rowling",
            "release_year": 1997,
            "inventory": 8,
            "createdAt": "2024-06-23T18:39:07.672Z",
            "updatedAt": "2024-06-24T14:58:15.425Z"
        }
    }
]

GET /orders/search?book_id=your_id&status=order_status

RESPONSE

[
    {
        "id": 2,
        "book_id": 2,
        "quantity": 20,
        "status": "Refused",
        "createdAt": "2024-06-23T18:48:44.975Z",
        "updatedAt": "2024-06-23T18:48:44.975Z",
        "book": {
            "id": 2,
            "title": "Harry Potter and the Philosopher's Stone",
            "author": "JK Rowling",
            "release_year": 1997,
            "inventory": 8,
            "createdAt": "2024-06-23T18:39:07.672Z",
            "updatedAt": "2024-06-24T14:58:15.425Z"
        }
    },
    {
        "id": 6,
        "book_id": 2,
        "quantity": 3,
        "status": "Refused",
        "createdAt": "2024-06-23T20:00:29.340Z",
        "updatedAt": "2024-06-23T20:00:29.340Z",
        "book": {
            "id": 2,
            "title": "Harry Potter and the Philosopher's Stone",
            "author": "JK Rowling",
            "release_year": 1997,
            "inventory": 8,
            "createdAt": "2024-06-23T18:39:07.672Z",
            "updatedAt": "2024-06-24T14:58:15.425Z"
        }
    }
]

Documentos de apoio

📝 Operadores do sequelize

📝 Uso do isNaN()

📝 Migrações usando sequelize

desafio-backend-buzzmonitor's People

Contributors

danilomfreitas avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.