{"id":29133104,"url":"https://github.com/bnkcodes/newway-challenge-api","last_synced_at":"2025-06-30T07:02:27.282Z","repository":{"id":301012836,"uuid":"1005843380","full_name":"bnkcodes/newway-challenge-api","owner":"bnkcodes","description":"API desenvolvida em Nest.js para o desafio da New Way, com gerenciamento de usuários e tarefas.","archived":false,"fork":false,"pushed_at":"2025-06-24T17:36:02.000Z","size":393,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-24T18:42:09.516Z","etag":null,"topics":["docker","nestjs","restful-api","terraform","typescript"],"latest_commit_sha":null,"homepage":"http://newway-challenge-alb-499076483.sa-east-1.elb.amazonaws.com/doc/api","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bnkcodes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-20T23:37:04.000Z","updated_at":"2025-06-24T17:36:06.000Z","dependencies_parsed_at":"2025-06-24T18:42:19.780Z","dependency_job_id":"910fffe2-2b14-436a-8ca0-8e2a1c8ac1ab","html_url":"https://github.com/bnkcodes/newway-challenge-api","commit_stats":null,"previous_names":["bnkcodes/newway-challenge-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bnkcodes/newway-challenge-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnkcodes%2Fnewway-challenge-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnkcodes%2Fnewway-challenge-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnkcodes%2Fnewway-challenge-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnkcodes%2Fnewway-challenge-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bnkcodes","download_url":"https://codeload.github.com/bnkcodes/newway-challenge-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bnkcodes%2Fnewway-challenge-api/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262727708,"owners_count":23354665,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","nestjs","restful-api","terraform","typescript"],"created_at":"2025-06-30T07:01:59.439Z","updated_at":"2025-06-30T07:02:27.266Z","avatar_url":"https://github.com/bnkcodes.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# New Way Challenge - API de Gerenciamento de Tarefas\n\nAPI desenvolvida em Nest.js para o desafio da New Way, com gerenciamento de usuários e tarefas.\n\n---\n\n## Tecnologias\n- Nest.js (TypeScript)\n- PostgreSQL + Prisma ORM\n- Docker\n- AWS ECS, RDS, Secrets Manager, Terraform\n\n---\n\n## Documentação da API\n\nA API possui documentação interativa via Swagger/OpenAPI que permite:\n\n- **Visualizar todos os endpoints** disponíveis\n- **Testar as requisições** diretamente no navegador\n- **Ver exemplos de payloads** de entrada e saída\n- **Consultar códigos de resposta** e mensagens de erro\n\n### Acesso à Documentação\n\n**Desenvolvimento Local:**\n```\nhttp://localhost:3000/doc/api\n```\n\n**Produção:**\n```\nhttp://newway-challenge-alb-499076483.sa-east-1.elb.amazonaws.com/doc/api\n```\n\n\u003e **Dica:** Use a documentação Swagger para explorar e testar todos os endpoints da API de forma interativa.\n\n---\n\n## Autenticação e Permissões\n\n### Autenticação\n- Autenticação via JWT.\n- Após login, use o token JWT no header:\n  ```\n  Authorization: Bearer \u003ctoken\u003e\n  ```\n- O token é necessário para acessar rotas protegidas (tarefas, perfil, etc).\n\n### Perfis e Permissões\n\nA API possui dois níveis de acesso com permissões específicas:\n\n#### **Usuário Comum (USER)**\n- **Gerenciar próprias tarefas:** Criar, visualizar, editar e excluir apenas suas tarefas\n- **Gerenciar próprio perfil:** Atualizar informações pessoais\n- **Acesso restrito:** Não pode ver tarefas de outros usuários\n\n#### **Administrador (ADMIN)**\n- **Todas as permissões de usuário comum**\n- **Visualizar todas as tarefas:** Lista tarefas de todos os usuários\n- **Gerenciar usuários:** Criar, listar, editar e desativar usuários\n- **Acesso total:** Pode modificar qualquer tarefa ou usuário\n\n### Tabela de Permissões por Endpoint\n\n| Endpoint | Método | USER | ADMIN | Descrição |\n|----------|--------|------|-------|-----------|\n| `/auth/login` | POST | ✅ | ✅ | Login de usuários |\n| `/users` | POST | ✅ | ✅ | Criar usuário (público) |\n| `/users` | GET | ❌ | ✅ | Listar todos os usuários |\n| `/users/:id` | GET | ❌ | ✅ | Buscar usuário específico |\n| `/users/:id` | PUT | ❌ | ✅ | Atualizar usuário |\n| `/tasks` | POST | ✅ | ✅ | Criar tarefa |\n| `/tasks` | GET | ✅* | ✅ | Listar tarefas (próprias/todas) |\n| `/tasks/:id` | GET | ✅* | ✅ | Buscar tarefa (própria/qualquer) |\n| `/tasks/:id` | PUT | ✅* | ✅ | Atualizar tarefa (própria/qualquer) |\n| `/tasks/:id` | DELETE | ✅* | ✅ | Excluir tarefa (própria/qualquer) |\n\n\u003e **Legenda:** ✅ = Permitido | ❌ = Negado | ✅* = Apenas recursos próprios\n\n### Requisitos de Senha\n- **Mínimo:** 8 caracteres\n- **Máximo:** 20 caracteres\n- **Obrigatório:** 1 letra minúscula, 1 maiúscula, 1 número, 1 caractere especial\n- **Exemplo válido:** `Senha123!`\n\n### Status das Tarefas\n- `PENDING` - Pendente\n- `IN_PROGRESS` - Em andamento\n- `COMPLETED` - Concluída\n- `CANCELLED` - Cancelada\n\n---\n\n## Exemplos de Uso\n\n### 1. Criar usuário\n```http\nPOST /users\nContent-Type: application/json\n\n{\n  \"name\": \"João Silva\",\n  \"email\": \"joao.silva@email.com\",\n  \"password\": \"Senha123!\",\n  \"passwordConfirmation\": \"Senha123!\",\n  \"phone\": \"+55 11 99999-9999\"\n}\n```\n\n**Resposta de sucesso (201):**\n```json\n{\n  \"user\": {\n    \"id\": \"uuid-do-usuario\",\n    \"name\": \"João Silva\",\n    \"email\": \"joao.silva@email.com\",\n    \"phone\": \"+55 11 99999-9999\",\n    \"imageUrl\": null,\n    \"role\": \"USER\",\n    \"createdAt\": \"2024-01-15T10:30:00.000Z\",\n    \"updatedAt\": \"2024-01-15T10:30:00.000Z\",\n    \"deletedAt\": null\n  }\n}\n```\n\n### 2. Login\n```http\nPOST /auth/login\nContent-Type: application/json\n\n{\n  \"email\": \"joao.silva@email.com\",\n  \"password\": \"Senha123!\"\n}\n```\n\n**Resposta de sucesso (200):**\n```json\n{\n  \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"user\": {\n    \"id\": \"uuid-do-usuario\",\n    \"name\": \"João Silva\",\n    \"email\": \"joao.silva@email.com\",\n    \"role\": \"USER\"\n  }\n}\n```\n\n### 3. Criar tarefa (autenticado)\n```http\nPOST /tasks\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\nContent-Type: application/json\n\n{\n  \"title\": \"Implementar autenticação JWT\",\n  \"description\": \"Criar sistema de autenticação usando JWT tokens\",\n  \"dueDate\": \"2024-02-15T23:59:59.000Z\"\n}\n```\n\n**Resposta de sucesso (201):**\n```json\n{\n  \"task\": {\n    \"id\": \"uuid-da-tarefa\",\n    \"title\": \"Implementar autenticação JWT\",\n    \"description\": \"Criar sistema de autenticação usando JWT tokens\",\n    \"status\": \"PENDING\",\n    \"dueDate\": \"2024-02-15T23:59:59.000Z\",\n    \"userId\": \"uuid-do-usuario\",\n    \"createdAt\": \"2024-01-15T10:30:00.000Z\",\n    \"updatedAt\": \"2024-01-15T10:30:00.000Z\"\n  }\n}\n```\n\n### 4. Atualizar tarefa\n```http\nPUT /tasks/uuid-da-tarefa\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\nContent-Type: application/json\n\n{\n  \"title\": \"Implementar autenticação JWT - Atualizado\",\n  \"description\": \"Sistema de autenticação JWT com refresh tokens\",\n  \"status\": \"IN_PROGRESS\",\n  \"dueDate\": \"2024-02-20T23:59:59.000Z\"\n}\n```\n\n### 5. Listar tarefas do usuário\n```http\nGET /tasks\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\n```\n\n**Resposta de sucesso (200):**\n```json\n{\n  \"tasks\": [\n    {\n      \"id\": \"uuid-da-tarefa-1\",\n      \"title\": \"Implementar autenticação JWT\",\n      \"description\": \"Criar sistema de autenticação usando JWT tokens\",\n      \"status\": \"PENDING\",\n      \"dueDate\": \"2024-02-15T23:59:59.000Z\",\n      \"userId\": \"uuid-do-usuario\",\n      \"createdAt\": \"2024-01-15T10:30:00.000Z\",\n      \"updatedAt\": \"2024-01-15T10:30:00.000Z\"\n    }\n  ],\n  \"totalCount\": 1\n}\n```\n\n### 6. Atualizar usuário\n```http\nPUT /users/uuid-do-usuario\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\nContent-Type: application/json\n\n{\n  \"name\": \"João Silva Santos\",\n  \"email\": \"joao.santos@email.com\",\n  \"phone\": \"+55 11 88888-8888\"\n}\n```\n\n### Exemplo de resposta de erro\n```json\n{\n  \"statusCode\": 400,\n  \"message\": \"O campo senha deve conter pelo menos 1 letra minúscula, 1 maiúscula, 1 número e 1 caractere especial.\"\n}\n```\n\n---\n\n## Desenvolvimento Local\n\n### Pré-requisitos\n- Docker e Docker Compose instalados\n\n### Passos principais\n1. **Clone o repositório:**\n   ```bash\n   git clone https://github.com/bnkcodes/newway-challenge-api.git\n   cd newway-challenge-api\n   ```\n2. **Configure o .env:**\n   ```bash\n   cp .env.example .env\n   # Edite o .env conforme necessário\n   ```\n3. **Suba os containers:**\n   ```bash\n   docker-compose up --build\n   # (sem -d, para ver os logs no terminal)\n   ```\n4. **Aplique as migrações e rode o seed (admin):**\n   Em outro terminal, rode:\n   ```bash\n   yarn migrate:seed\n   # Isso aplica as migrações e garante o admin no banco\n   ```\n\n### Comandos essenciais\n- **Aplique migrações e seed juntos:**\n  ```bash\n  yarn migrate:seed\n  ```\n- **Parar todos os containers:**\n  ```bash\n  docker-compose down\n  ```\n- **Iniciar novamente:**\n  ```bash\n  docker-compose up\n  ```\n- **Ver logs da aplicação:**\n  ```bash\n  docker-compose logs -f app\n  ```\n- **Abrir Prisma Studio:**\n  ```bash\n  yarn docker:studio\n  # Acesse http://localhost:5555\n  ```\n- **Executar testes:**\n  ```bash\n  yarn docker:test\n  ```\n- **Resetar banco:**\n  ```bash\n  docker-compose down -v\n  docker-compose up\n  yarn migrate:seed\n  ```\n\n---\n\n## Testes\n- Para rodar os testes automatizados:\n  ```bash\n  # Com Docker (recomendado)\n  yarn docker:test\n\n  # Localmente (requer Node.js e dependências instaladas)\n  yarn test\n  ```\n\n---\n\n## Produção (AWS)\n- O seed roda automaticamente ao subir o container e garante que o usuário admin existe/atualizado.\n- O login de admin padrão é:\n  - **E-mail:** `admin@example.com`\n  - **Senha:** `admin123`\n- Para mudar o admin, defina as variáveis de ambiente na Task Definition do ECS (ou via Terraform):\n  - `ADMIN_EMAIL` (ex: `admin@newway.com`)\n  - `ADMIN_PASSWORD` (ex: `suaSenhaForte`)\n  - `ADMIN_NAME` (opcional)\n- Após alterar as variáveis, faça um novo deploy para atualizar o admin.\n- O seed é idempotente: sempre que o container sobe, garante o admin correto.\n\n---\n\n## Estrutura do Projeto e Patterns\n\nO projeto segue princípios de **Domain-Driven Design (DDD)** e **Clean Architecture** para garantir separação de responsabilidades, testabilidade e escalabilidade.\n\n- **src/**: Código principal da aplicação\n  - **modules/**: Cada domínio (users, tasks) é um módulo independente, seguindo o padrão modular do Nest.js\n    - **application/**: Casos de uso (use-cases), DTOs e lógica de aplicação\n    - **domain/**: Entidades, repositórios e regras de negócio\n    - **infrastructure/**: Implementações concretas (banco, controllers, presenters)\n  - **shared/**: Código utilitário, providers, estratégias, decorators e infraestrutura comum\n- **prisma/**: Schema do banco de dados e seed (população inicial/admin)\n\n**Principais patterns utilizados:**\n- DDD (Domain-Driven Design)\n- Clean Architecture\n- Repository Pattern\n\n## Postman Collection\n\nPara testar a API, você pode usar a coleção do Postman incluída neste projeto.\n\n### Como usar:\n\n1. **Importar a coleção e environment**:\n   - Abra o Postman\n   - Clique em \"Import\"\n   - Selecione os arquivos:\n     - `postman/newWay-challenge.postman_collection.json`\n     - `postman/newway-challenge.postman_environment.json`\n\n2. **Selecionar o environment**:\n   - No canto superior direito do Postman, selecione o environment \"NewWay Challenge - Production\"\n   - A URL da API já está configurada\n   - As variáveis `access_token`, `user_id` e `task_id` serão preenchidas automaticamente\n\n3. **Fluxo de teste**:\n   1. Execute primeiro o endpoint **Auth \u003e Login** para obter o token\n   2. O token será automaticamente salvo nas variáveis da coleção\n   3. Execute os outros endpoints conforme necessário\n\n### Endpoints disponíveis:\n\n#### Autenticação\n- `POST /auth/login` - Login de usuário\n\n#### Usuários\n- `POST /users` - Registrar novo usuário\n- `GET /users/me` - Obter usuário autenticado\n- `PUT /users/me` - Atualizar usuário autenticado\n- `PATCH /users/me/upload-image` - Upload de imagem\n- `PATCH /users/me/delete-image` - Deletar imagem\n- `PATCH /users/me/deactivate` - Desativar conta\n\n#### Tarefas\n- `POST /tasks` - Criar nova tarefa\n- `GET /tasks` - Listar tarefas do usuário\n- `PUT /tasks/:id` - Atualizar tarefa\n- `DELETE /tasks/:id` - Deletar tarefa\n\n#### Admin (Apenas para administradores)\n- `GET /users` - Listar todos os usuários\n- `PUT /users/:id` - Atualizar usuário por ID\n- `PATCH /users/:id/upload-image` - Upload de imagem para usuário\n- `PATCH /users/:id/delete-image` - Deletar imagem do usuário\n- `PATCH /users/:id/deactivate` - Desativar usuário\n- `PATCH /users/:id/activate` - Ativar usuário\n- `GET /tasks/user/:userid` - Listar tarefas de um usuário específico\n\n### Credenciais de teste:\n- **Email**: `admin@example.com`\n- **Senha**: `admin123`\n\n### Observações:\n- A coleção inclui scripts automáticos para salvar tokens e IDs\n- Alguns endpoints requerem autenticação (Bearer token)\n- Endpoints de admin requerem role de ADMIN\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbnkcodes%2Fnewway-challenge-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbnkcodes%2Fnewway-challenge-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbnkcodes%2Fnewway-challenge-api/lists"}