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.
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.
-
Insomnia (para testes das rotas)
-
Mailtrap (para testes de envio de email)
-
Drawsql (para "desenhar" banco de dados)
-
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.
-
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.
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.
- Clone o repositório.
git clone https://github.com/mauricioccardoso/agility-labs.git
- Acesse o diretório do projeto e abra o projeto na sua IDE ou editor de texto.
cd agility-labs
-
Na pasta "backend", copiar o arquivo ".env.example" e renomear para ".env".
-
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
- 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}"
- Utilizar o comando abaixo para fazer a intalação das dependências do laravel.
composer install
- Caso o laravel não gere um chave, usar o comando para gerar uma nova chave de criptografia
php artisan key:generate
- Executar o comando para criar tabelas
php artisan migrate
- Utilizar um servidor para disponibilizar a aplicação.
- Dica: Utilizar o comando "php artisan serve --host=localhost --port=8080".
- Clone o repositório.
git clone https://github.com/mauricioccardoso/agility-labs.git
- Acesse o diretório do projeto e abra o projeto na sua IDE ou editor de texto.
cd agility-labs
-
Na pasta "backend", copiar o arquivo ".env.example" e renomear para ".env".
-
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
- 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}"
- Na raiz do projeto. Utilizar o comando abaixo para subir o container do docker e aguardar a finalização.
docker compose up -d
-
Verificar se o container e servidor estão funcionando.
Server Status - http://localhost:8081/
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.
-
Verificação do status do servidor
- Rota: GET /
-
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." }
-
-
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" }
-
-
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." }
-
-
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." }
-
-
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": "Sé", "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": "Sé", "city": "São Paulo", "state": "SP", "store_id": 1 } }
-
-
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": "Sé", "city": "São Paulo", "state": "SP" } }
- Resposta de sucesso - (Status 204)
-
-
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": "Sé", "city": "São Paulo", "state": "SP", "store_id": 1 } }, { "id": 2, ... }, ... ]
-
-
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": "Sé", "city": "São Paulo", "state": "SP", "store_id": 1 } }, { "id": 5, ... }, ... ]
-
-
Deleção de uma loja
-
Rota: DELETE /api/stores/{id}
-
Headers:
- Authorization: Bearer {token}
-
Resposta de sucesso - (Status 204)
-
-
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.
-
Maurício Erick da Costa Cardoso
- Desenvolvedor FullStack - PHP LARAVEL VUE.js TYPESCRIPT NODE.js DOCKER MYSQL POSTGRESS LINUX GIT