Skip to content
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
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
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[*.{yml,yaml}]
indent_size = 2

[docker-compose.yml]
indent_size = 4
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
* text=auto eol=lf

*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php

/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/storage/pail
/vendor
.env
.env.backup
.env.production
.phpactor.json
.phpunit.result.cache
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
/auth.json
/.fleet
/.idea
/.nova
/.vscode
/.zed
mysqldata
59 changes: 20 additions & 39 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,54 +1,35 @@
## Teste para Desenvolvedor PHP/Laravel
# Inicializando o projeto

Bem-vindo ao teste de desenvolvimento para a posição de Desenvolvedor PHP/Laravel.
- Faça o clone do repositório: `git clone https://github.com/edblighter/teste-dev-php`
- A seguir rode os comandos

O objetivo deste teste é desenvolver uma API Rest para o cadastro de fornecedores, permitindo a busca por CNPJ ou CPF, utilizando Laravel no backend.
```bash
cd teste-dev-php
git checkout teste
```

## Descrição do Projeto
- Após baixar o projeto siga para as instruções contida em [infra/README.md](infra/README.md)

### Backend (API Laravel):
### Api de fornecedor

#### CRUD de Fornecedores:
- **Criar Fornecedor:**
- Permita o cadastro de fornecedores usando CNPJ ou CPF, incluindo informações como nome/nome da empresa, contato, endereço, etc.
- Valide a integridade e o formato dos dados, como o formato correto de CNPJ/CPF e a obrigatoriedade de campos.
- O CRUD de fornecedor está disponivel no endpoint http://app.localhost:8000/api/suppliers .

- **Editar Fornecedor:**
- Facilite a atualização das informações de fornecedores, mantendo a validação dos dados.
- Listar Fornecedores: A listagem paginada de fornecedores está disponivel no endpoint GET http://app.localhost:8000/api/suppliers

- **Excluir Fornecedor:**
- Possibilite a remoção segura de fornecedores.
> os argumentos do paginador sao ?page={}&per_page={}&order={}

- **Listar Fornecedores:**
- Apresente uma lista paginada de fornecedores, com filtragem e ordenação.
- Criar Fornecedor: A criação de um fornecedor está disponivel no endpoint POST http://app.localhost:8000/api/suppliers

#### Migrations:
- Utilize migrations do Laravel para definir a estrutura do banco de dados, garantindo uma boa organização e facilidade de manutenção.
> O body da request aceita os campos name, type[CPF,CNPJ], document, email, phone, address

## Requisitos
> Todos os campos são obrigatórios no cadastro.

