Skip to content

Latest commit

 

History

History
552 lines (376 loc) · 13.9 KB

README.md

File metadata and controls

552 lines (376 loc) · 13.9 KB

Agility Logo

Agility Labs - Teste Desenvolvedor Backend

Api para gerenciamento de imóveis, onde os usuários podem criar, cadastrar, atualizar, excluir e listar lojas. A aplicação oferece recursos de validação de endereço usando a API ViaCEP e também validação de e-mail do usuário.

A integração com a API ViaCEP garante a precisão e a validade dos endereços fornecidos. Além disso, a validação de e-mail ajuda a manter a integridade dos dados e a garantir a autenticidade dos usuários.

Sumário

  1. Estrutuda do Projeto

  2. Tecnologias Utilizadas

  3. Funcionalidades

  4. Estrutura do Banco de Dados

  5. Pré-requisitos

  6. Instalação e Configuração

  7. Rotas e uso

  8. Obervações

  9. Contribuição

Estrutuda do Projeto

A estrutura adotada segue o padrão MVC (Model-View-Controller) que é o padrão de arquitetura de software amplamente utilizado no Laravel. Essa estrutura promove a separação clara de responsabilidades entre as camadas de modelo, visualização e controle.

O projeto foi organizado em módulos, seguindo uma abordagem de separação por casos de uso. Cada caso de uso é implementado em um conjunto de classes relacionadas, como controladores, modelos, serviços e validações, etc. Essa organização modular ajuda a manter o código limpo, escalável e de fácil manutenção.

Tecnologias Utilizadas

Funcionalidades

  • Criação de Usuários.

  • Autenticação de Usuários.

  • Validação de email de Usuários.

  • Login e Logout.

  • Criação, edição e exclusão de lojas.

  • Verificação de permissão antes de excluir ou editar lojas.

  • Listagem de todas as lojas cadastradas e listagem de lojas pertencentes ao usuário.

Estrutura do Banco de Dados

Esquema do Banco de Dados


Pré-requisitos

  • PHP 8.2 (versão ^8.1) - O Laravel requer a versão 8.1 ou superior. Você pode verificar a versão do PHP executando o comando php -v no terminal.

  • Composer (versão 2.5.8) - O Composer é uma ferramenta de gerenciamento de dependências para PHP.

  • Banco de Dados - Para este projeto foi escolhido o mysql. O Laravel suporta vários bancos de dados, como MySQL, PostgreSQL, SQLite e SQL Server.

    • MySQL (versão ^8.0) - Instale o MySQL (não é nescessário caso use Docker). Você pode baixar a versão adequada para o seu sistema operacional no site oficial do MySQL.

Instalação e Configuração

Obs: Caso utilize docker siga para o passo a passo de configuração com Docker. Caso contrário, siga a configuração normal da aplicação abaixo.


Configuração

  1. Clone o repositório.
git clone https://github.com/mauricioccardoso/agility-labs.git
  1. Acesse o diretório do projeto e abra o projeto na sua IDE ou editor de texto.
cd agility-labs
  1. Na pasta "backend", copiar o arquivo ".env.example" e renomear para ".env".

  2. Alterar a configuração do banco de dados do arquivo ".env" para as configurações do banco de dados instalado na sua máquina.

    • Importante que você crie um DataBase na sua ferramenta de banco de dados.
    • Exemplo do mysql:
# Normal DataBase Configuration

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=agilityDatabase
DB_USERNAME=root
DB_PASSWORD=mypassword
  1. Configurar as variáveis de email, conforme seu sistema de email. Exemplo:
# Email configs

MAIL_MAILER=mailer
MAIL_HOST=host
MAIL_PORT=0000
MAIL_USERNAME=username
MAIL_PASSWORD=mypassword
MAIL_ENCRYPTION=tsl
MAIL_FROM_ADDRESS="my.email@mail.com"

MAIL_FROM_NAME="${APP_NAME}"
  1. Utilizar o comando abaixo para fazer a intalação das dependências do laravel.
composer install
  1. Caso o laravel não gere um chave, usar o comando para gerar uma nova chave de criptografia
