Este teste é a resolução do seguinte desafio: DESAFIO MOTOCA
Este README detalha a aplicação back-end desenvolvida para o desafio de contratação da Motoca Systems, na vaga de Desenvolvedor Back-End. A aplicação segue as especificações fornecidas, utilizando Laravel e PostgreSQL para implementar uma API CRUD para as entidades "Produtos" e "Categorias". Observe a existência de duas branchs, em especial a branch dev.
- Produtos
- Categorias
- Criar
- Ler (todos os produtos e por ID)
- Atualizar
- Deletar
- Criar
- Ler (todas as categorias e por ID)
- Atualizar
- Deletar
Cada produto pertence a uma categoria (chave estrangeira categoria_id na tabela produtos). Cada categoria pode ter vários produtos.
Para este projeto usou-se Docker Sail
- Clone este repositório:
git clone https://github.com/andrepfdev/teste-motocaSystems-backEnd
; - Entre no diretório do projeto localmente:
cd teste-motocaSystems-backEnd
; - Instale as dependências do projeto:
composer install
; Talvez precise rodar primeiro:composer update
; - Configure o arquivo
.env
com as informaçẽos de banco de dados que informei abaixo; - Incie o ambiente Docker com o comando:
./vendor/bin/sail up -d
; - Execute as migrations do banco de dados:
./vendor/bin/sail artisan migrate
; - Popule o banco de dados com os dados iniciais:
./vendor/bin/sail artisan db:seed
.
Observe os dados configurados nos arquivos docker-compose.yml
e .env
que possui, além do PostgreSQL, o gerenciador pgAdmin4
.
nº | Images |
---|---|
1 | Laravel 10 |
2 | PostgreSQL |
3 | pgAdmin 4 |
-> URL: http://localhost:5050
-> User: admin@admin.com
-> Passord: admin
DB_CONNECTION=pgsql
DB_HOST=pgsql
DB_PORT=5432
DB_DATABASE=laravel
DB_USERNAME=sail
DB_PASSWORD=password
http://localhost/api/produtos
http://localhost/api/categorias
Link para o arquivo de testes: Download
Documento Postman: Clique aqui.
Foram definidos os models:
- Category
- Product
Onde em Category existe a função products
que possibilita a relação um para muitos (hasMany
). E em Product, há a função category
, estabelecendo a relação belongsTo
, possibilitando a relação entre o produto e a categoria.
As migrations para Categorias e Produtos foram definidas usando apenas o essencial proposto no desafio, organizado e claro para que se possa fazer alterações sem perda de produtividade.
- create_categories_table
- create_products_table
Para popular o banco de dados corretamente e possibilitar usar e entender melhor como este projeto funciona, seeders foram criados:
- CategorySeeder
- ProductSeeder
Há dois controllers, sendo eles:
- CategoryController
- ProductController
Na branch master as regras estão definidas no controller, contudo, na branch dev houve separação da lógica para Services.
Existe uma paginação simples tanto em Categorias quanto para Produtos, mas pode ser alterado para uma paginação completa alterando os controllers.
Para a alteração em ambos métodos index, muda-se simplePaginate()
para paginate()
.
Seguindo a documentação Laravel 10, optou-se por definir as rotas da seguinte maneira:
Route::apiResource('/produtos', ProductController::class);
Route::apiResource('/categorias', CategoryController::class);
Desta forma, além do código ficar mais simples e produtivo, apiResource se encarrega de devolver o status code correto para cada requisição solicitada.
Para facilicar o processo de validação dos dados, usou-se requests, sendo eles:
- StoreCategoryRequest
- StoreProductRequest
Como sugere a documentação do Laravel, usou-e API Resources para que os modelos do Eloquent trabalhe com as respostas JSON de forma mais acertiva.
- CategoryResource
- ProductResource
Fico feliz em ter participado deste processo seletivo. Meus números de contato são: (98) 98569-4325 e (99) 99193-2001
Tenho bastante vontade de aprender mais. Desejo trabalhar com uma equipe que me ajude a crescer na área. Aceito, inclusive, vaga de estágio.