Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
68c7578
dependecias e autenticacao
MatheusBespalec Dec 8, 2021
4b28571
view seller
MatheusBespalec Dec 9, 2021
3fad3e8
atualizacao profile vue component
MatheusBespalec Dec 9, 2021
837d255
view cliente
MatheusBespalec Dec 9, 2021
332bd66
migrations e factory
MatheusBespalec Dec 9, 2021
3fd611d
seller api
MatheusBespalec Dec 10, 2021
698708d
consumo da api de sellers nas views
MatheusBespalec Dec 10, 2021
6101489
relacoes entre modelos
MatheusBespalec Dec 10, 2021
7f2a365
customers api
MatheusBespalec Dec 10, 2021
56ede24
consumo da api de clientes
MatheusBespalec Dec 13, 2021
f562b0e
correcao: armazenando token jwt ao se registrar no sistema
MatheusBespalec Dec 13, 2021
4c5086c
alteracao no envio de email de boas vindas: usando notificacoes e queue
MatheusBespalec Dec 13, 2021
adb54d3
correcao: erros na chamada de relacionamentos do cliente + disponibil…
MatheusBespalec Dec 13, 2021
4c60be9
correcao nas rotas web
MatheusBespalec Dec 13, 2021
26d0107
t
MatheusBespalec Dec 13, 2021
e6040c7
Merge branch 'main' of https://github.com/MatheusBespalec/Vaga-Desenv…
MatheusBespalec Dec 13, 2021
55e1df7
readme
MatheusBespalec Dec 13, 2021
333d304
correcao: exibixao de telefones no modal de exclusao de clientes
MatheusBespalec Dec 13, 2021
823d977
Merge branch 'main' of https://github.com/MatheusBespalec/Vaga-Desenv…
MatheusBespalec Dec 13, 2021
cf82ed8
correção readme
MatheusBespalec Dec 13, 2021
d6b31ae
correções readme
MatheusBespalec Dec 13, 2021
5df1c9d
updates
MatheusBespalec May 21, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
18 changes: 18 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
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,yaml}]
indent_size = 2

[docker-compose.yml]
indent_size = 4
5 changes: 5 additions & 0 deletions .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
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
.env
.env.backup
.phpunit.result.cache
docker-compose.override.yml
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
/.idea
/.vscode
14 changes: 14 additions & 0 deletions .styleci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
php:
preset: laravel
version: 8
disabled:
- no_unused_imports
finder:
not-name:
- index.php
- server.php
js:
finder:
not-name:
- webpack.mix.js
css: true
175 changes: 97 additions & 78 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,82 +3,101 @@

Vaga Desenvolvedor PHP
===============
Nós da Olivas Digital buscamos um(a) desenvolvedor(a) para transformar ideias em códigos que estará envolvido em vários aspectos, desde o conceito até o produto final, incluindo UX, criação e codificação utilizando PHP.


# Sobre a vaga
##### Responsabilidades:
- Desenvolvimento de plataformas, sites, e-commerce e aplicativos
- Manutenção e evolução de sistemas legados
- Apoio aos desenvolvedores Junior
- Identificar problemas e propor melhorias

##### Pré-requisitos:
- Ao menos 3 anos de experiência como desenvolvedor
- Experiência com PHP utilizando ao menos um dos frameworks Laravel, Magento ou Zend
- Conhecimento sobre APIs
- Noções de HTML/CSS utilizando (Webpack, Grunt ou Gulp)
- Boa comunicação e saber trabalhar em equipe
- Compreensão de necessidades para propor soluções frente aos problemas
- Bom entendimento de Design de Interface (UI) e Experiência do Usuário (UX)
- Curso técnico ou tecnólogo em Ciências da Computação, Análise e Desenvolvimento de Sistemas, Engenharia da Computação, Sistemas de Informação, Programação ou matérias correlatas e Curso Superior em andamento (mínimo 3°ano) nas áreas de Tecnologia da Informação ou Gestão da Tecnologia da Informação

##### Serão Considerados como Diferenciais:
- Conhecimento em IONIC, React ou Angular
- Experiência com métodos ágeis/scrum
- Inglês intermediário e avançado
- Experiência com Node

##### Benefícios
- Contrato PJ com 30 dias de férias ao ano
- Vale-Refeição
- Bônus trimestral
- Participação nos Lucros (PLR)

##### Local e trabalho
- 100% remoto ou presencialmente em Barueri-SP

___

# Desafio para vaga (PARTICIPE!)
### Como participar
- Forkar esse desafio e criar o seu projeto (ou workspace) usando a sua versão desse repositório, após terminar o desafio, submeta um pull request.
- Caso você tenha algum motivo para não submeter um pull request, crie um repositório privado no Github, faça todo desafio na branch master. Assim que terminar seu desenvolvimento, adicione como colaborador o usuário [email protected] no seu repositório e o deixe disponível por pelo menos 30 dias.

### Escopo do projeto

1) **Criar um CRUD** de Vendedor com os campos
- Nome*

Após a criação do CRUD de Clientes, um vendedor pode possuir 0 ou vários clientes.
## Instalação

Primeiramente, clone este repositório:

```sh
git clone https://github.com/MatheusBespalec/Vaga-Desenvolvedor-PHP.git
```

Agora com os aquivos do projeto renomeie o arquivo ".env.example" para ".env", em seguida iremos configurar este arquivo, mas antes, no diretório principal do projeto digite o comando

```sh
composer install
```
E logo em seguida


```sh
php artisan key:generate
```

Agora, já no arquivo ".env" defina a url do projeto, por padrão no laravel: http://127.0.0.1:8000

```sh
APP_URL=http://127.0.0.1:8000
```

Enseguida defina os seguintes atributos referentes ao envio de emails e conexão com o banco de dados

```sh
MAIL_MAILER=
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME="${APP_NAME}"

DB_CONNECTION=
DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
```

De volta ao terminal, exculte os comandos

```sh
php artisan jwt:secret
```

```sh
php artisan migrate --seed
```

```sh
php artisan storage:link
```
Por fim em um terminal separado sirva a aplicação

```sh
php artisan serve
```
E em outro, para o processamento das queues, deixe também em execução o comando

```sh
php artisan queue:work --tries=3
```

Tudo pronto, agora basta abrir o projeto em seu navegador e realizar o cadastro de seu usuario para usar a aplicação.

## API

Logo ao fazer login na aplicação você vera uma tela de boas vindas e seu token de autorização, que expira dentro do periodo de 1h após o login. Após esse tempo é nescessario realizar login novamente para receber um novo token.

Agora, para utilizar a API,com o token em mãos, você pode enviar uma requisição GET para <url_da_aplicação>/api/customers, assumindo a url como http://127.0.0.1:8000/, teriamos http://127.0.0.1:8000/api/customers, mas antes nos headers da requisição adicione:

| key | Value |
|-------|--------|
| Accept | application/json |
| Authorization | Bearer token |

Substitua 'token' pelo seu token de autorização, e realize a requisição, você recebera uma relação dos clientes cadastrados, com suas informações e de seus relacionamentos em formato JSON.

### Buscas com API

2) **Criar um CRUD** de Clientes com os campos
- Nome*
- Email*
- Imagem*
- Telefones <em>(Relacionamento 1 pra N, com obrigatoriedade de ao menos 1 telefone)</em>
- Tipo de cliente* <em>(Relacionamento 1 pra N)</em>. Sendo que os tipos podem ser “Pessoa Física” e “Pessoa Jurídica”
- Vendedores <em>(Relacionamento N pra N)</em>. Pode estar vinculado a um ou vários vendedores.

***Campos obrigatórios**
3) **Disparar um e-mail** de “Boas vindas” para o cliente
4) Utilizar **migrations** para a criação das tabelas
5) Utilizar o **[Eloquent](https://laravel.com/docs/8.x/eloquent)** para os relacionamentos
6) Disponilizar os dados de clientes via **API com autenticação JWT** permitindo busca por nome
___
### Critério de avaliação
- Organização do código: Separação de módulos, view, model e controller
- Clareza: O README explica de forma resumida como rodar a aplicação?
- Segurança: Existe alguma vulnerabilidade clara?
- Histórico de commits (estrutura e qualidade)
- UX: A interface é de fácil uso e auto-explicativa? A API é intuitiva?
- API: Códigos de Resposta/Verbos HTTP corretos

### Diferenciais:
- Testes automatizados
- Utilização de Cache
- Uso de Logs
- Documentação da API
- [LaravelMix](https://laravel-mix.com/)
- [Eloquent API Resources](https://laravel.com/docs/8.x/eloquent-resources)
- Disparo de e-mail utilizando filas [(Queues)](https://laravel.com/docs/8.x/queues)
Para realizar buscas utilizando a api iremos adicionar um parametro na url, o 'filters'. Inserir valores a pesquisa funciona da mesma forma que o método where do laravel onde passamor nos parametros: (chave, operador, valor_da_pesquisa), então supondo que iremos buscar os clientes com nome 'Erick", a url de busca ficaria:

```sh
http://127.0.0.1:8000/api/customers?filters=name,like,%erick%;
```

Assim como no SQL temos o operador like e podemos colocar o valor da pesquisa entre '%'. Outros parametros de bucsa que temos são email, id, customer_type_id(sendo 1 para Pessoa Jurídica e 2 para Pessoa Física). Para fazer multiplas pesquisas urilizamos ';' entre os parametros. Supondo que fossemos buscar os clientes do tipo pessoa fisica com nome erick, nossa url de busca seria a seguinte:

```sh
http://127.0.0.1:8000/api/customers?filters=name,like,%erick%;customer_type_id,=,2;
```
32 changes: 32 additions & 0 deletions app/Console/Kernel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace App\Console;

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

class Kernel extends ConsoleKernel
{
/**
* 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');
}
}
41 changes: 41 additions & 0 deletions app/Exceptions/Handler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

namespace App\Exceptions;

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

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

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

/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
}
}
40 changes: 40 additions & 0 deletions app/Http/Controllers/Auth/ConfirmPasswordController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\ConfirmsPasswords;

class ConfirmPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Confirm Password Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password confirmations and
| uses a simple trait to include the behavior. You're free to explore
| this trait and override any functions that require customization.
|
*/

use ConfirmsPasswords;

/**
* Where to redirect users when the intended url fails.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;

/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
}
22 changes: 22 additions & 0 deletions app/Http/Controllers/Auth/ForgotPasswordController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?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;
}
Loading