API para gerenciamento de recordes pessoais de movimentos (exercícios).
- Consulta de ranking por movimento
- Paginação de resultados
- Cache com fallback em memória
- Ordenação por valor (peso) do recorde
-
Clone o repositório:
git clone https://github.com/spindart/tecnofit.git cd tecnofit
-
Instale as dependências:
composer install
-
Configure o banco de dados:
- Crie um banco de dados no MySQL chamado
tecnofit
- Edite o arquivo
config/config.php
para atualizar a conexão PDO e para que funcione o phinx (migrations e seeds):
- Crie um banco de dados no MySQL chamado
-
Execute as migrações:
composer migrate
-
Popule o banco de dados com dados iniciais:
composer seed
-
Configure o banco de dados MySQL localmente
- Crie um banco de dados chamado
tecnofit
- Configure o arquivo na pasta config/config.php com os dados para conexão PDO.
- Crie um banco de dados chamado
-
Execute as migrações e seeds:
composer migrate composer seed
-
Inicie o servidor PHP:
php -S localhost:8000 -t public
-
Acesse:
- API: http://localhost:8000/movements/1/ranking
- Documentação: http://localhost:8000/docs
-
Configure o arquivo config.php em config/config.php:
- Modifique (descomente os dados de conexão com o Docker e comente os Localhost)
-
Inicie os containers:
docker-compose up -d
-
Acesse:
- API: http://localhost/movements/1/ranking
- Documentação: http://localhost/docs
Retorna o ranking de um movimento específico, incluindo:
- Nome do movimento
- Lista ordenada de usuários
- Recorde pessoal de cada usuário
- Posição no ranking
- Data do recorde
Exemplo de resposta:
{
"movement": "Deadlift",
"ranking": [
{
"position": 1,
"user": "Jose",
"value": 190.0,
"date": "2021-01-06 00:00:00"
},
{
"position": 2,
"user": "Joao",
"value": 180.0,
"date": "2021-01-02 00:00:00"
}
]
}
.
├── config/
│ └── container.php
├── db/
│ ├── migrations/
│ └── seeds/
├── public/
│ └── index.php
├── src/
│ ├── Application/
│ ├── Domain/
│ └── Infrastructure/
└── tests/
└── Unit/
Para executar os testes unitários:
composer test
A API é documentada usando OpenAPI/Swagger. Você pode acessar a documentação de duas formas:
- Interface Swagger UI: http://localhost:8000/docs
- Especificação OpenAPI: http://localhost:8000/swagger.php
- Interface Swagger UI: http://localhost/docs
- Especificação OpenAPI: http://localhost/swagger.php
GET /movements/{id}/ranking?page=1&limit=10&only_best=false
id
(obrigatório): ID do movimentopage
(opcional): Página atual (padrão: 1)limit
(opcional): Itens por página (padrão: 10)only_best
(opcional): Retorna apenas o melhor resultado de cada usuário (default: true)
{
"movement": "Deadlift",
"ranking": [
{
"position": 1,
"user": "John",
"value": 200.0,
"date": "2021-01-01 00:00:00",
"user_id": 4
}
],
"pagination": {
"current_page": 1,
"per_page": 10,
"total_items": 50,
"total_pages": 5
}
}
- PHP 8.0+
- MySQL 5.7
- Redis
- Docker
- Slim Framework
- PHPUnit