Backend: adiciona ListMyTasksInput, ListMyTasksRequest (@BeanParam) com parâmetros text, projectId e status; novo método findTasksByUserFiltered no repositório com query dinâmica via Panache; mapper atualizado; CLAUDE.md documenta regra de DTO Request para 3+ parâmetros. Frontend: componente reutilizável TaskFilterBar (texto, projeto, status) integrado em TaskListPage e TaskBoardPage; getMyTasks() aceita filtros repassados como query params ao backend. closes #26 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .claude/skills | ||
| .github | ||
| backend | ||
| deploy | ||
| frontend | ||
| .gitignore | ||
| CLAUDE.md | ||
| GITHUB_SECRETS_CHECKLIST.md | ||
| README.md | ||
TimeTrack MVP
Minimal vertical slice for task management using:
- React + TypeScript + Tailwind CSS
- Java + Quarkus
- PostgreSQL
- Keycloak prepared for future authentication
Structure
frontend/: Vite React app with task list, task creation, and status updatesbackend/: Quarkus API with a simple Clean Architecture splitdocker-compose.yml: local PostgreSQL and Keycloak services
Run infrastructure
Start PostgreSQL and Keycloak:
docker-compose up
Services:
- PostgreSQL:
localhost:5432 - Keycloak:
http://localhost:8081 - Keycloak admin:
admin/admin
Run the backend
The backend uses the Maven wrapper generated by Quarkus.
cd backend
./mvnw quarkus:dev
Default database settings point to the local Docker PostgreSQL instance, including in the dev profile:
- database:
beetask - user:
beetask - password:
beetask - JDBC URL:
jdbc:postgresql://localhost:5432/beetask
If needed, you can override them with:
DB_URLDB_USERDB_PASSWORD
Main API endpoints:
POST /tasksPATCH /tasks/{id}/statusGET /tasks
Example create request:
curl -X POST http://localhost:8080/tasks \
-H "Content-Type: application/json" \
-d '{"name":"Prepare sprint review","description":"Collect release notes"}'
Run the frontend
cd frontend
npm install
npm run dev
The Vite dev server runs on http://localhost:5173 and proxies /api/* to the backend on http://localhost:8080.
If needed, you can override the API target with VITE_API_URL.
Architecture notes
The backend keeps the vertical slice intentionally small:
domain: task entity and status enumapplication: use cases and repository portadapter/in: REST APIadapter/out: PostgreSQL persistence with Panache
Important pragmatic decisions:
- UUIDs are generated in the application layer to keep the slice simple.
- Flyway owns schema creation with a single migration.
- Keycloak is available locally now but not integrated into the app yet.
Verification
Backend:
cd backend
./mvnw test
Frontend:
cd frontend
npm run build
Deploy automatizado
O repositório agora inclui um workflow em .github/workflows/deploy-main.yml para deploy automático quando houver push na branch main.
Fluxo:
- roda testes do backend
- roda build do frontend
- gera e publica imagens Docker no GHCR
- copia
deploy/docker-compose.prod.ymlpara o servidor - conecta via SSH na Hostinger e executa
docker compose pull && docker compose up -d
Arquivos de apoio:
backend/Dockerfile: imagem de produção do backendfrontend/Dockerfile: build do Vite + entrega por Nginxfrontend/nginx.conf: fallback SPAdeploy/docker-compose.prod.yml: stack de produçãodeploy/.env.production.example: variáveis esperadas no servidor
Secrets necessários no GitHub:
HOSTINGER_HOST: IP ou domínio do servidorHOSTINGER_PORT: porta SSH, normalmente22HOSTINGER_USER: usuário SSHHOSTINGER_SSH_KEY: chave privada SSH usada no acesso ao servidorHOSTINGER_APP_PATH: diretório remoto onde o deploy será mantido, por exemplo/home/user/apps/beetaskGHCR_USERNAME: usuário dono do pacote no GHCRGHCR_READ_TOKEN: token com permissão deread:packagespara o servidor fazer pull das imagensFRONTEND_VITE_API_URL: URL que o frontend usará para a API, por exemplohttps://api.seudominio.comou/apiPOSTGRES_USERPOSTGRES_PASSWORDDB_URL: JDBC URL completa do banco, por exemplojdbc:postgresql://203.0.113.10:5432/beetaskMP_JWT_VERIFY_ISSUERSMALLRYE_JWT_SIGN_KEY_LOCATIONMP_JWT_VERIFY_PUBLICKEY_LOCATION
Pré-requisitos no servidor:
- Docker instalado
- Docker Compose plugin disponível via
docker compose - pasta definida em
HOSTINGER_APP_PATHcom permissão de escrita para o usuário SSH - caso as imagens GHCR sejam privadas, o
GHCR_READ_TOKENprecisa conseguir fazer pull
Observações:
- o workflow usa a tag
latestpara o deploy em produção - a rota do frontend no container está exposta na porta
3000do servidor e o backend na8080; normalmente você vai colocar Nginx, Caddy ou o proxy da Hostinger na frente dessas portas - se quiser servir frontend e backend em domínios diferentes, ajuste
FRONTEND_VITE_API_URL