Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge Desafio #2

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 52 additions & 69 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,92 +1,75 @@
![Logo OW Interactive](https://github.com/owInteractive/desafio-backend/raw/master/media/logo.jpg "OW Interactive")

# Desafio Back-End - OW Interactive 20/21

## Sobre a OW Interactive
Fazemos parte do universo digital, focada em criar e desenvolver experiências interativas, integrando planejamento, criatividade e tecnologia.
## Informações

Conheça mais sobre nós em: [OW Interactive - Quem somos](http://www.owinteractive.com/quem-somos/).
- Desenvolvido com PHP 7.1, Laravel Framework 5.8, MySQL 8.0;

## Sobre a Vaga
Esse desafio é destinado todos os níveis e não é exigido que você consiga realizar esse desafio por completo.
## Preparando o Projeto

Sua avaliação será dada pelas etapas que conseguir entregar.
- Crie uma base de dados com o nome de **base_ow**, ou com o nome de sua preferência.

Para saber mais sobre as vagas acesse: [OW Interactive - Vagas](http://www.owinteractive.com/vagas/).
- Clone o projeto
- git clone https://github.com/tiagoalvesdev/desafio-backend.git

Caso você tenha caido aqui por curiosidade sinta-se a vontade para enviar o desafio e aplicar para alguma vaga de backend.
- Após o download, acesso o projeto
- cd desafio-backend/ow

## Pré-requisitos
- Lógica de programação;
- Conhecimentos sobre Banco de dados;
- Conhecimentos sobre REST, HTTP e API's;
- Conhecimentos sobre Git;
- Agora você precisa ajustar seu arquivo de conexāo com o banco (.env)
- cp .env.example .env

## Requisitos Obrigatórios
- Utilizar a linguagem [PHP](https://www.php.net/) ou [NodeJS](https://nodejs.org)
- Código bem documentado, legível e limpo;
- Fazer uma API simples e objetiva em REST, com o retorno em JSON;
- Adicionar ao README instruções claras para rodar o projeto, caso não conseguirmos rodar o projeto será desconsiderado o desafio;
- Caso seja usado [Postman](https://www.php.net/), [Insomnia](https://insomnia.rest/), [Swagger](https://swagger.io/) e etc.Para montar o exemplos da API adicionar ao repósitorio o arquivo gerado pelo programa e especificar qual o arquivo e programa devem ser usados;
- Em qualquer caso de erro ou não encontrada a API deve retorna uma resposta condizente com o problema apresentado, por exemplo um retorno 500 ou 404;
- Abra o arquivo **.env** e altere o valor da váriavel DB_DATABASE para **base_ow**, ou o nome que escolheu para sua base e salve o arquivo
- DB_DATABASE=base_ow

## Diferenciais
- Utilizar o [Laravel (PHP)](https://laravel.com/docs/7.x) ou [Adonis/JS (Node)](https://adonisjs.com/docs/4.1/installation);
- Utilizar o [Docker](https://www.docker.com/get-started) para conteinerização da aplicação;
- Pensar em desempenho e escalabilidade, quando for uma quantidade muito grande de dados como o sistema se comportaria;
- Criar testes;
- Utilizar apenas as ferramentas do framework caso use um, evitando criar dependência de outros pacotes ou bibliotecas;
- Instale o composer
- composer install

## Desafio
- Agora vamos preparar as informações da nossa base, utilizando **migration** e **seeds**
- php artisan migrate
- php artisan db:seed

### Etapa 1 - Cadastrar Usuários / Endpoint Dos Usuários
Nessa etapa daremos algumas premissas que devem ser seguidas.
- Para a autenticação no sistema, utilizaremos a biblioteca **passport**
- php artisan passport:install
- php artisan key:generate

- Criar um endpoint onde é cadastrado um usuário.
- Esses usuários devem ter obrigátoriamente os seguintes dados modelados, caso você ache necessário outros campos fique a vontade.
- **name** | string (Nome)
- **email** | string (E-mail)
- **birthday** | date (Data de aniversário)
- **created_at** | datetime (Criado Em)
- **updated_at** | datetime (Atualizado Em)
- Criar um endpoint para listagem desses usuários, ordernados por ordem de cadastro;
- Criar um endpoint para listar um único usuário através do seu id;
- Criar um endpoint para excluir um usuário através do seu id.
## Iniciando a aplicação

### Etapa 2 - Cadastrar Movimentações / Endpoint De Movimentações
Nessa etapa você precisará criar a modelagem e lógica para implementar as funcionalidades abaixo:
- Agora iremos subir a aplicação. Após a execução do comando abaixo, você deverá acessar seu nevegador e na URL digitar http://127.0.0.1:8000/
- php artisan serve

- Criar um endpoint ou endpoint`s onde é possível associar uma operação de débito, crédito ou estorno para o usuário;
- Criar um endpoint onde seja possível visualizar toda a movimentação (páginada) do usuários mais as suas informações pessoais;
- Criar um endpoint onde seja possível excluir uma movimentação relacionada a um usuário;
- Criar um endpoint onde é retornado um arquivo no formato (csv) com 3 tipos de filtros para as movimentações:
- Últimos 30 dias;
- Passando o mês e ano por exemplo: 06/20;
- Todo as movimentações;
- Agora com nossa aplicação funcionando, iremos executar a limpeza de cache e o autoload de nossa aplicação
- php artisan cache:clear
- composer dump-autoload

### Etapa 3 - Nova Funcionalidades
Nessa etapa serão itens onde veremos como você pensou e como chegou ao resultado final.
## Rotas disponiveis no sistema

- Adicionar dentro do usuário um campo para saldo inicial, e criar um endpoint para alterar esse valor;
- Criar um endpoint com a soma de todas as movimentações (débito, crédito e estorno) mais o saldo inicial do usuário;
- No endpoint que exclui um usuário, adicionar a funcionalidade que agora não será mais possível excluir um usuário que tenha qualquer tipo de movimentação ou saldo;
- No endpoint que cadastra usuário, adicionar a funcionalidade que apenas maiores de 18 anos podem criar uma conta;
- No endpoint que exporta o arquivo CSV criar um cabeçalho com os dados do cliente e o seu saldo atual;
Method | URI | Action
----------- | ---------------------------------------- | -------------------------------------------------------
POST | api/auth/login | App\Http\Controllers\AuthenticationController@login
POST | api/auth/logout | App\Http\Controllers\AuthenticationController@logout
POST | api/auth/register | App\Http\Controllers\AuthenticationController@register
GET HEAD | api/operations | App\Http\Controllers\OperationsController@index
GET HEAD | api/operations/amount/{user} | App\Http\Controllers\OperationsController@amountUser
GET HEAD | api/operations/status/{status} | App\Http\Controllers\OperationsController@showStatus
GET HEAD | api/operations/transaction/{transaction} | App\Http\Controllers\OperationsController@showTransaction
GET HEAD | api/operations/user/{user} | App\Http\Controllers\OperationsController@showUser
GET HEAD | api/operations/{operation} | App\Http\Controllers\OperationsController@show
DELETE | api/operations/{operation}/{user} | App\Http\Controllers\OperationsController@eliminate
POST | api/report | App\Http\Controllers\OperationsController@reportPost
GET HEAD | api/report/{param} | App\Http\Controllers\OperationsController@reportGet
GET HEAD | api/report/{param}/{user} | App\Http\Controllers\OperationsController@reportGet

### Etapa 4 -Itens Não Obrigatórios
- Criar validações com base na Request;
- Utilizar cache para otimizar as consultas e buscas;
- Criar Seeders ou Inicializadores de dados para o usuários e suas movimentações;
- Criar os métodos baseados em algum método de autênticação.
- Documentação dos endpoint`s;

## Conclusão
Crie um Fork e submeta uma Pull Request ao Github com o seu desafio. Após isso envie um e-mail para [[email protected]](mailto:letsrock@owinteractive.com), com o assunto [DESAFIO BACK-END] com o link para o seu desafio, sua apresentação e currículo anexado em formato PDF.
- Testes no Postman
- Os testes realizados nas rotas, foram com o [Postman](https://www.postman.com/)

Caso tenha alguma sugestão sobre o teste ela é bem vinda, fique a vontade para envia-la junto ao e-mail.
- Para os parametros dos métodos POST
- Inseri os dados em *Body* e *x-www-form-urlencoded*

E fique a vontade para usar os programas e ferramentas que se sentir bem, lembrando que aqui somos team [VS Code](https://code.visualstudio.com/) rs.
- Lembrando que para acessar os métodos, os mesmos precisam de autenticação, desta forma é necessário:
- Efetuar um login no sistema (Ex.: email: [email protected] / password: admin)
- O token gerado no acesso deverá ser inserido em *Headers*
- No campo **KEY** = Authorization e no campo **VALUE** = Bearer + *token gerado*

Obrigado por participar e boa sorte 😀
- Documentação das rotas [neste link](https://documenter.getpostman.com/view/12479411/TVCcXV7d/)

![Cachorro programando](https://github.com/owInteractive/desafio-backend/raw/master/media/dog.webp "Cachorro programando")
- Caso utilize o **Postman** para relizar os testes, você pode baixar este [arquivo json](https://drive.google.com/file/d/1PXNiROjPJHbqGmqhIu_t1CHX1sMqR6YT/view?usp=sharing) e upar na ferramenta e obter todos os rotas ja configuradas.
15 changes: 15 additions & 0 deletions ow/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[*.yml]
indent_size = 2
44 changes: 44 additions & 0 deletions ow/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
5 changes: 5 additions & 0 deletions ow/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
* text=auto
*.css linguist-vendored
*.scss linguist-vendored
*.js linguist-vendored
CHANGELOG.md export-ignore
12 changes: 12 additions & 0 deletions ow/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
.env
.env.backup
.phpunit.result.cache
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
13 changes: 13 additions & 0 deletions ow/.styleci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
php:
preset: laravel
disabled:
- unused_use
finder:
not-name:
- index.php
- server.php
js:
finder:
not-name:
- webpack.mix.js
css: true
42 changes: 42 additions & 0 deletions ow/app/Console/Kernel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
];

/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')
// ->hourly();
}

/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');

require base_path('routes/console.php');
}
}
51 changes: 51 additions & 0 deletions ow/app/Exceptions/Handler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];

/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'password',
'password_confirmation',
];

/**
* Report or log an exception.
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception)
{
parent::report($exception);
}

/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
}
32 changes: 32 additions & 0 deletions ow/app/Http/Controllers/Auth/ForgotPasswordController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;

class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/

use SendsPasswordResetEmails;

/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
}
Loading