php artisan key:generate
  1. Executar o comando para criar tabelas
php artisan migrate
  1. Utilizar um servidor para disponibilizar a aplicação.
    • Dica: Utilizar o comando "php artisan serve --host=localhost --port=8080".

Configuração com docker

  1. Clone o repositório.
git clone https://github.com/mauricioccardoso/agility-labs.git
  1. Acesse o diretório do projeto e abra o projeto na sua IDE ou editor de texto.
cd agility-labs
  1. Na pasta "backend", copiar o arquivo ".env.example" e renomear para ".env".

  2. Descomentar o código e definir o "username" e "password" conforme a configuração no arquivo docker-compose.yaml

# Docker Database Configuration

DB_CONNECTION=mysql
DB_HOST=db-agility-mysql
DB_PORT=3306
DB_DATABASE=agility
DB_USERNAME=agilityTest                  # Set a user equal to the one configured in the docker-compose.yaml file
DB_PASSWORD=mypassword                  # Set a password equal to the one configured in the docker-compose.yaml file
  1. Configurar as variáveis de email, conforme seu sistema de email. Exemplo:
# Email configs

MAIL_MAILER=mailer
MAIL_HOST=host
MAIL_PORT=0000
MAIL_USERNAME=username
MAIL_PASSWORD=mypassword
MAIL_ENCRYPTION=tsl
MAIL_FROM_ADDRESS="my.email@mail.com"

MAIL_FROM_NAME="${APP_NAME}"
  1. Na raiz do projeto. Utilizar o comando abaixo para subir o container do docker e aguardar a finalização.
docker compose up -d
  1. Verificar se o container e servidor estão funcionando.

    Server Status - http://localhost:8081/


Rotas e Uso

