Projeto para gestao de Gastos
Na implementaçao deste projeto foi utilizado o seguinte stack tecnologico: Git, Ruby, Rails, PostgreSql.
- Windows / Linux / Mac OSX
- Git
- Ruby 2.6.3
- Rails 6.0.0.rc1
- Bundler gem
- Git
O primeiro passo que deverá efetuar será instalar o Git (https://git-scm.com). Caso ainda não o tenha, vide o tutorial abaixo para instalação:
https://git-scm.com/book/pt-br/v1/Primeiros-passos-Instalando-Git
Após a instalação do git, deverá configura-lo (https://git-scm.com/book/pt-br/v2/Começando-Configuração-Inicial-do-Git) e clonar este projeto ([email protected]:rrcosta/GestaoGastos.git).
- Ruby
Para obter a versão 2.6.3 do Ruby, basta abrir um terminal em seu sistema e digitar um dos seguintes comandos:
- Windows
Para instalar o Ruby no Windows, sugiro verificar os passos no seguinte site: https://rubyinstaller.org/downloads/
- Mac
brew install ruby
- Linux (Debian, Ubuntu e derivados)
sudo apt-get install ruby-full
- Ruby on Rails
Após instalar o ruby (passo acima), deverá instalar o framework Rails, através do comando abaixo
gem install rails
-
Faça o clone deste projeto
-
Vá ao diretório do projeto e execute
$ bundle install
- Copie o conteúdo do arquivo .env.example para o arquivo .env e altere com as credenciais de seu ambiente local
$ cp .env.example .env
-
Abra o arquivo .env e coloque os seus dados de acesso do seu banco de dados Postgrsql
-
Faça o setup do banco de dados: Criação do Banco de Dados
$ bin/rails db:create
- Faça o setup do banco de dados: Criação das tabelas Banco de Dados
$ bin/rails db:migrate
- Inicie a aplicação usando o servidor local (Irá iniciar na porta padrão que é a 3000)
$ rails s
Para rodar os testes automatizados deste projeto, basta entrar no pasta raiz do projeto e digitar:
$ rspec
Para a autenticaçao foi utilizado o JWT, que e um padrao (RFC-7519) de mercado que define como transmitir e armazenar objetos JSON de forma segura.
Ele e formado por 3 secoes: Header, Payload e Signature.
Para utilizar esta API é necessário fazer os seguintes passos:
- Criar um usuário, atraves do endpoint:
POST /users
{
"name": "teste",
"username": "teste",
"password": "123456",
"password_confirmation": "123456"
}
response
{
"id": "dc0e72a0-33f3-40e1-aae8-66848b63f123",
"name": "teste",
"username": "teste",
"password_digest": "$2a$10$CIYnpAox9X/ERyGSzJ0Ster/mD0JQKMx/yfjZtYgE7gwzyeKtIiwC"
}
- Autenticar na API, atraves do endpoint:
POST /auth/login
{
"username": "teste",
"password": "123456"
}
response:
{
"token": "eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZGMwZTcyYTAtMzNmMy00MGUxLWFhZTgtNjY4NDhiNjNmMTIzIiwiZXhwIjoxNTYwMjExMjc1fQ",
"exp": "10-06-2019 21:01",
"username": "teste"
}
- Efetuar o Login na API com o cabeçalho - Authorization com o token.
GET /users/{username}
GET /users/teste
header
|---------------|-----------------------------------------------------------------------------------------------------------------------|
| Authorization |Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZGMwZTcyYTAtMzNmMy00MGUxLWFhZTgtNjY4NDhiNjNmMTIzIiwiZXhwIjoxNTYwMjExMjc1fQ |
|---------------|-----------------------------------------------------------------------------------------------------------------------|
Response:
[
{
"id": "dc0e72a0-33f3-40e1-aae8-66848b63f123",
"name": "teste",
"username": "teste",
"password_digest": "$2a$10$CIYnpAox9X/ERyGSzJ0Ster/mD0JQKMx/yfjZtYgE7gwzyeKtIiwC"
}
]
OBS: Sempre sera necessario passar o token para acessar e manipular as informacoes na API.
O usuario poderar cadastrar seus gastos atraves do endpoint:
POST /expenses
header
|---------------|-----------------------------------------------------------------------------------------------------------------------|
| Authorization |Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZGMwZTcyYTAtMzNmMy00MGUxLWFhZTgtNjY4NDhiNjNmMTIzIiwiZXhwIjoxNTYwMjExMjc1fQ |
|---------------|-----------------------------------------------------------------------------------------------------------------------|
body
{
"descricao": "teste",
"valor": 1250.10,
"data": "2019-06-13"
}
OBS: O campo "codigousuario" informado no teste sera considerado como "user_id", que sera obtido ao salvar o registro de gasto (expense), atraves do token informado no client (Postman, SoapUI ou Curl ).
Visualizar os gastos cadastrados pelo usuário logado na api:
GET /expenses
header
|---------------|-----------------------------------------------------------------------------------------------------------------------|
| Authorization |Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZGMwZTcyYTAtMzNmMy00MGUxLWFhZTgtNjY4NDhiNjNmMTIzIiwiZXhwIjoxNTYwMjExMjc1fQ |
|---------------|-----------------------------------------------------------------------------------------------------------------------|
[
{
"id": "e30b2dab-05ce-4eb9-9502-fe747fc4be72",
"descricao": "Pagamento do condominio ",
"valor": "305.95",
"data": "2019-06-03T00:00:00.000Z",
"category": []
},
{
"id": "b741547d-8412-4a6b-adee-8279cdc48250",
"descricao": "Pagamento da parcela do carro ",
"valor": "652.75",
"data": "2019-06-12T00:00:00.000Z",
"category": []
},
{
"id": "8e397385-98df-484c-a737-b71454766222",
"descricao": "teste",
"valor": "1250.1",
"data": "2019-06-13T00:00:00.000Z",
"category": []
}
]
A Api disponibiliza um endpoint de filtro para buscar os gasto de um determinado dia cadastrado pelo usuário logado na api.
exemplo:
GET /gasto_por_dia?data=2019-06-03
Onde o data=2019-06-03 deverá ser a data desejada para fazer o filtro de gastos cadatrados através do usuário logado pelo Token.
header
|---------------|-----------------------------------------------------------------------------------------------------------------------|
| Authorization |Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZGMwZTcyYTAtMzNmMy00MGUxLWFhZTgtNjY4NDhiNjNmMTIzIiwiZXhwIjoxNTYwMjExMjc1fQ |
|---------------|-----------------------------------------------------------------------------------------------------------------------|
Response:
[
{
"id": "e30b2dab-05ce-4eb9-9502-fe747fc4be72",
"descricao": "Pagamento do condominio ",
"valor": "305.95",
"data": "2019-06-03T00:00:00.000Z",
"category": []
}
]
A Api disponibiliza um endpoint de criaçao de categorias por cada gasto cadastrado pelo usuario logado na api.
Acessar o detalhes do gasto desejado e utilizar POST /{id-do-gasto}/categoria.
Exemplo:
POST /expenses/e30b2dab-05ce-4eb9-9502-fe747fc4be7/categoria
onde "e30b2dab-05ce-4eb9-9502-fe747fc4be7" sera o ui do gasto em que o usuario deseja adicionar a categoria
header
|---------------|-----------------------------------------------------------------------------------------------------------------------|
| Authorization |Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZGMwZTcyYTAtMzNmMy00MGUxLWFhZTgtNjY4NDhiNjNmMTIzIiwiZXhwIjoxNTYwMjExMjc1fQ |
|---------------|-----------------------------------------------------------------------------------------------------------------------|
body
{
"descricao": "Lazer"
}
responder
{
"id": "d31dcc50-084a-4540-a9a4-699dfe7dd3b2",
"descricao": "Lazer",
"expense": {
"id": "e30b2dab-05ce-4eb9-9502-fe747fc4be7"
}
}
A Api disponibiliza um endpoint para listar todas as categorias cadastradas na api.
OBS¹: É listado todas as categorias cadastradas na api, independentemente do usuario logado.
Exemplo:
GET /categories
header
|---------------|-----------------------------------------------------------------------------------------------------------------------|
| Authorization |Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiZGMwZTcyYTAtMzNmMy00MGUxLWFhZTgtNjY4NDhiNjNmMTIzIiwiZXhwIjoxNTYwMjExMjc1fQ |
|---------------|-----------------------------------------------------------------------------------------------------------------------|
responder
[
{
"id": "b06be318-de6d-4132-8f9f-7adedacb3986",
"descricao": "teste",
"expense": {
"id": "cc337360-2255-46b3-aabc-649918291c4f"
}
},
{
"id": "d31dcc50-084a-4540-a9a4-699dfe7dd3b2",
"descricao": "Lazer",
"expense": {
"id": "e30b2dab-05ce-4eb9-9502-fe747fc4be7"
}
}
]
OBS² Conforme visto acima, no responder é indicado qual ID do gasto que esta vinculado a categoria(as)
..