### Backend:
- Implementar busca por CNPJ na [BrasilAPI](https://brasilapi.com.br/docs#tag/CNPJ/paths/~1cnpj~1v1~1{cnpj}/get) ou qualquer outro endpoint público.
- Editar Fornecedor: A edição de um fornecedor está disponivel em PATCH http://app.localhost:8000/api/suppliers/{id}

## Tecnologias a serem utilizadas
- Framework Laravel (PHP) 9.x ou superior
- MySQL ou Postgres
> O body da requisição aceita todos os parametros do create.

## Critérios de Avaliação
- Adesão aos requisitos funcionais e técnicos.
- Qualidade do código, incluindo organização, padrões de desenvolvimento e segurança.
- Documentação do projeto, incluindo um README detalhado com instruções de instalação e operação.

## Bônus
- Implementação de Repository Pattern.
- Implementação de testes automatizados.
- Dockerização do ambiente de desenvolvimento.
- Implementação de cache para otimizar o desempenho.

## Entrega
- Para iniciar o teste, faça um fork deste repositório; Se você apenas clonar o repositório não vai conseguir fazer push.
- Crie uma branch com o nome que desejar;
- Altere o arquivo README.md com as informações necessárias para executar o seu teste (comandos, migrations, seeds, etc);
- Depois de finalizado, envie-nos o pull request;
> Nenhum campo é obrigatorio mas document e email serão validados caso enviados.

- Excluir Fornecedor: A exclusão de um fornecedor está disponivel em DELETE http://app.localhost:8000/api/suppliers/{id}

- Buscar por dados de um cnpj em API externa: É possivel fazer uma busca por dados de um cnpj no endpoint GET http://app.localhost:8000/api/externalsearch/{cnpj}
26 changes: 26 additions & 0 deletions container/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/storage/pail
/vendor
.env
.env.backup
.env.production
.phpactor.json
.phpunit.result.cache
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
/auth.json
/.fleet
/.idea
/.nova
/.vscode
/.zed
mysqldata
/docker/caddy/data
/docker/caddy/config
77 changes: 77 additions & 0 deletions container/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Laravel Docker Setup

Serviços docker para desenvolvimento em Laravel:

- **PHP-FPM (8.3)**
- **MySQL (8)**
- **Redis**
- **MailHog**

Voçê pode escolher entre 2 tipos de servidor web

- **Nginx (Alpine)**
- **Caddy** (Possui suporte automatico a SSL local)

---

## Software obrigatório

- [docker](https://docs.docker.com/engine/install/)
- [docker compose](https://docs.docker.com/compose/install/)

## 📦 Comandos a serem executados

Escolha entre o nginx ou caddy para a criação dos serviços:

```bash
cd container
sudo PWD=${PWD} HTTP_PORT=8000 docker compose -f docker-compose.caddy.yml up -d --build
ou
sudo PWD=${PWD} HTTP_PORT=8000 docker compose -f docker-compose.nginx.yml up -d --build
```

> Dependendo de como o docker foi instalado o comando **docker compose** pode ser subtituido por **docker-compose**

> Caso apareça algum problema de permissão ao acessar o sistema rode os comandos:

```bash
sudo docker exec -it laravel_php sh
chmod 755 -R *
exit
```

> Foram encontrados erros de permissão usando o WSL tanto nos arquivos como na parte de network. É recomendado rodar em uma maquina linux.

---

Instalando as dependências do projeto:

```bash
sudo docker exec laravel_php composer install --no-dev --optimize-autoloader
cp ./app/.env.example ./app/.env
sudo docker exec laravel_php php artisan key:generate
sudo docker exec laravel_php php artisan migrate
```

Assim que finalizado o migrate o sistema estará disponivel em [http://app.localhost:8000](http://app.localhost:8000).

> Para o servidor web caddy a url será reescrita para [https://app.localhost](https://app.localhost) e irá emitir que a conexão não é segura e basta ignorar pois é comum para certificados self-signed.

---

Para rodar os testes seguem os comandos

```bash
sudo docker exec laravel_php composer install
cp ./app/.env.example ./app/.env
sudo docker exec laravel_php php artisan key:generate
sudo docker exec laravel_php php artisan migrate
sudo docker exec laravel_php php artisan test
```

---

Outros endereços que podem ser utilizados para auxiliar no desenvolvimento com o laravel.

- [PHPMyAdmin](http://phpmyadmin.localhost:8000)
- [MailHog](http://mailhog.localhost:8000)
18 changes: 18 additions & 0 deletions container/app/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
root = true

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

[*.md]
trim_trailing_whitespace = false

[*.{yml,yaml}]
indent_size = 2

[docker-compose.yml]
indent_size = 4
66 changes: 66 additions & 0 deletions container/app/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
APP_NAME=Laravel
APP_ENV=development
APP_KEY=
APP_DEBUG=true
APP_TIMEZONE=America/Manaus
APP_URL=http://app.localhost

APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US

APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database

PHP_CLI_SERVER_WORKERS=4

BCRYPT_ROUNDS=12

LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null

BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database

CACHE_STORE=database
CACHE_PREFIX=

MEMCACHED_HOST=127.0.0.1

REDIS_CLIENT=predis
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_SCHEME=null
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_FROM_ADDRESS="laravel@app.localhost"
MAIL_FROM_NAME="${APP_NAME}"

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

VITE_APP_NAME="${APP_NAME}"
11 changes: 11 additions & 0 deletions container/app/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
* text=auto eol=lf

*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php

/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore
25 changes: 25 additions & 0 deletions container/app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/storage/pail
/vendor
.env
.env.backup
.env.production
.phpactor.json
.phpunit.result.cache
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
/auth.json
/.fleet
/.idea
/.nova
/.vscode
/.zed
.composer
.php-cs-fixer.cache
Loading