{"id":29133065,"url":"https://github.com/indiomedeiros/br-generation-challenge-api","last_synced_at":"2025-06-30T07:02:25.852Z","repository":{"id":301850973,"uuid":"1010482262","full_name":"indiomedeiros/br-generation-challenge-api","owner":"indiomedeiros","description":"Este é um sistema de gerenciamento de participantes desenvolvido com NestJS e TypeORM, utilizando alguns conceitos de arquitetura limpa. O sistema permite o cadastro, consulta, atualização e remoção de participantes, calculando automaticamente a média final baseada nas notas dos semestres.","archived":false,"fork":false,"pushed_at":"2025-06-29T06:59:10.000Z","size":0,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-29T07:38:14.267Z","etag":null,"topics":["class-transformer","class-validator","clean-architecture","clean-code","ddd-patterns","mysql2","nestjs","solid","typescript"],"latest_commit_sha":null,"homepage":"","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/indiomedeiros.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-06-29T06:55:12.000Z","updated_at":"2025-06-29T06:59:13.000Z","dependencies_parsed_at":"2025-06-29T07:38:30.367Z","dependency_job_id":"564b57c1-fdff-49f3-ab55-51ffc2015766","html_url":"https://github.com/indiomedeiros/br-generation-challenge-api","commit_stats":null,"previous_names":["indiomedeiros/br-generation-challenge-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/indiomedeiros/br-generation-challenge-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indiomedeiros%2Fbr-generation-challenge-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indiomedeiros%2Fbr-generation-challenge-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indiomedeiros%2Fbr-generation-challenge-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indiomedeiros%2Fbr-generation-challenge-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/indiomedeiros","download_url":"https://codeload.github.com/indiomedeiros/br-generation-challenge-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indiomedeiros%2Fbr-generation-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":["class-transformer","class-validator","clean-architecture","clean-code","ddd-patterns","mysql2","nestjs","solid","typescript"],"created_at":"2025-06-30T07:01:56.389Z","updated_at":"2025-06-30T07:02:25.831Z","avatar_url":"https://github.com/indiomedeiros.png","language":"TypeScript","readme":"# BR Generation Challenge - Sistema de Gerenciamento de Participantes\r\n\r\n## 📋 Sobre o Projeto\r\n\r\nEste é um sistema de gerenciamento de participantes desenvolvido com **NestJS** e **TypeORM**, utilizando alguns conceitos de arquitetura limpa. O sistema permite o cadastro, consulta, atualização e remoção de participantes, calculando automaticamente a média final baseada nas notas dos semestres.\r\n\r\n## 🏗️ Arquitetura\r\n\r\nO projeto segue alguns princípios da **Clean Architecture** e **Domain-Driven Design (DDD)**, organizando o código em camadas:\r\n\r\n```\r\nsrc/\r\n├── participant/\r\n│   ├── application/          # Camada de Aplicação\r\n│   │   ├── dto/             # Data Transfer Objects\r\n│   │   └── usecases/        # Casos de Uso\r\n│   ├── domain/              # Camada de Domínio\r\n│   │   ├── entities/        # Entidades\r\n│   │   ├── repositories/    # Interfaces de Repositórios\r\n│   │   └── services/        # Serviços de Domínio\r\n│   ├── infra/               # Camada de Infraestrutura\r\n│   │   └── orm/             # Implementações ORM/Repositórios\r\n│   └── presentation/        # Camada de Apresentação\r\n│       └── controllers/     # Controladores HTTP\r\n```\r\n\r\n## 🚀 Tecnologias Utilizadas\r\n\r\n- **[NestJS](https://nestjs.com/)** - Framework Node.js progressivo\r\n- **[TypeORM](https://typeorm.io/)** - ORM para TypeScript/JavaScript\r\n- **[MySQL](https://www.mysql.com/)** - Sistema de gerenciamento de banco de dados\r\n- **[TypeScript](https://www.typescriptlang.org/)** - Superset tipado do JavaScript\r\n- **[Class Validator](https://github.com/typestack/class-validator)** - Validação de dados\r\n- **[Class Transformer](https://github.com/typestack/class-transformer)** - Transformação de objetos\r\n\r\n## 📊 Funcionalidades\r\n\r\n### Entidade Participant\r\n\r\n| Campo                 | Tipo   | Descrição                               |\r\n| --------------------- | ------ | --------------------------------------- |\r\n| `id`                  | UUID   | Identificador único                     |\r\n| `fullName`            | String | Nome completo (3-50 caracteres)         |\r\n| `age`                 | Number | Idade (mínimo 18 anos e máximo 30)      |\r\n| `firstSemesterGrade`  | Number | Nota do primeiro semestre (0-10)        |\r\n| `secondSemesterGrade` | Number | Nota do segundo semestre (0-10)         |\r\n| `finalAverage`        | Number | Média final (calculada automaticamente) |\r\n\r\n### Endpoints da API\r\n\r\n#### 📝 Criar Participante\r\n\r\n```http\r\nPOST /participant\r\nContent-Type: application/json\r\n\r\n{\r\n  \"fullName\": \"Índio medeiros\",\r\n  \"age\": 30,\r\n  \"firstSemesterGrade\": 10,\r\n  \"secondSemesterGrade\": 5\r\n}\r\n```\r\n\r\n#### 📋 Listar Todos os Participantes\r\n\r\n```http\r\nGET /participant\r\n```\r\n\r\n#### 🔍 Buscar Participante por ID\r\n\r\n```http\r\nGET /participant/1681b549-216e-461d-8e78-344496d471e1\r\n```\r\n\r\n#### ✏️ Atualizar Participante\r\n\r\n```http\r\nPATCH /participant/53ebca58-04d5-473b-a513-1b105ecd8f11\r\nContent-Type: application/json\r\n\r\n{\r\n  \"fullName\": \"Chrislaine Souza\"\r\n}\r\n```\r\n\r\n#### 🗑️ Remover Participante\r\n\r\n```http\r\nDELETE /participant/1681b549-216e-461d-8e78-344496d471e1\r\n```\r\n\r\n## 🛠️ Configuração e Instalação\r\n\r\n### Pré-requisitos\r\n\r\n- Node.js (versão 18 ou superior)\r\n- MySQL (versão 8 ou superior)\r\n- npm ou yarn\r\n\r\n### Passos para Instalação\r\n\r\n1. **Clone o repositório**\r\n\r\n   ```bash\r\n   git clone \u003curl-do-repositorio\u003e\r\n   cd br-generation-challenge\r\n   ```\r\n\r\n2. **Instale as dependências**\r\n\r\n   ```bash\r\n   npm install\r\n   ```\r\n\r\n3. **Configure o banco de dados**\r\n   - Crie um banco de dados MySQL com o nome `generation`\r\n   - Configure as variáveis de ambiente (veja seção abaixo)\r\n\r\n4. **Configure as variáveis de ambiente**\r\n   Copie o arquivo `.env-example` para `.env` e configure as variáveis:\r\n\r\n   ```bash\r\n   cp .env-example .env\r\n   ```\r\n\r\n   Edite o arquivo `.env` com suas configurações:\r\n\r\n   ```env\r\n   # APPLICATION CONFIG\r\n   PORT=3000\r\n\r\n   # Database connection type (mysql, postgres, sqlite, etc.)\r\n   DATABASE_TYPE=mysql\r\n\r\n   # Database server configuration\r\n   DATABASE_HOST=localhost\r\n   DATABASE_PORT=3306\r\n\r\n   # Database credentials\r\n   DATABASE_USERNAME=root\r\n   DATABASE_PASSWORD=sua_senha\r\n\r\n   # Database name for the application\r\n   DATABASE_DATABASE=generation\r\n\r\n   # TypeORM settings\r\n   DATABASE_AUTOLOADENTITIES=1\r\n   DATABASE_SYNCHRONIZE=0\r\n   ```\r\n\r\n## 🏃‍♂️ Executando o Projeto\r\n\r\n### Desenvolvimento\r\n\r\n```bash\r\nnpm run start:dev\r\n```\r\n\r\n### Produção\r\n\r\n```bash\r\nnpm run build\r\nnpm run start:prod\r\n```\r\n\r\n## 📝 Scripts Disponíveis\r\n\r\n| Script                | Descrição                      |\r\n| --------------------- | ------------------------------ |\r\n| `npm run build`       | Compila o projeto              |\r\n| `npm run start`       | Inicia o servidor              |\r\n| `npm run start:dev`   | Inicia em modo desenvolvimento |\r\n| `npm run start:debug` | Inicia em modo debug           |\r\n| `npm run lint`        | Executa o linter               |\r\n| `npm run format`      | Formata o código               |\r\n\r\n## 🎯 Casos de Uso Implementados\r\n\r\n1. **CreateParticipantUseCase** - Criação de novos participantes\r\n2. **FindAllParticipantsUseCase** - Listagem de todos os participantes\r\n3. **FindByIdParticipantUseCase** - Busca de participante por ID\r\n4. **UpdateParticipantUseCase** - Atualização de dados do participante\r\n5. **RemoveParticipantUseCase** - Remoção de participantes\r\n\r\n## 🧮 Serviços de Domínio\r\n\r\n### GradeCalculatorService\r\n\r\nResponsável pelo cálculo da média final dos participantes:\r\n\r\n- Calcula a média aritmética entre as notas dos dois semestres\r\n- Fórmula: `(firstSemesterGrade + secondSemesterGrade) / 2`\r\n\r\n## 🔍 Validações\r\n\r\n### CreateParticipantDto\r\n\r\n- **fullName**: String obrigatória, entre 3 e 50 caracteres\r\n- **age**: Número obrigatório, mínimo 18 anos e máximo de 30 anos\r\n- **firstSemesterGrade**: Número obrigatório, entre 0 e 10\r\n- **secondSemesterGrade**: Número obrigatório, entre 0 e 10\r\n\r\n### UpdateParticipantDto\r\n\r\n- Todos os campos são opcionais\r\n- Mesmas validações dos campos correspondentes no CreateParticipantDto\r\n\r\n## 📋 Testes com client.rest\r\n\r\nO projeto inclui um arquivo `client.rest` com exemplos de requisições HTTP para testar a API:\r\n\r\n```http\r\n@baseUrl = http://localhost:3000\r\n\r\n### Create Participants\r\nPOST {{baseUrl}}/participant\r\nContent-Type: application/json\r\n\r\n{\r\n  \"fullName\": \"Índio medeiros\",\r\n  \"age\": 30,\r\n  \"firstSemesterGrade\": 10,\r\n  \"secondSemesterGrade\": 5\r\n}\r\n\r\n### Get All Participants\r\nGET {{baseUrl}}/participant\r\n\r\n### Get Participants by id\r\nGET {{baseUrl}}/participant/1681b549-216e-461d-8e78-344496d471e1\r\n\r\n### Update Participants by id\r\nPATCH {{baseUrl}}/participant/53ebca58-04d5-473b-a513-1b105ecd8f11\r\nContent-Type: application/json\r\n\r\n{\r\n  \"fullName\": \"Chrislaine Souza\"\r\n}\r\n\r\n### Delete Participants by id\r\nDELETE {{baseUrl}}/participant/1681b549-216e-461d-8e78-344496d471e1\r\n```\r\n\r\n\r\n---\r\n\r\nDesenvolvido como parte do desafio da Generation Brasil.\r\n\r\n---\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findiomedeiros%2Fbr-generation-challenge-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Findiomedeiros%2Fbr-generation-challenge-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findiomedeiros%2Fbr-generation-challenge-api/lists"}