An open API service indexing awesome lists of open source software.

https://github.com/andrepfdev/teste-motocasystems-backend

Meu desafio Backend Junior para a Motoca - Laravel 10
https://github.com/andrepfdev/teste-motocasystems-backend

docker laravel laravel10 mariadb php php8

Last synced: 3 months ago
JSON representation

Meu desafio Backend Junior para a Motoca - Laravel 10

Awesome Lists containing this project

README

          

Laravel Logo

# Teste Motoca BackEnd

Este teste é a resolução do seguinte desafio: DESAFIO MOTOCA

## API Laravel 10

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**.

### Funcionalidades

#### Entidades:
- Produtos
- Categorias

#### Operações CRUD:
##### Produtos:
- Criar
- Ler (todos os produtos e por ID)
- Atualizar
- Deletar

##### Categorias:
- Criar
- Ler (todas as categorias e por ID)
- Atualizar
- Deletar

#### Relacionamento:

Cada produto pertence a uma categoria (chave estrangeira **categoria_id** na tabela produtos).
Cada categoria pode ter vários produtos.

## Instalação

Para este projeto usou-se **Docker Sail**

1. Clone este repositório: `git clone https://github.com/andrepfdev/teste-motocaSystems-backEnd`;
2. Entre no diretório do projeto localmente: `cd teste-motocaSystems-backEnd`;
3. Instale as dependências do projeto: `composer install`; Talvez precise rodar primeiro: `composer update`;
4. Configure o arquivo **`.env`** com as informaçẽos de banco de dados que informei abaixo;
5. Incie o ambiente Docker com o comando: `./vendor/bin/sail up -d`;
6. Execute as migrations do banco de dados: `./vendor/bin/sail artisan migrate`;
7. 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 |

#### pgAdmin4
-> URL: http://localhost:5050
-> User: admin@admin.com
-> Passord: admin

![pgadmin4](https://github.com/andrepfdev/teste-motocaSystems-backEnd/assets/49399742/f74ba3dc-fb2d-4a76-bcb8-e7c77a2606bc)

#### Banco de dados:
DB_CONNECTION=pgsql
DB_HOST=pgsql
DB_PORT=5432
DB_DATABASE=laravel
DB_USERNAME=sail
DB_PASSWORD=password

### Endpoints

```
http://localhost/api/produtos

http://localhost/api/categorias
```

## Postman Teste

![postman doc](https://github.com/andrepfdev/teste-motocaSystems-backEnd/assets/49399742/7d46c864-acb8-4c62-92e2-c4248f18b9ef)

Link para o arquivo de testes: Download

Documento Postman: Clique aqui.

## Observações sobre o projeto:

### Models
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.

### Migrations
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

### Seeders
Para popular o banco de dados corretamente e possibilitar usar e entender melhor como este projeto funciona, seeders foram criados:

- CategorySeeder
- ProductSeeder

### Controllers
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**.

### Paginate
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()`.

### Routes
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.

### Requests
Para facilicar o processo de validação dos dados, usou-se requests, sendo eles:

- StoreCategoryRequest
- StoreProductRequest

### API Resources
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.