Esta é uma aplicação web desenvolvida em PHP utilizando o framework Laravel para gerenciar contatos. A aplicação permite a adição, busca, atualização e remoção de contatos, além de integrar com a API ViaCEP para validar endereços.
- SOLID: A aplicação segue os princípios SOLID para garantir que o código seja escalável, manutenível e de fácil compreensão.
- Clean Architecture: A arquitetura da aplicação é baseada no conceito de Clean Architecture, separando as preocupações e facilitando testes e manutenção.
- Repository Pattern: Utiliza-se o padrão Repository para abstrair a lógica de acesso a dados, permitindo uma maior flexibilidade e testabilidade.
- Data Transfer Object (DTO): Os objetos de transferência de dados (DTO) são utilizados para encapsular os dados que serão transferidos entre as camadas da aplicação.
- Integração com API: A aplicação integra-se com a API Via CEP para validar e obter informações de endereço a partir do CEP fornecido pelo usuário.
- API RESTful com Maturidade de Richardson e HATEOAS: Os endpoints da API são projetados seguindo os princípios RESTful e incorporam a maturidade de Richardson para oferecer diferentes níveis de abstração. Além disso, implementamos HATEOAS para fornecer links que permitem a navegação entre recursos relacionados, melhorando a interatividade e a descoberta da API.
Antes de começar, verifique se você possui as seguintes ferramentas instaladas em sua máquina:
git clone https://github.com/Gierdiaz/Agenda.git
cd Agenda
Copie o arquivo .env.example e renomeie-o para .env. Configure as variáveis de ambiente conforme necessário.
- Linux/macOS:
cp .env.example .env
- Windows (CMD):
copy .env.example .env
Exemplo para configurar as seguintes variáveis de ambiente para o banco de dados MySQL:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=application
DB_USERNAME=root
DB_PASSWORD=root
Para construir a imagem Docker e iniciar todos os serviços, execute:
docker-compose up --build -d
Para instalar as dependências do Composer, execute:
docker exec app composer install
Use o Artisan para gerar uma nova chave de criptografia
docker-compose exec app php artisan key:generate
Após a construção e inicialização dos contêineres, você poderá acessar a aplicação em:
http://localhost:8000
Para parar os contêineres, você pode usar:
docker-compose down
Depois que o container do MySQL estiver em execução, você pode acessá-lo diretamente usando o seguinte comando:
docker exec -it mysql mysql -u root -p
Ao rodar esse comando, você será solicitado a inserir a senha de root que definiu no docker-compose.yml (root neste caso).
Comandos para gerenciar o banco de dados Após acessar o MySQL no container, você pode executar os seguintes comandos:
SHOW DATABASES;
CREATE DATABASE nome_do_banco;
DROP DATABASE nome_do_banco;
USE nome_do_banco;
SHOW TABLES;
Para criar as tabelas no banco de dados, execute:
docker exec app php artisan migrate:fresh --seed
Executando os Comandos do Projeto Para executar os testes e ferramentas de análise de código, utilize os seguintes comandos:
Executa os testes automatizados da aplicação usando o Pest
docker exec app ./vendor/bin/pest
Formata e verifica o código PHP da sua aplicação, garantindo que ele siga os padrões de codificação.
docker exec app ./vendor/bin/pint
Ferramenta de análise estática que ajuda a detectar erros no código antes mesmo da execução.
docker exec app ./vendor/bin/phpstan analyse --memory-limit=2G
- Método: POST
- Endpoint:
/api/auth/register
- Corpo da Requisição:
{
"name": "Nome do Usuário",
"email": "usuario@example.com",
"password": "SenhaSegura123!",
"password_confirmation": "SenhaSegura123!"
}
- Resposta:
{
"message": "User registered successfully"
}
- Método: POST
- Endpoint:
/api/auth/login
- Corpo da Requisição:
{
"email": "usuario@example.com",
"password": "SenhaSegura123!"
}
- Resposta:
{
"access_token": "TOKEN_DE_AUTENTICAÇÃO",
"token_type": "Bearer"
}
- Método: POST
- Endpoint:
/api/auth/logout
- Autenticação: Bearer Token
- Resposta:
{
"message": "Logged out successfully"
}
- Método: GET
- Endpoint:
/api/v1/contacts
- Resposta:
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000" ,
"name": "Nome do Contato",
"phone": "123456789",
"email": "contato@example.com",
"number": "10",
"cep": "22070-012",
"address": "Praia de Copacabana, Rio de Janeiro - RJ",
"links": {
"show": "/api/contacts/550e8400-e29b-41d4-a716-446655440000"
}
}
]
- Método: GET
- Endpoint:
/api/v1/contacts
- Resposta:
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Nome do Contato",
"phone": "123456789",
"email": "contato@exemplo.com",
"number": "10",
"cep": "22070-012",
"address": "Endereço, Bairro, Cidade - UF",
"links": {
"index": "/api/contacts"
}
}
- Método: GET
- Endpoint:
/api/v1/contacts/search
- Parâmetros:
name
,email
,cep
,number
- Resposta:
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Nome do Contato",
"phone": "123456789",
"email": "contato@example.com",
"number": "10",
"cep": "22070-012",
"address": "Praia de Copacabana, Rio de Janeiro - RJ"
}
]
- Método: POST
- Endpoint:
/api/v1/contacts
- Corpo da Requisição:
{
"name": "Nome do Contato",
"phone": "123456789",
"email": "contato@example.com",
"number": "10",
"cep": "01001-000"
}
- Resposta:
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Nome do Contato",
"phone": "123456789",
"email": "contato@exemplo.com",
"number": "10",
"cep": "22070-012",
"address": "Endereço, Bairro, Cidade - UF"
}
- Método: PUT
- Endpoint:
/api/v1/contacts/{id}
- Corpo da Requisição:
{
"name": "Nome Atualizado",
"phone": "987654321",
"email": "contato_atualizado@example.com",
"number": "20",
"cep": "02002-000"
}
- Resposta:
{
"message": "Contato atualizado com sucesso."
}
- Método: DELETE
- Endpoint:
/api/v1/contacts/{id}
- Resposta:
{
"message": "Contato excluído com sucesso."
}
Quando você faz um commit, o hook pre-commit executa automaticamente os testes e análises de código para ter certeza que todas as alterações irão subir sem nenhum erro. Veja um exemplo do que acontece: