Skip to content

Crud de Produtos e Usuários com Autenticação JWT, Database Seeding, Tratamento de Dados com Resources.Filtragem de Campos pela URL, Validações FormRequest, ...

Notifications You must be signed in to change notification settings

Paulo-Pacheco-Junior/rest-api-laravel

Repository files navigation

Laravel Logo

CRUD feito com API REST

Projeto Nível Iniciante / Intermediário

  • Database seeding
  • Endpoints de Users, Products e Auth(login, logout...)
  • Tratamento de dados com Resources
  • Validação FormRequest,
  • Filtragem de Campos(fields) pela URL,
  • Autenticação e Autorização JWT (utilizando o pacote tymon/jwt-auth),

Instalação

Clone o projeto:

git clone «URL DO REPOSITÓRIO»

Uma vez clonado, abra na pasta do projeto:

cd «DIR DO PROJETO»

Dentro da pasta do projeto, crie o arquivo .env e copie o arquivo .env.example para o .env. Agora, modifique o .env inserindo as credenciais do seu banco de dados.

DB_CONNECTION=mysql
DB_HOST=«ENDEREÇO DO SEU BANCO DE DADOS»
DB_PORT=3306
DB_DATABASE=«NOME DO SEU BANCO DE DADOS»
DB_USERNAME=«USUÁRIO DO SEU BANCO DE DADOS»
DB_PASSWORD=«SENHA PARA O USUÁRIO»

Por exemplo:

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

Agora, instale o projeto:

composer install
php artisan key:generate
php artisan jwt:secret
php artisan migrate --seed
php artisan serve

Explicando o Projeto

Vamos definir a URL base http://127.0.0.1:8000 (a porta 8000, ou host 127.0.0.1 podem ser diferentes conforme a configuração do seu ambiente)
Todas as Requisições HTTP que irão interagir com os recursos da API utilizarão a combinação da URL base + Endpoint (Essa combinação se chama URI)
Se combinarmos a URL base http://127.0.0.1:8000 e o endpoint /api/products
formaremos a URI http://127.0.0.1:8000/api/products
Agora que deixei claro que não desconheço os termos técnicos. Para simplificar as explicações, sempre que formos fazer requisições irei mencionar apenas o Endpoint

Então vamos à Prática!

  1. Abra o Postman e Digite a Base URL,
    Base URL = http://127.0.0.1:8000,
  2. Selecione o Verbo/Método(GET,POST,PUT,DELETE),
  3. Acrescente o Endpoint,
  4. Clique em Send/Enviar
            'REQUISICOES DE PRODUTOS'=> [
                ['Exibir Todos os Produtos' => ['Verbo: GET', 'Endpoint: /api/products']],
                ['Criar um Novo Produto' => ['Verbo: POST', 'Endpoint: /api/products']],
                ['Exibir Apenas um Produto' => ['Verbo: GET', 'Endpoint: /api/products/{product}']],
                ['Atualizar um Produto' => ['Verbo: PUT', 'Endpoint: /api/products/{product}']],
                ['Deletar um Produto' => ['Verbo: DELETE', 'Endpoint: /api/products/{product}']]
            ],
            'REQUISICOES DE USUARIOS'=> [
                ['Exibir Todos os Usuários' => ['Verbo: GET', 'Endpoint: /api/users']],
                ['Criar um Novo Usuário' => ['Verbo: POST', 'Endpoint: /api/users']],
                ['Exibir Apenas um Usuário' => ['Verbo: GET', 'Endpoint: /api/users/{user}']],
                ['Atualizar um Usuário' => ['Verbo: PUT', 'Endpoint: /api/users/{user}']],
                ['Deletar um Usuário' => ['Verbo: DELETE', 'Endpoint: /api/users/{user}']]
            ],
            'REQUISICOES DE AUTENTICACAO'=> [
                ['Entrar na conta do Usuário' => ['Verbo: POST', 'Endpoint: /api/auth/login']],
                ['Sair da Conta do Usuário' => ['Verbo: POST', 'Endpoint: /api/auth/logout']],
                ['Atualizar o Token de Acesso do Usuário' => ['Verbo: POST', 'Endpoint: /api/auth/refresh']],
                ['Mostrar Dados do Usuário' => ['Verbo: POST', 'Endpoint: /api/auth/me']]
            ],

Endpoints de Users, Products e Auth(login, logout...)

No Postman:

Para Exibir Todos os Produtos:

  1. Faça uma Requisição com o verbo GET e Endpoint /api/products
Irão aparecer 10 Produtos, logo abaixo, com seus valores e as chaves:
  • 'id'
  • 'title'
  • 'url'
  • 'price'
  • 'description'
  • 'created_at'
  • 'updated_at'

Para Criar um Novo Produto:

  1. Abra uma nova aba HTTP(‘File’, depois ‘New…’ e depois ‘HTTP’)
  2. Clique em ‘Body’ e em seguida ‘x-www-form-urlencoded’
  3. Preencha as Keys(chaves) (‘title’,’url’,’price’,’description’) e os Values(valores) que você deseja Criar
Por exemplo:
  • title: Teste
  • url: www.teste.com
  • price: 100.00 (Para fração use '.' e não ',')
  • description: Meu primeiro teste
4. Faça uma Requisição com o verbo POST e Endpoint /api/products


Para Exibir Apenas um Produto:

  1. Substitua {product}, no final do Endpoint, pelo Número do ID do Produto que você deseja Exibir
  2. Faça uma Requisição com o verbo GET e Endpoint /api/products/{product}
Por exemplo:
  • GET e Endpoint /api/products/8 irá Exibir o Produto que tem o ID 8

Para Atualizar um Produto:

  1. Abra uma nova aba HTTP(‘File’, depois ‘New…’ e depois ‘HTTP’)
  2. Clique em ‘Body’ e em seguida ‘x-www-form-urlencoded’
  3. Preencha as Keys(chaves) (‘title’,’url’,’price’,’description’) e os Values(valores) que você deseja Atualizar
Por exemplo:
  • title: Teste ALTERADO
  • url: www.testealterado.com
  • price: 900.00 (Para fração não usa ',', usa '.')
  • description: Meu primeiro teste ALTERADO
  1. Substitua {product}, no final do Endpoint, pelo Número do ID do Produto que você deseja Atualizar
  2. Faça uma Requisição com o verbo PUT e Endpoint /api/products/{product}

Para Deletar um Produto:

  1. Substitua {product}, no final do Endpoint, pelo Número do ID do Produto que você deseja Deletar
  2. Faça uma Requisição com o verbo DELETE e Endpoint /api/products/{product}
Por exemplo:
  • DELETE e Endpoint /api/products/8 irá Deletar o Produto que tem o ID 8

Para Testar USUÁRIOS:

  1. No Endpoint troque 'products' por 'users'
  2. Use o MESMO PROCEDIMENTO que usou em PRODUTOS, porém as Chaves serão:
    • name
    • email
    • password

Autenticação e Autorização JWT (utilizando o pacote tymon/jwt-auth)

Para Fazer LOGIN e LOGOUT:

  1. Crie um Usuário(password precisa ter no mínimo 8 dígitos)
  2. Envie seu novo usuário via Verbo POST para o Endpoint api/auth/login
  3. Copie o Token gerado em access_token sem "aspas"
  4. Clique em Headers
  5. Crie a key Authorization
  6. Digite bearer no Value de Authorization
  7. Cole o Token logo após bearer
Por exemplo:
  • Key: Authorization
  • Value:bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vMTI3LjAuMC4xOjgwMDAvYXBpL2F1dGgvbG9naW4iLCJpYXQiOjE3MDA3NDY3NDIsImV4cCI6MTcwMDc1MDM0MiwibmJmIjoxNzAwNzQ2NzQyLCJqdGkiOiJWZ1JPZ2JqTjA2eHpxSDNYIiwic3ViIjoiMTciLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3In0.8UgJ-hZzinLgv_NYmHpoMvkkhR0FKl8zCCcsghT96fk
Pronto! Você está Logado! Agora pode acessar Todas as Rotas! As Protegidas e as Não Protegidas

Rotas Protegidas:

Route::resource('/users', UserController::class);
Route::resource('/products', ProductController::class)->except(['show']);

Rotas Não Protegidas:

Route::post('/users', [UserController::class, 'store']);

Route::get('/products', [ProductController::class, 'index']);
Route::post('/products', [ProductController::class, 'store']);
Route::get('/products/{id}', [ProductController::class, 'show']);

Filtragem de Campos(fields) pela URL:

  • Acrescente ?fields=title,url,price,description no final do Endpoint /api/products
  • Faça uma Requisição com o verbo GET e o Endpoint formado(api/products?fields=title...)
  • Retire o atributo que você não deseja exibir. Só serão exibidos os listados em fields

Database Seeding

Estes Produtos foram Populados em Massa através da:

  • Criação da Factory ProductFactory
  • Criaçao do Seeder ProductsTableSeeder
  • Execução do DatabaseSeeder

Como isso Funciona?

Simples! Como o próprio nome diz:

Factory = Fábrica
Seeder = Semeador

Factories:

Na Factory relacionamos cada chave do Produto com um faker(). Esse faker() é usado para criar valores fictícios. Podemos escolher vários formatos de faker() disponíveis na Biblioteca PHP Faker do GitHub https://github.com/fzaninotto/Faker

Exemplo: ‘url’ => fake()→url()

A Factory faz apenas isso. Só define o Formato que será construído. Tecnicamente, ela define como criar Instâncias da Classe Products

Seeders:

No Seeder nós semeamos/populamos o Banco de Dados com dados fictícios definidos na Factory
Nesse Projeto eu decidi popular 15 Instâncias/registros conforme o trecho de código abaixo:

Product::factory(15)→create();

Database Seeder:

O DatabaseSeeder é responsável por reunir todos os Seeders do Projeto e executá-los em sequência na ordem de cima para baixo. Se um Seeder depende de outro ele deve estar abaixo do que ele depende para ser executado depois.

Isso significa que quando o DatabaseSeeder for executado teremos vários Produtos Fictícios que serão fundamentais para testarmos o Projeto

About

Crud de Produtos e Usuários com Autenticação JWT, Database Seeding, Tratamento de Dados com Resources.Filtragem de Campos pela URL, Validações FormRequest, ...

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published