{"id":22809000,"url":"https://github.com/ccuffs/app-horarios-api","last_synced_at":"2026-07-04T08:31:16.895Z","repository":{"id":236344504,"uuid":"792416380","full_name":"ccuffs/app-horarios-api","owner":"ccuffs","description":"Aplicativo para geração de horários.","archived":false,"fork":false,"pushed_at":"2025-11-12T18:47:31.000Z","size":294,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-11-12T20:19:21.136Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/ccuffs.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-04-26T16:14:17.000Z","updated_at":"2025-11-12T18:47:35.000Z","dependencies_parsed_at":"2025-07-25T23:10:55.620Z","dependency_job_id":"75cfa8cb-a5ba-47a8-a578-32fe1064a07e","html_url":"https://github.com/ccuffs/app-horarios-api","commit_stats":null,"previous_names":["ccuffs/app-horarios","ccuffs/app-horarios-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ccuffs/app-horarios-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccuffs%2Fapp-horarios-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccuffs%2Fapp-horarios-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccuffs%2Fapp-horarios-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccuffs%2Fapp-horarios-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ccuffs","download_url":"https://codeload.github.com/ccuffs/app-horarios-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccuffs%2Fapp-horarios-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35115740,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-04T02:00:05.987Z","response_time":113,"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":[],"created_at":"2024-12-12T11:13:10.274Z","updated_at":"2026-07-04T08:31:16.889Z","avatar_url":"https://github.com/ccuffs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# App Horários - API\n\nAPI REST para gerenciamento de horários acadêmicos da UFFS (Universidade Federal da Fronteira Sul).\n\n## Sobre o Projeto\n\nO App Horários API é o backend do sistema de gerenciamento de horários acadêmicos da UFFS. Esta API REST fornece endpoints para manipulação de horários de aulas, componentes curriculares (CCRs), cursos, docentes, ofertas e usuários. O sistema implementa autenticação baseada em JWT e controle granular de permissões para diferentes níveis de acesso.\n\n## Funcionalidades\n\n- **API REST**: Endpoints RESTful para todas as operações\n- **Autenticação JWT**: Sistema de autenticação com tokens de acesso e refresh\n- **Controle de Permissões**: Sistema baseado em grupos e permissões individuais\n- **Gestão de Horários**: CRUD completo de horários de aulas\n- **Componentes Curriculares (CCRs)**: Gerenciamento de disciplinas e ementas\n- **Cursos**: Administração de cursos e vinculação com CCRs\n- **Docentes**: Cadastro e gerenciamento de professores\n- **Ofertas**: Controle de ofertas de disciplinas por semestre/ano\n- **Ano/Semestre**: Gerenciamento de períodos letivos\n- **Endpoints Públicos**: Rotas públicas para visualização de horários sem autenticação\n\n## Tecnologias\n\n### Core\n- **[Node.js](https://nodejs.org/)** - Ambiente de execução JavaScript\n- **[Express.js](https://expressjs.com/)** - Framework web minimalista e flexível\n- **[PostgreSQL](https://www.postgresql.org/)** - Sistema de gerenciamento de banco de dados relacional\n\n### ORM e Banco de Dados\n- **[Sequelize](https://sequelize.org/)** - ORM para Node.js com suporte a PostgreSQL\n- **[Sequelize CLI](https://github.com/sequelize/cli)** - Interface de linha de comando do Sequelize\n- **[pg](https://node-postgres.com/)** - Cliente PostgreSQL para Node.js\n- **[pg-promise](https://github.com/vitaly-t/pg-promise)** - Interface PostgreSQL via Promises\n\n### Autenticação e Segurança\n- **[Passport.js](http://www.passportjs.org/)** - Middleware de autenticação\n- **[Passport-JWT](https://github.com/mikenicholson/passport-jwt)** - Estratégia JWT para Passport\n- **[Passport-LDAPAUTH](https://github.com/vesse/passport-ldapauth)** - Estratégia LDAP para Passport\n- **[Helmet](https://helmetjs.github.io/)** - Proteção de headers HTTP\n- **[CORS](https://github.com/expressjs/cors)** - Controle de acesso entre origens\n\n### Utilitários\n- **[dotenv](https://github.com/motdotla/dotenv)** - Gerenciamento de variáveis de ambiente\n- **[morgan](https://github.com/expressjs/morgan)** - Logger de requisições HTTP\n- **[moment.js](https://momentjs.com/)** - Manipulação de datas\n- **[express-async-handler](https://github.com/Abazhenov/express-async-handler)** - Tratamento de erros assíncronos\n- **[cls-hooked](https://github.com/Jeff-Lewis/cls-hooked)** - Armazenamento de contexto de continuação\n\n### Ferramentas\n- **[Yarn](https://yarnpkg.com/)** - Gerenciador de pacotes\n- **[ERD Editor](https://marketplace.visualstudio.com/items?itemName=dineug.vuerd-vscode)** - Editor de diagramas ER\n\n## Estrutura do Projeto\n\n```\napp-horarios-api/\n├── src/\n│   ├── config/              # Configurações\n│   │   └── localConnection.js  # Configuração de conexão com banco\n│   ├── controllers/         # Controladores das rotas\n│   │   ├── ano-semestre-controller.js\n│   │   ├── auth-controller.js\n│   │   ├── ccrs-controller.js\n│   │   ├── cursos-controller.js\n│   │   ├── docentes-controller.js\n│   │   ├── horarios-controller.js\n│   │   ├── ofertas-controller.js\n│   │   ├── public-controller.js\n│   │   └── usuarios-controller.js\n│   ├── enums/               # Enumeradores\n│   │   └── permissoes.js   # Definições de permissões\n│   ├── middleware/          # Middlewares\n│   │   ├── auth.js         # Middleware de autenticação\n│   │   └── autorizacao.js  # Middleware de autorização\n│   ├── models/              # Modelos do Sequelize\n│   │   ├── ano-semestre.js\n│   │   ├── categoria-permissao.js\n│   │   ├── ccr.js\n│   │   ├── curso-ccr.js\n│   │   ├── curso.js\n│   │   ├── docente-curso.js\n│   │   ├── docente.js\n│   │   ├── grupo-permissao.js\n│   │   ├── grupo.js\n│   │   ├── horarios.js\n│   │   ├── index.js\n│   │   ├── oferta.js\n│   │   ├── permissao.js\n│   │   ├── usuario-curso.js\n│   │   ├── usuario-grupo.js\n│   │   └── usuario.js\n│   ├── repository/          # Camada de acesso a dados\n│   │   ├── ano-semestre-repository.js\n│   │   ├── auth-repository.js\n│   │   ├── ccrs-repository.js\n│   │   ├── cursos-repository.js\n│   │   ├── docentes-repository.js\n│   │   ├── horarios-repository.js\n│   │   ├── ofertas-repository.js\n│   │   ├── permissoes-repository.js\n│   │   └── usuarios-repository.js\n│   ├── services/            # Lógica de negócio\n│   │   ├── ano-semestre-service.js\n│   │   ├── auth-service.js\n│   │   ├── ccrs-service.js\n│   │   ├── cursos-service.js\n│   │   ├── docentes-service.js\n│   │   ├── horarios-service.js\n│   │   ├── ofertas-service.js\n│   │   ├── permissoes-service.js\n│   │   └── usuarios-service.js\n│   ├── public/              # Arquivos públicos\n│   └── server.js            # Arquivo principal da aplicação\n├── database.erd.json        # Diagrama ER do banco\n├── package.json             # Dependências e scripts\n└── README.md               # Este arquivo\n```\n\n## Pré-requisitos\n\nAntes de começar, certifique-se de ter instalado:\n\n- **Node.js** (versão 16 ou superior)\n- **Yarn** (gerenciador de pacotes)\n- **PostgreSQL** (versão 12 ou superior)\n\n## Instalação\n\n1. Clone o repositório:\n```bash\ngit clone https://github.com/ccuffs/app-horarios-api.git\ncd app-horarios-api\n```\n\n2. Instale as dependências:\n```bash\nyarn install\n```\n\n3. Configure o banco de dados PostgreSQL:\n```bash\n# Acesse o PostgreSQL\npsql -U postgres\n\n# Crie o banco de dados\nCREATE DATABASE app_horarios;\n\n# Execute o script de criação das tabelas\npsql -U postgres -d app_horarios -f database.sql\n\n# (Opcional) Insira dados de teste\npsql -U postgres -d app_horarios -f dados-teste.sql\n```\n\n4. Configure as variáveis de ambiente:\nCrie um arquivo `.env` na raiz do projeto:\n```env\n# Configurações do Servidor\nSERVERPORT=3010\n\n# Configurações JWT\nJWT_SECRET=sua-chave-secreta-muito-segura\n\n# Banco de Dados\nDBHOST=endereco_postgres\nDBPORT=porta_postgres\nDBNAME=nome_banco\nDBUSER=usuario_banco\nDBPASS=sua_senha\n\n# Configurações do LDAP\n# Habilitar/desabilitar autenticação LDAP (true/false)\n# Se false, permite login sem senha (apenas para desenvolvimento)\nLDAP_ENABLED=true\nLDAP_URL=ldap://ldap.example.com:389\nLDAP_BIND_DN=cn=admin,dc=example,dc=com\nLDAP_BIND_CREDENTIALS=admin_password\nLDAP_SEARCH_BASE=ou=users,dc=example,dc=com\nLDAP_SEARCH_FILTER=(uid={{username}})\n```\n\n## Como Usar\n\n### Iniciar o Servidor\n\nExecute o servidor:\n```bash\nnode src/server.js\n```\n\nO servidor estará disponível em `http://localhost:3010`\n\n### Desenvolvimento\n\nPara desenvolvimento com auto-reload, você pode usar nodemon:\n```bash\nyarn global add nodemon\nnodemon src/server.js\n```\n\n## Endpoints da API\n\n### Rotas Públicas\n\n```\nGET  /api/public/horarios          # Lista horários públicos\nGET  /api/public/horarios/:id      # Busca horário específico\nGET  /api/public/cursos            # Lista cursos\nGET  /api/public/ccrs              # Lista CCRs\n```\n\n### Autenticação\n\n```\nPOST /api/auth/login               # Login de usuário\nPOST /api/auth/refresh             # Renovar token de acesso\nPOST /api/auth/logout              # Logout de usuário\n```\n\n### Horários (Autenticado)\n\n```\nGET    /api/horarios               # Lista horários\nGET    /api/horarios/:id           # Busca horário específico\nPOST   /api/horarios               # Cria novo horário\nPUT    /api/horarios/:id           # Atualiza horário\nDELETE /api/horarios/:id           # Remove horário\n```\n\n### CCRs (Autenticado)\n\n```\nGET    /api/ccrs                   # Lista CCRs\nGET    /api/ccrs/:id               # Busca CCR específico\nPOST   /api/ccrs                   # Cria novo CCR\nPUT    /api/ccrs/:id               # Atualiza CCR\nDELETE /api/ccrs/:id               # Remove CCR\n```\n\n### Cursos (Autenticado)\n\n```\nGET    /api/cursos                 # Lista cursos\nGET    /api/cursos/:id             # Busca curso específico\nPOST   /api/cursos                 # Cria novo curso\nPUT    /api/cursos/:id             # Atualiza curso\nDELETE /api/cursos/:id             # Remove curso\n```\n\n### Docentes (Autenticado)\n\n```\nGET    /api/docentes               # Lista docentes\nGET    /api/docentes/:id           # Busca docente específico\nPOST   /api/docentes               # Cria novo docente\nPUT    /api/docentes/:id           # Atualiza docente\nDELETE /api/docentes/:id           # Remove docente\n```\n\n### Ofertas (Autenticado)\n\n```\nGET    /api/ofertas                # Lista ofertas\nGET    /api/ofertas/:id            # Busca oferta específica\nPOST   /api/ofertas                # Cria nova oferta\nPUT    /api/ofertas/:id            # Atualiza oferta\nDELETE /api/ofertas/:id            # Remove oferta\n```\n\n### Ano/Semestre (Autenticado)\n\n```\nGET    /api/ano-semestre           # Lista anos/semestres\nGET    /api/ano-semestre/:id       # Busca período específico\nPOST   /api/ano-semestre           # Cria novo período\nPUT    /api/ano-semestre/:id       # Atualiza período\nDELETE /api/ano-semestre/:id       # Remove período\n```\n\n### Usuários (Autenticado)\n\n```\nGET    /api/usuarios               # Lista usuários\nGET    /api/usuarios/:id           # Busca usuário específico\nPOST   /api/usuarios               # Cria novo usuário\nPUT    /api/usuarios/:id           # Atualiza usuário\nDELETE /api/usuarios/:id           # Remove usuário\n```\n\n## Sistema de Autenticação\n\nA API utiliza autenticação baseada em LDAP e JWT (JSON Web Tokens):\n\n- **LDAP**: Autenticação inicial via servidor LDAP\n- **Token de Acesso**: Válido por 7 dias (configurável)\n- **Estratégia**: Passport-LDAPAUTH para login e Passport-JWT para validação de tokens\n- **Headers**: Requer `Authorization: Bearer \u003ctoken\u003e` nas rotas protegidas\n\n### Fluxo de Autenticação\n\n1. Cliente envia credenciais (userId e senha) para `/api/auth/login`\n2. Servidor autentica via LDAP usando passport-ldapauth\n3. Se autenticado, servidor busca usuário no banco de dados local (o userId deve existir)\n4. Servidor gera e retorna JWT token\n5. Cliente inclui token no header de requisições subsequentes\n6. Quando o token expira, cliente usa refresh token em `/api/auth/refresh`\n7. Servidor valida refresh token e retorna novo token\n\n### Configuração LDAP\n\nO sistema requer as seguintes variáveis de ambiente para o LDAP:\n\n- `LDAP_ENABLED`: Habilita/desabilita autenticação LDAP (true/false, padrão: true)\n  - Se `false`, permite login sem senha (apenas para desenvolvimento)\n  - Se `true`, requer autenticação via LDAP\n- `LDAP_URL`: URL do servidor LDAP (ex: ldap://ldap.example.com:389)\n- `LDAP_BIND_DN`: DN do usuário administrativo para bind\n- `LDAP_BIND_CREDENTIALS`: Senha do usuário de bind\n- `LDAP_SEARCH_BASE`: Base DN para busca de usuários\n- `LDAP_SEARCH_FILTER`: Filtro de busca (use {{username}} como placeholder)\n\nO usuário deve existir previamente no banco de dados com o mesmo ID usado no LDAP.\n\n**Modo Desenvolvimento**: Para desabilitar LDAP localmente, defina `LDAP_ENABLED=false` no `.env`. Isso permite login apenas com userId, sem senha.\n\n## Sistema de Permissões\n\nO controle de acesso é baseado em:\n\n- **Grupos**: Usuários são atribuídos a grupos\n- **Permissões**: Grupos possuem conjunto de permissões\n- **Categorias de Permissões**: Organização hierárquica de permissões\n\n### Principais Categorias\n\n- `HORARIOS`: Gestão de horários\n- `CCR`: Gestão de componentes curriculares\n- `OFERTAS_CURSO`: Gestão de ofertas\n- `DOCENTES`: Gestão de docentes\n- `CURSOS`: Gestão de cursos\n- `USUARIOS`: Gestão de usuários\n\n### Níveis de Permissão\n\n- **Visualizar Próprios**: Ver apenas dados próprios\n- **Visualizar Todos**: Ver todos os dados\n- **Criar**: Criar novos registros\n- **Editar**: Modificar registros existentes\n- **Excluir**: Remover registros\n\n## Banco de Dados\n\n### Estrutura\n\nO banco de dados utiliza PostgreSQL com as seguintes tabelas principais:\n\n- `usuarios`: Usuários do sistema\n- `grupos`: Grupos de usuários\n- `permissoes`: Permissões individuais\n- `categoria_permissao`: Categorias de permissões\n- `cursos`: Cursos acadêmicos\n- `ccrs`: Componentes curriculares\n- `docentes`: Professores\n- `horarios`: Horários de aulas\n- `ofertas`: Ofertas de disciplinas\n- `ano_semestre`: Períodos letivos\n\n### Modelagem\n\nO diagrama ER está disponível no arquivo `database.erd.json` e pode ser visualizado com a extensão [ERD Editor](https://marketplace.visualstudio.com/items?itemName=dineug.vuerd-vscode) do VS Code.\n\n### Migrações\n\nPara criar o banco de dados do zero:\n```bash\npsql -U postgres -d app_horarios -f database.sql\n```\n\nPara inserir dados de teste:\n```bash\npsql -U postgres -d app_horarios -f dados-teste.sql\n```\n\n## Scripts Disponíveis\n\nPrincipais comandos do projeto:\n\n```bash\n# Iniciar servidor\nnode src/server.js\n\n# Criar banco de dados\npsql -U postgres -d app_horarios -f database.sql\n\n# Inserir dados de teste\npsql -U postgres -d app_horarios -f dados-teste.sql\n```\n\n## Arquitetura\n\nO projeto segue uma arquitetura em camadas:\n\n1. **Controllers**: Recebem requisições HTTP e retornam respostas\n2. **Services**: Implementam a lógica de negócio\n3. **Repositories**: Gerenciam acesso aos dados\n4. **Models**: Definem estrutura e relacionamentos do banco de dados\n5. **Middleware**: Interceptam requisições para autenticação e autorização\n\n## Segurança\n\n- **Helmet**: Proteção de headers HTTP contra vulnerabilidades conhecidas\n- **CORS**: Controle de acesso entre origens diferentes\n- **JWT**: Tokens com expiração para autenticação segura\n- **Passport**: Estratégias de autenticação robustas\n- **Variáveis de Ambiente**: Credenciais sensíveis em arquivo `.env`\n\n## Contribuindo\n\nContribuições são bem-vindas! Por favor:\n\n1. Faça um fork do projeto\n2. Crie uma branch para sua feature (`git checkout -b feature/MinhaFeature`)\n3. Commit suas mudanças (`git commit -m 'Adiciona MinhaFeature'`)\n4. Push para a branch (`git push origin feature/MinhaFeature`)\n5. Abra um Pull Request\n\n## Licença\n\nEste projeto está sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.\n\n## Links Relacionados\n\n- [Frontend - App Horários](https://github.com/ccuffs/app-horarios-front)\n- [Universidade Federal da Fronteira Sul](https://www.uffs.edu.br/)\n- [Express.js Documentation](https://expressjs.com/)\n- [Sequelize Documentation](https://sequelize.org/)\n- [PostgreSQL Documentation](https://www.postgresql.org/docs/)\n\n## Equipe\n\nDesenvolvido pela comunidade CCUFFS e contribuidores.\n\n## Suporte\n\nPara dúvidas ou problemas, abra uma [issue](https://github.com/ccuffs/app-horarios-api/issues) no GitHub.\n\n---\n\nFeito para a UFFS\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fccuffs%2Fapp-horarios-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fccuffs%2Fapp-horarios-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fccuffs%2Fapp-horarios-api/lists"}