{"id":31703822,"url":"https://github.com/vitormanoelvb/api-instrutor","last_synced_at":"2025-10-08T22:44:46.061Z","repository":{"id":316897308,"uuid":"1039821120","full_name":"vitormanoelvb/api-instrutor","owner":"vitormanoelvb","description":"API - INSTRUTORES E TURMAS","archived":false,"fork":false,"pushed_at":"2025-09-27T11:18:34.000Z","size":5938,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-27T13:18:22.831Z","etag":null,"topics":["academic","academic-project","api-client","backend","backend-api","education","educational-project","express","expressjs","insomnia","insomnia-collections","node","nodejs","nodemon","nodemon-express","university-project"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/vitormanoelvb.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-18T03:13:20.000Z","updated_at":"2025-09-27T11:18:37.000Z","dependencies_parsed_at":"2025-09-27T13:28:27.264Z","dependency_job_id":null,"html_url":"https://github.com/vitormanoelvb/api-instrutor","commit_stats":null,"previous_names":["vitormanoelvb/api-instrutor"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/vitormanoelvb/api-instrutor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitormanoelvb%2Fapi-instrutor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitormanoelvb%2Fapi-instrutor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitormanoelvb%2Fapi-instrutor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitormanoelvb%2Fapi-instrutor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vitormanoelvb","download_url":"https://codeload.github.com/vitormanoelvb/api-instrutor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vitormanoelvb%2Fapi-instrutor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000778,"owners_count":26082851,"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","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["academic","academic-project","api-client","backend","backend-api","education","educational-project","express","expressjs","insomnia","insomnia-collections","node","nodejs","nodemon","nodemon-express","university-project"],"created_at":"2025-10-08T22:44:43.831Z","updated_at":"2025-10-08T22:44:46.052Z","avatar_url":"https://github.com/vitormanoelvb.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# API Instrutor — README Acadêmico\n\n\u003e **Curso:** Sistemas de Informação – Univale  \n\u003e **Disciplina:** Desenvolvimento Web  \n\u003e **Projeto:** API Instrutores \u0026 Turmas (Node.js + Express)  \n\u003e **Autor:** Vitor Manoel Vidal Braz — @vmengine2025  \n\u003e **Professor orientador:** Patrick Vinícius Estevão de Oliveira  \n\u003e **Versão:** 1.0.0\n\n## 1) Resumo\n\nEsta API acadêmica implementa o **cadastro e o relacionamento entre Instrutores e Turmas**, com **validações, regras de negócio** e **endpoints REST** para criação, consulta, atualização, vinculação e exclusão. Inclui *seeds* iniciais e uma **interface HTML** em `/` para demonstração (data grids e formulários para testar as rotas).\n\n## 2) Objetivos de Aprendizagem\n\n- Praticar **modelagem e implementação** de uma API REST com Node.js + Express.  \n- Exercitar **validações** (CPF, telefone, formatação de nome e data).  \n- Aplicar **regras de negócio**: evitar duplicidades, proibir exclusões indevidas, etc.  \n- Manipular **relacionamentos** (Instrutor ↔ Turma).  \n- Produzir **evidências** com Insomnia (coleção de requisições e prints).\n\n## 3) Arquitetura do Código\n\napi-instrutor/\n├─ public/                # Imagens e arquivos estáticos (UI de demonstração)\n├─ src/\n│  └─ index.js            # Servidor Express + rotas + validações + seeds\n├─ package.json           # Scripts de execução e dependências\n└─ package-lock.json\n└─ README.md              # Documentação do projeto\n\n### Principais componentes (src/index.js)\n\n- **Seeds:** popula turmas e instrutores ao subir o servidor.  \n- **Utils de formatação:**\n  - `nameFormatted(nome)`: Nome em **MAIÚSCULAS**.  \n  - `cpfFormatted(cpf)`: Padrão `000.000.000-00` (exige 11 dígitos).  \n  - `cellFormatted(cel)`: Padrão `(00) 00000-0000` (11 dígitos).  \n  - `dateFormatted(d)`: ISO `YYYY-MM-DD` (aceita `DD/MM/YYYY` e converte).  \n- **Middlewares / regras:**\n  - Evita **duplicidade** de registro/CPF (instrutor) e de **código** (turma).  \n  - **Verifica existência** e **bloqueia exclusões** quando houver vínculos.  \n  - **Auth simples** por header `x-auth: admin` em rotas protegidas.  \n- **Interface:** rota `/` serve um HTML de demonstração com data grids e formulários.  \n- **Static:** `app.use(express.static('public'))` para servir imagens/ícones.\n\n## 4) Como Executar Localmente\n\n\u003e **Pré-requisitos:** Node.js 18+\n\n1. Instale as dependências:\n   npm install\n\n2. Desenvolvimento (hot reload com nodemon):\n   npm run dev\n  \n3. Produção:\n   npm start\n\n4. Acesse:\n   - UI de demonstração: **http://localhost:3000/**  \n   - API base: **http://localhost:3000**\n\n\u003e Os **seeds** são carregados automaticamente ao iniciar.\n\n## 5) Endpoints (Resumo)\n\n### Instrutores\n\n- **POST** `/instrutores` – cria instrutor (registro, nome, cpf, [email], [dataNascimento], [telefone])  \n- **GET** `/instrutores` – lista + filtros (`nome`, `registro`, `cpf`, `hasTurmas`, `turmaId`)  \n- **GET** `/instrutores/registro/:registro` – busca por registro  \n- **GET** `/instrutores/cpf/:cpf` – busca por cpf (com/sem máscara)  \n- **GET** `/instrutores/nome?q=` – busca por trecho do nome  \n- **PATCH** `/instrutores/:registro` – atualiza **nome, email, dataNascimento, telefone**  \n  - ❌ Não permite alterar `registro`, `cpf` ou lista de `turmas`.  \n- **DELETE** `/instrutores/:registro` – exclui instrutor  \n- **PUT** `/instrutores/:registro/turmas/:id` – vincula uma turma ao instrutor  \n- **GET** `/instrutores/:registro/turmas?detalhes=true|false` – retorna turmas vinculadas (ids ou detalhes)\n\n### Turmas\n\n- **POST** `/turmas` – cria turma (código, nome, [turno])  \n- **GET** `/turmas?turno=\u0026codigo=\u0026nomes=true|false` – lista turmas (com nomes de instrutores)  \n- **GET** `/turmas/:id` – **protegido** (`x-auth: admin`) retorna turma + instrutores  \n- **DELETE** `/turmas/:id` – **protegido** (`x-auth: admin`) remove turma se não estiver vinculada  \n\n\u003e **Rotas auxiliares da UI acadêmica:**  \n\u003e `POST /instrutores/update`, `POST /instrutores/delete`, `POST /turmas/delete`.\n\n## 6) 🔗 Vínculos Instrutor ↔ Turma\n\n### Criar Vínculo\n- **PUT** `/instrutores/:registro/turmas/:id`  \n  - Exemplo: `/instrutores/J004/turmas/1`  \n  - Vincula a turma `id=1` ao instrutor `J004`.  \n  - ❌ Bloqueia se já houver vínculo.\n\n- **POST** `/instrutores/vincular` *(rota auxiliar da UI)*  \n  { \"registro\": \"J004\", \"idTurma\": 1 }\n\n### Consultar Vínculos\n- **GET** `/instrutores/:registro/turmas?detalhes=true` → retorna turmas detalhadas  \n- **GET** `/instrutores/:registro/turmas?detalhes=false` → retorna apenas IDs  \n\n### Listar Vínculos por Turma\n- **GET** `/turmas/:id` (proteção `x-auth: admin`) retorna turma + instrutores\n\n### Regras de Vínculo\n- ❌ Não permitir **vínculo duplicado** (mesma turma já atribuída).  \n- ❌ Não permitir **exclusão de turmas** que ainda possuam vínculos.\n\n## 7) Guia Rápido — Testes no **Insomnia**\n\n\u003e A API aceita **JSON** (`application/json`) e **Form URL-Encoded**.  \n\u003e Abaixo, exemplos em **JSON**.\n\n### Criar Instrutor\n{\n  \"registro\": \"J004\",\n  \"nome\": \"Joana Silva\",\n  \"cpf\": \"12345678901\",\n  \"email\": \"joana@exemplo.com\",\n  \"dataNascimento\": \"1995-02-18\",\n  \"telefone\": \"31988887777\"\n}\n\n### Atualizar Instrutor\n{\n  \"nome\": \"JOANA M. SILVA\",\n  \"email\": \"joana.silva@exemplo.com\",\n  \"telefone\": \"31999990000\",\n  \"dataNascimento\": \"1995-02-20\"\n}\n\n### Criar Turma\n{\n  \"codigo\": \"T-10\",\n  \"nome\": \"Algoritmos\",\n  \"turno\": \"Noite\"\n}\n\n### Vincular Turma ao Instrutor\n{ \"registro\": \"J004\", \"idTurma\": 1 }\n\n### Excluir Turma (rota protegida)\nHeader:\nx-auth: admin\n\n## 8) Códigos de Resposta\n\n- `200 OK` – Operação concluída  \n- `201 Created` – Recurso criado  \n- `400 Bad Request` – Validação falhou  \n- `401 Unauthorized` – Token ausente ou inválido  \n- `404 Not Found` – Recurso não encontrado  \n\n## 9) Considerações Finais\n\n- Padronizar 100% para rotas REST (remover auxiliares `POST`).  \n- Adicionar **validação de CPF por dígito verificador**.  \n- Melhorar organização em camadas (`routes/`, `middlewares/`, `utils/`).  \n- Adicionar **testes automatizados** (Jest + supertest).  \n\n## 10) Créditos e Licença\n\nProjeto desenvolvido para fins **didáticos/avaliativos**.  \nCódigo sob **MIT License** (ver `package.json`).  \nImagens da pasta `public/` de uso acadêmico.  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvitormanoelvb%2Fapi-instrutor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvitormanoelvb%2Fapi-instrutor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvitormanoelvb%2Fapi-instrutor/lists"}