A API oferece várias rotas para interagir com os dados das Lojas. A seguir, estão detalhadas as informações sobre cada rota, sua estrutura e exemplos de uso.

  1. Verificação do status do servidor

    • Rota: GET /
  2. Criação de usuário

    • Rota: POST /api/users

    • Headers:

      • Content-Type: application/json

      • Accept: application/json

    • Corpo da requisição

    {
        "name": "User Test",
        "email": "user.test@mail.com",
        "password": "Abc1234",
        "password_confirmation": "Abc1234"
    }
    • Resposta de sucesso
    {
        "user": {
            "name": "User Test",
            "email": "user.test@mail.com",
            "updated_at": "2023-07-14T00:34:49.000000Z",
            "created_at": "2023-07-14T00:34:49.000000Z",
            "id": 1
        },
        "message": "Please check your email to confirm that this email address belongs to you."
    }
  3. Realização de login de usuário

    • Rota: POST /api/login

    • Headers:

      • Content-Type: application/json

      • Accept: application/json

    • Corpo da requisição

    {
        "email": "user.test@mail.com",
        "password": "Abc1234"
    }
    • Resposta de sucesso
    {
        "user": {
            "id": 1,
            "name": "User Test",
            "email": "<user.test@mail.com>",
            "isAdmin": 0,
            "created_at": "2023-07-14T00:34:49.000000Z",
            "updated_at": "2023-07-14T00:34:49.000000Z"
        },
        "token": "1|1234abcdWoQx4w8Ft5zERd12146IkRUw3XhrqllR"
    }
  4. Realização de logout do usuário

    • Rota: POST /api/logout

    • Headers:

      • Authorization: Bearer {token}

      • Accept: application/json

    • Corpo da requisição

    {
        "email": "user.test@mail.com",
        "password": "Abc1234"
    }
    • Resposta de sucesso
    {
        "message": "Logout successful."
    }
  5. Reenvio de Email de validação

    • Rota: GET /api/email/resend-verification-notification

    • Headers:

      • Authorization: Bearer {token}

      • Accept: application/json

    • Resposta de sucesso

    {
        "message": "Email resent."
    }
  6. Criação de uma loja

    • Rota: POST /api/stores

    • Headers:

      • Authorization: Bearer {token}

      • Content-Type: application/json

      • Accept: application/json

    • Corpo da requisição

      {
          "name": "Empresa Sem Descrição e sem complemento de endereço",
          "cnpj": "00.000.000/0000-01",
          "store_address": {
              "cep": "01001-000",
              "number": 1000,
              "street": "Praça da Sé",
              "neighborhood": "",
              "city": "São Paulo",
              "state": "SP"
          }
      }
    • Resposta de sucesso

      {
          "id": 1,
          "name": "Empresa Sem Descrição e sem complemento de endereço",
          "description": null,
          "cnpj": "00.000.000\/0000-01",
          "created_at": "2023-07-14T00:51:53.000000Z",
          "updated_at": "2023-07-14T00:51:53.000000Z",
          "store_address": {
              "id": 1,
              "cep": "01001-000",
              "number": 1000,
              "street": "Praça da Sé",
              "complement": null,
              "neighborhood": "",
              "city": "São Paulo",
              "state": "SP",
              "store_id": 1
          }
      }
  7. Edição de Loja

    • Rota: PUT /api/stores/{id}

    • Headers:

      • Authorization: Bearer {token}

      • Content-Type: application/json

      • Accept: application/json

    • Corpo da requisição

    {
        "name": "Empresa Com Descrição e complemento de endereço Updated",
        "description": "Updated description",
        "cnpj": "00.000.000/0000-02",
        "store_address": {
            "cep": "01001-000",
            "number": 1000,
            "street": "Praça da Sé",
            "complement": "Updated Complement",
            "neighborhood": "",
            "city": "São Paulo",
            "state": "SP"
        }
    }
    • Resposta de sucesso - (Status 204)
  8. Listagem de todas as lojas

    • Rota: GET /api/stores

    • Headers:

      • Authorization: Bearer {token}

      • Accept: application/json

    • Resposta de sucesso

    [
        {
            "id": 1,
            "name": "Empresa Com Descrição e complemento de endereço Updated",
            "description": "Updated description",
            "cnpj": "00.000.000\/0000-02",
            "created_at": "2023-07-14T00:51:53.000000Z",
            "updated_at": "2023-07-14T00:53:14.000000Z",
            "store_address": {
                "id": 1,
                "cep": "01001-000",
                "number": 1000,
                "street": "Praça da Sé",
                "complement": "Updated Complement",
                "neighborhood": "",
                "city": "São Paulo",
                "state": "SP",
                "store_id": 1
            }
        },
        {
            "id": 2,
            ...
        },
        ...
    ]
  9. Listagem de todas as lojas de usuário logado

    • Rota: GET /api/stores/my-stores

    • Headers:

      • Authorization: Bearer {token}

      • Accept: application/json

    • Resposta de sucesso

    [
        {
            "id": 4,
            "name": "Empresa Com Descrição e complemento de endereço",
            "description": "description",
            "cnpj": "00.000.000\/0000-04",
            "created_at": "2023-07-14T00:51:53.000000Z",
            "updated_at": "2023-07-14T00:53:14.000000Z",
            "store_address": {
                "id": 1,
                "cep": "01001-000",
                "number": 1000,
                "street": "Praça da Sé",
                "complement": "Complement",
                "neighborhood": "",
                "city": "São Paulo",
                "state": "SP",
                "store_id": 1
            }
        },
        {
            "id": 5,
            ...
        },
        ...
    ]
  10. Deleção de uma loja

    • Rota: DELETE /api/stores/{id}

    • Headers:

      • Authorization: Bearer {token}
    • Resposta de sucesso - (Status 204)

Obervações

  • Após a criação de usuário, será enviado um email para o email do usuário, onde o usuário deverá clicar no link para confirmar que o email pertence ao usuário.

  • Ao usuário realizar o login, a api fornecerá um token de autenticação que deve ser enviado no header para validar o usuário.

  • A rota de logout deve receber o token. Não se faz nescessário ter verificado o email antes.

  • As rotas de criação, edição, listagens e exclusão devem receber o token para autenticação do usuário, bem como é nescessário fazer a validação do email do usuário anteriormente.

  • O projeto contém um arquivo "Insomnia_2023-07-13.json" com todas as rotas já configuradas, que pode ser importado para o aplicativo do Insomnia.


Contribuição