{"id":28202305,"url":"https://github.com/stardusteight-d4c/backend-technical-test","last_synced_at":"2025-07-10T17:32:12.331Z","repository":{"id":293484397,"uuid":"982844060","full_name":"stardusteight-d4c/backend-technical-test","owner":"stardusteight-d4c","description":"API RESTful para gerenciamento de estabelecimentos comerciais e produtos. Sistema de usuários com diferentes permissões, regras personalizáveis e integração com DynamoDB.","archived":false,"fork":false,"pushed_at":"2025-05-15T15:19:46.000Z","size":376,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-15T15:48:45.711Z","etag":null,"topics":["aws","class-validator","domain-driven-design","nestjs","typescript"],"latest_commit_sha":null,"homepage":"https://backend-technical-test-production.up.railway.app/users","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stardusteight-d4c.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-05-13T13:43:05.000Z","updated_at":"2025-05-15T15:19:49.000Z","dependencies_parsed_at":"2025-05-15T15:49:03.226Z","dependency_job_id":null,"html_url":"https://github.com/stardusteight-d4c/backend-technical-test","commit_stats":null,"previous_names":["stardusteight-d4c/backend-technical-test"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/stardusteight-d4c/backend-technical-test","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stardusteight-d4c%2Fbackend-technical-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stardusteight-d4c%2Fbackend-technical-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stardusteight-d4c%2Fbackend-technical-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stardusteight-d4c%2Fbackend-technical-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stardusteight-d4c","download_url":"https://codeload.github.com/stardusteight-d4c/backend-technical-test/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stardusteight-d4c%2Fbackend-technical-test/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264619230,"owners_count":23638417,"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":["aws","class-validator","domain-driven-design","nestjs","typescript"],"created_at":"2025-05-17T00:12:39.657Z","updated_at":"2025-07-10T17:32:12.322Z","avatar_url":"https://github.com/stardusteight-d4c.png","language":"TypeScript","readme":"# 🏪 API de Gerenciamento de Estabelecimentos e Produtos\n\nUma API RESTful construída com NestJS para gerenciar estabelecimentos, produtos e usuários.\n\n## 📚 Índice\n\n- [Tecnologias](#-tecnologias)\n- [Configuração](#-configuração)\n- [Endpoints](#-endpoints)\n- [Exemplos](#-exemplos)\n- [Validações](#-validações)\n- [Banco de Dados](#-banco-de-dados)\n\n## 🚀 Tecnologias\n\n- [NestJS](https://nestjs.com/) - Framework Node.js\n- TypeScript - Linguagem de programação\n- DynamoDB - Banco de dados\n- Class Validator - Validação de dados\n\n## ⚙️ Configuração\n\n1. Copie o arquivo `example-env.txt` para `.env`\n2. Configure as variáveis de ambiente necessárias\n3. Instale as dependências:\n```bash\nnpm install\n```\n\n4. Execute o projeto:\n```bash\nnpm run start:dev\n```\n\n## 🛣️ Endpoints\n\n### 👥 Usuários (`/users`)\n\n#### `GET /users`\n\u003e Lista todos os usuários cadastrados.\n\n#### `GET /users/:id`\n\u003e Retorna os detalhes de um usuário específico.\n\n#### `POST /users`\n\u003e Cria um novo usuário.\n\nCorpo da requisição:\n```json\n{\n  \"name\": \"string\",\n  \"email\": \"string\",\n  \"type\": \"owner | customer\"\n}\n```\n\n\u003e Não permite um email já cadastrado\n\n#### `PATCH /users/:id`\n\u003e Atualiza os dados de um usuário.\n\nCorpo da requisição (todos os campos são opcionais):\n```json\n{\n  \"name\": \"string\",\n  \"email\": \"string\",\n  \"type\": \"owner | customer\"\n}\n```\n\n#### `DELETE /users/:id`\n\u003e Remove um usuário.\n\n### 🏢 Estabelecimentos (`/establishments`)\n\n#### `GET /establishments`\n\u003e Lista todos os estabelecimentos.\n\n#### `GET /establishments?type=:type`\n\u003e Lista estabelecimentos filtrados por tipo.\n\n#### `GET /establishments/:id`\n\u003e Retorna os detalhes de um estabelecimento específico.\n\n#### `POST /establishments`\n\u003e Cria um novo estabelecimento.\n\n⚠️ **Importante**: Um User só pode criar um Establishment se o campo type for \"owner\".\n\nCorpo da requisição:\n```json\n{\n  \"name\": \"string\",\n  \"ownerId\": \"UUID\",\n  \"type\": \"shopping | local\"\n}\n```\n\n#### `PATCH /establishments/:id`\n\u003e Atualiza os dados de um estabelecimento.\n\n#### `DELETE /establishments/:id`\n\u003e Remove um estabelecimento.\n\n### 📋 Regras de Estabelecimentos (`/establishments-rules`)\n\n#### `GET /establishments-rules/:establishmentId`\n\u003e Retorna as regras de um estabelecimento específico.\n\n#### `POST /establishments-rules`\n\u003e Cria novas regras para um estabelecimento.\n\nCorpo da requisição:\n```json\n{\n  \"establishmentId\": \"UUID\",\n  \"picturesLimit\": 10,\n  \"videoLimit\": 5\n}\n```\n\n#### `PATCH /establishments-rules/:id`\n\u003e Atualiza as regras de um estabelecimento.\n\n#### `DELETE /establishments-rules/:id`\n\u003e Remove as regras de um estabelecimento.\n\n### 🛍️ Produtos (`/products`)\n\n#### `GET /products`\n\u003e Lista todos os produtos.\n\n#### `GET /products/:id`\n\u003e Retorna os detalhes de um produto específico.\n\n#### `POST /products`\n\u003e Cria um novo produto.\n\nCorpo da requisição:\n```json\n{\n  \"name\": \"string\",\n  \"price\": \"number (em centavos)\",\n  \"establishmentId\": \"UUID\"\n}\n```\n\n#### `PATCH /products/:id`\n\u003e Atualiza os dados de um produto.\n\nCorpo da requisição (todos os campos são opcionais):\n```json\n{\n  \"name\": \"string\",\n  \"price\": \"number (em centavos)\"\n}\n```\n\n#### `DELETE /products/:id`\n\u003e Remove um produto.\n\n## 💡 Exemplos\n\n### 👤 Criando um Usuário (Owner)\n```json\n{\n  \"name\": \"João Silva\",\n  \"email\": \"joao@example.com\",\n  \"type\": \"owner\"\n}\n```\n\n### 🏬 Criando um Estabelecimento\n```json\n{\n  \"name\": \"Shopping Center XYZ\",\n  \"ownerId\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"type\": \"shopping\"\n}\n```\n\n### ⚖️ Criando Regras para um Estabelecimento\n```json\n{\n  \"establishmentId\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"picturesLimit\": 5,\n  \"videoLimit\": 2\n}\n```\n\n### 📦 Criando um Produto\n```json\n{\n  \"name\": \"Produto XYZ\",\n  \"price\": 1990,\n  \"establishmentId\": \"550e8400-e29b-41d4-a716-446655440000\"\n}\n```\n\n## ✅ Validações\n\nA API utiliza o Class Validator para validação de dados:\n\n- 📧 Emails devem ser válidos\n- 💰 Preços devem ser números inteiros positivos (em centavos)\n- 🔑 IDs de estabelecimentos devem ser UUIDs válidos\n- 👥 Tipos de usuário devem ser 'owner' ou 'customer'\n- 🏢 Tipos de estabelecimento devem ser 'shopping' ou 'local'\n\n## 🧪 Testes\n\nO projeto inclui testes automatizados para todos os controllers, garantindo o funcionamento correto das funcionalidades.\n\n### Executando os Testes\n\nPara executar os testes dos controllers:\n```bash\nnpm run test:controllers\n```\n\nPara executar os testes em modo watch:\n```bash\nnpm run test:controllers:watch\n```\n\n### Cobertura de Testes\n\n#### UsersController\n- Criação de usuários\n  - ✓ Cria um novo usuário\n  - ✓ Impede a criação de usuário com email duplicado\n- Busca de usuários\n  - ✓ Retorna um usuário por ID\n  - ✓ Lança NotFoundException quando usuário não existe\n- Atualização de usuários\n  - ✓ Atualiza dados do usuário\n  - ✓ Lança NotFoundException ao atualizar usuário inexistente\n- Remoção de usuários\n  - ✓ Remove um usuário\n  - ✓ Lança NotFoundException ao remover usuário inexistente\n- Listagem de usuários\n  - ✓ Retorna todos os usuários\n  - ✓ Retorna array vazio quando não há usuários\n\n#### EstablishmentsController\n- Criação de estabelecimentos\n  - ✓ Cria um novo estabelecimento\n  - ✓ Impede criação com owner inexistente\n  - ✓ Impede criação por usuário não-owner\n- Busca de estabelecimentos\n  - ✓ Retorna um estabelecimento por ID\n  - ✓ Lança NotFoundException quando estabelecimento não existe\n- Atualização de estabelecimentos\n  - ✓ Atualiza dados do estabelecimento\n  - ✓ Lança NotFoundException ao atualizar estabelecimento inexistente\n- Remoção de estabelecimentos\n  - ✓ Remove um estabelecimento\n  - ✓ Lança NotFoundException ao remover estabelecimento inexistente\n- Listagem de estabelecimentos\n  - ✓ Retorna todos os estabelecimentos\n  - ✓ Filtra estabelecimentos por tipo\n  - ✓ Retorna array vazio quando não há estabelecimentos\n\n#### EstablishmentsRulesController\n- Criação de regras\n  - ✓ Cria regras para um estabelecimento\n  - ✓ Impede criação para estabelecimento inexistente\n- Busca de regras\n  - ✓ Retorna regras por ID do estabelecimento\n  - ✓ Lança NotFoundException quando estabelecimento não existe\n- Atualização de regras\n  - ✓ Atualiza regras do estabelecimento\n  - ✓ Lança erro ao atualizar regras inexistentes\n- Remoção de regras\n  - ✓ Remove regras de um estabelecimento\n\n#### ProductsController\n- Criação de produtos\n  - ✓ Cria um novo produto\n  - ✓ Impede criação para estabelecimento inexistente\n- Busca de produtos\n  - ✓ Retorna um produto por ID\n  - ✓ Lança NotFoundException quando produto não existe\n- Atualização de produtos\n  - ✓ Atualiza dados do produto\n  - ✓ Lança NotFoundException ao atualizar produto inexistente\n- Remoção de produtos\n  - ✓ Remove um produto\n  - ✓ Lança NotFoundException ao remover produto inexistente\n- Listagem de produtos\n  - ✓ Retorna todos os produtos\n  - ✓ Retorna array vazio quando não há produtos\n\n### Estrutura dos Testes\n\nOs testes utilizam repositórios em memória (`InMemoryRepository`) para simular o banco de dados, permitindo testes rápidos e isolados. Cada controller tem seu próprio arquivo de teste que verifica:\n\n1. Funcionalidades básicas (CRUD)\n2. Casos de erro\n3. Validações de negócio\n4. Relacionamentos entre entidades\n\nOs testes são escritos usando Jest e seguem as melhores práticas de testes unitários, incluindo:\n- Isolamento de testes\n- Limpeza do estado entre testes\n- Verificação de casos de sucesso e erro\n- Asserções claras e específicas\n\n## 💾 Banco de Dados\n\nA API utiliza o DynamoDB como banco de dados. Certifique-se de ter as credenciais AWS configuradas corretamente no arquivo `.env`.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstardusteight-d4c%2Fbackend-technical-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstardusteight-d4c%2Fbackend-technical-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstardusteight-d4c%2Fbackend-technical-test/lists"}