https://github.com/didifive/queue-service-api
Controller for queues - Controle de senhas e filas
https://github.com/didifive/queue-service-api
backend backend-api java postgresql rest-api spring-boot
Last synced: about 1 year ago
JSON representation
Controller for queues - Controle de senhas e filas
- Host: GitHub
- URL: https://github.com/didifive/queue-service-api
- Owner: didifive
- License: mit
- Created: 2022-02-14T00:35:31.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-04-11T16:40:00.000Z (about 2 years ago)
- Last Synced: 2024-04-11T19:22:03.230Z (about 2 years ago)
- Topics: backend, backend-api, java, postgresql, rest-api, spring-boot
- Language: Java
- Homepage:
- Size: 745 KB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# š¶š¶š¶ Queue Service API - Filas
## š¾ Controle de senhas para atendimento
Este projeto foi desenvolvido para controle de senhas para atendimento com filas personalizadas, podendo cadastrar filas
com Tipos de Prioridades Dinâmicos, permitindo ir além do padrão "PrioritÔrio e Normal", ficando a critério da necessidade.
Com as senhas salvas em banco Ć© possĆvel tambĆ©m construir relatórios de como foi o atendimento.
## š¼ Escopo
O sistema, considerando back e front-end deve atender os seguintes requisitos:
- Ter cadastro de empresa;
- Para os usuƔrios, ter os perfis de Administrador, Atendente e UsuƔrio;
- Ter cadastro de filas com nome e sigla, exemplo: nome "Caixa" e sigla "CX";
- As filas devem permitir prioridades personalizadas (Normal, PrioritƔrio, Idoso 80+ etc);
- As senhas devem seguir sequencia numƩrica com o prefixo sendo a sigla da fila, exemplo: "CX001";
- Senhas devem possuir um sufixo conforme abreviação do Tipo de Atendimento, exemplo: "CX001N", onde o "N" é abreviatura
para Tipo de Atendimento Normal;
- As senhas devem possuir data e hora de geração e de finalização, se foi atendida, deve possuir quem foi o atendente;
- O Administrador tem acesso total ao sistema, podendo inclusive alterar ou desativar outros usuƔrios;
- O Atendente apenas chama e finaliza as senhas marcando como atendida ou não atendida;
- O Atendente pode ver apenas senhas das filas em que foi autorizado;
- O UsuÔrio pode fazer a configuração do sistema, como criar filas, zerar número da fila, vincular (ou desvincular)
atendente de uma fila e editar dados da empresa que o UsuƔrio faz parte;
- Deve possuir um terminal para emissão de senhas, este deve ser logado por um alguém com perfil de UsuÔrio para
disponibilizar as filas para emissão de senhas da empresa em que estÔ vinculado;
- Gerar saĆda para emissĆ£o de senha em equipamento de impressĆ£o tĆ©rmica.
## š Queue Service API - Back-End
Este projeto aborda somente a API em Back-End.
A aplicação possui populador de dados, caso tabela esteja vazia o sistema irÔ tentar popular com dados bÔsicos para se poder experimentar a aplicação de forma mais imediata.
Foi criado para fins de estudos, prÔtica e testes. Aproveite para fazer melhorias ou personalização.
Apesar de este projeto ser público e não ter finalidade comercial, ainda assim foi pensado para resolver problema real,
portanto Ć© possĆvel utilizar esta base para um projeto comercial.
LicenƧa: [MIT License](https://mit-license.org/).
### ā Destaques:
- Diagrama de classes que foi base para visualizar e refletir sobre atributos, mƩtodos e relaƧƵes
- Resource Bundle para centralizar mensagens de aviso e erros para as Exceptions, com mensagens em idioma PortuguĆŖs e InglĆŖs
- Constantes de Strings centralizadas no pacote `enums.constants`, proporcionando melhor reaproveitamento e manutenção de textos, inclusive para traduções
- Abstração de anotações para o Swagger no pacote `utils.annotations.swagger` proporcionando diminuição e repetição de instrução
- Utilização de Interface para centralizar anotações do Swagger para os Controllers (*ControllerDocs)
- Filtro por data aplicado com JPA utilizando a consulta criada com o nome de mƩtodos, exemplo: "findAllByGeradaEmBetween"
- Filtro de autorização em cada Endpoint para controle de permissões por Perfil ou
- ServiƧo de popular banco para quando uma tabela/entidade estƔ sem dados
- Exception Handler para tratar excessƵes especĆficas da aplicação
- Spring Banner personalizado
- Regras de negócios centralizadas no pacote `services` e alinhadas para o escopo que o Back-End pode atender
- ComentƔrios para javadoc nos mƩtodos dos Services
- Utilização de variÔveis de ambientes para que os valores de `DATABASE_URL` e `TOKEN_API_SECRET` não fiquem expostos em repositório
- Configuração do arquivo `application-tests.properties` como base de propriedades para serem utilizadas em testes e que possui configurações que permitem que o carregamento e teste da classe principal execute normalmente
#### š _TO DO:_
- Criar testes unitƔrios
- Implementar Log
- Implementar Cache
- Revisar DTOs de respostas para melhor aproveitamento do Front-End
### š Configuração do Projeto
Para carregar a aplicação corretamente é necessÔrio configurar as variÔveis de ambientes no servidor ou informar na
execução:
- `DATABASE_URL`: URL da base de dados, este valor Ć© utilizado em `spring.datasource.url` no `application.properties`,
exemplo de valor para esta variƔvel: jdbc:postgresql://host.db.elephantsql.com:
5432/database?user=usuario&password=senha
- `TOKEN_API_SECRET`: Token de segredo para o JWT, este valor Ć© utilizado em `queue-service-api.jwt.secret`
no `application.properties`, exemplo de valor da variƔvel:
46070d4bf934fb0d4b06d9e2c46e346944e322444900a435d7d9a95e6d7435f5
A URL para o banco de dados normalmente é fornecida pelo serviço de banco de dados, caso a instalação seja local,
deve-se confirmar os parâmetros.
Sobre o token para segredo do JWT, este pode ser gerado em sites que geram tokens ou algum token particular criado.
Abaixo, seguem maneiras de executar o projeto com terminal ou com IDE:
#### š» Executar com terminal
Após configurar banco de dados e o segredo, basta se atentar em possuir o JDK do Java na versão 17 (vide versão na seção
Tecnologias) e executar o comando:
Bash ou PowerShell:
```bash
./mvnw clean package spring-boot:repackage
java -jar target/queue-service-api-0.2.0-RELEASE.jar
```
_OBS: para CMD, no primeiro comando, basta remover o "./" antes do mvnw_
#### š» Executar com IDE
A execução com a IDE é mais simples, primeiro deve carregar o projeto na IDE, verificar o JDK configurado, aguardar
indexar e carregar as dependências do Maven, depois confirmar se as variÔveis de ambiente existem no servidor, se não
existirem, basta configurar as variÔveis citadas acima na sua IDE, então é só fazer a execução.
## š§ Tecnologias
- Java JDK 17
- Maven Wrapper 3.8.4
- Springboot v.3.0.2
- Spring Security
- Lombok v.1.18.26
- Springdoc v.2.1.0 (OpenApi - Swagger)
- Mapstruct v.1.5.3.Final
- Java JWT v.4.3.0
- PostgreSQL - utilizando [ElephantSQL]
- Jacoco 0.8.8
šØ IDE Utilizada: [IntelliJ] v.2022.3.2 (Community Edition)
---
## šŖ Endpoints da API
Abaixo segue uma lista geral dos endpoints com resumo de suas funcionalidades:
### š¦ Autenticação (Auth): Endpoints para autenticação do usuĆ”rio
| Método | Endpoint | Descrição |
|--------|-------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|
| POST | /api/v1/auth | Realizar autenticação do UsuÔrio informando nome de usuÔrio e senha e se estiver ok retorna token de acesso. |
| POST | /api/v1/auth/refresh/{usuarioId}/{refreshToken} | Informar o Id de UsuƔrio (usuarioID) e o Refresh Token que possui (refreshToken) para gerar um novo token de acesso. |
| DELETE | /api/v1/auth/invalidate-refresh/{usuarioId} | Invalida refresh token do usuƔrio, normalmente utilizado ao usuƔrio sair do sistema. |
### š¢ Empresa: Endpoints com CRUD para cadastro de empresa(s)
| Método | Endpoint | Descrição |
|--------|----------------------|--------------------------------------|
| POST | /api/v1/empresa | Cadastrar nova empresa |
| GET | /api/v1/empresa | Listar todas as empresas cadastradas |
| GET | /api/v1/empresa/{id} | Detalhar empresa |
| PUT | /api/v1/empresa/{id} | Atualizar empresa |
| DELETE | /api/v1/empresa/{id} | Apagar empresa |
### š Departamento: Endpoints com CRUD para cadastro de departamento(s)
| Método | Endpoint | Descrição |
|--------|---------------------------|-------------------------------------------|
| POST | /api/v1/departamento | Cadastrar novo departamento |
| GET | /api/v1/departamento | Listar todos os departamentos cadastrados |
| GET | /api/v1/departamento/{id} | Detalhar departamento |
| PUT | /api/v1/departamento/{id} | Atualizar departamento |
| DELETE | /api/v1/departamento/{id} | Apagar departamento |
### š¤ Atendente: Endpoints com CRUD para cadastro de atendente(s)
Quando um atendente é criado, um usuÔrio serÔ automaticamente criado com o nome de usuÔrio sendo igual ao e-mail do atendente e a senha padrão "Pw5@QueueService".
Observação: Mesm em caso de jÔ existir um e-mail de atendente igual à um nome de usuÔrio existe o sistema irÔ tentar um nome diferente até conseguir criar um usuÔrio novo sem conflito com nome de usuÔrio.
| Método | Endpoint | Descrição |
|--------|-------------------------|----------------------------------------|
| POST | /api/v1/atendente | Cadastrar novo atendente |
| GET | /api/v1/atendente | Listar todos os atendentes cadastrados |
| GET | /api/v1/atendente/{id} | Detalhar atendente |
| PUT | /api/v1/atendente/{id} | Atualizar atendente |
| DELETE | /api/v1/atendente/{id} | Apagar atendente |
### š UsuĆ”rio: Endpoints com CRUD para cadastro de usuĆ”rio(s)
Os usuÔrios são diretamente vinculados aos atendentes, nas operações é checado o atendente vinculado ao usuÔrio.
| Método | Endpoint | Descrição |
|--------|------------------------------------------|--------------------------------------------|
| POST | /api/v1/usuario | Cadastrar novo usuƔrio |
| GET | /api/v1/usuario | Listar todos os usuƔrios cadastrados |
| GET | /api/v1/usuario/{id} | Detalhar usuƔrio |
| PATCH | /api/v1/atendente/{id}/novo-nome-usuario | Atualizar usuƔrio com novo nome de usuƔrio |
| PATCH | /api/v1/atendente/{id}/atualizar-senha | Atualizar senha de acesso do usuƔrio |
| PATCH | /api/v1/atendente/{id}/perfil/adicionar | Adicionar perfil ao usuƔrio |
| PATCH | /api/v1/atendente/{id}/perfil/remover | Remover perfil do usuƔrio |
| PATCH | /api/v1/atendente/{id}/ativar | Ativar usuƔrio no sistema |
| PATCH | /api/v1/atendente/{id}/desativar | Desativar usuƔrio no sistema |
### āæ Tipo de Atendimento: Endpoints com CRUD para cadastro de tipo(s) de atendimento
O Tipo de Atendimento foi um recurso criado para que se possa incluir priorizações personalizadas às filas.
| Método | Endpoint | Descrição |
|--------|-------------------------------|--------------------------------------------------|
| POST | /api/v1/tipo-atendimento | Cadastrar novo tipo de atendimento |
| GET | /api/v1/tipo-atendimento | Listar todos os tipos de atendimento cadastrados |
| GET | /api/v1/tipo-atendimento/{id} | Detalhar tipo de atendimento |
| PUT | /api/v1/tipo-atendimento/{id} | Atualizar tipo de atendimento |
| DELETE | /api/v1/tipo-atendimento/{id} | Apagar tipo de atendimento |
### š Fila: Endpoints com CRUD para cadastro de fila(s)
Uma fila depende de ao menos um tipo de atendimento vinculado.
| Método | Endpoint | Descrição |
|--------|------------------------------------------------------------------|-------------------------------------|
| POST | /api/v1/fila | Cadastrar nova fila |
| GET | /api/v1/fila | Listar todas as filas cadastradas |
| GET | /api/v1/fila/{id} | Detalhar fila |
| PUT | /api/v1/fila/{id} | Atualizar fila |
| PATCH | /api/v1/fila/{id}/tipo-atendimento/{tipoAtendimentoId}/adicionar | Adiciona tipo de atendimento Ć fila |
| PATCH | /api/v1/fila/{id}/tipo-atendimento/{tipoAtendimentoId}/remover | Remove tipo de atendimento da fila |
| DELETE | /api/v1/fila/{id} | Apagar fila |
### š Senha: Endpoints com CRUD para gerar e operar senha(s)
Cada senha Ć© vinculada a uma fila e um tipo de serviƧo que define a sua prioridade na fila. Possui endpoints para chamar próxima senha de uma fila, chamar/rechamar senha especĆfica, operar para marcar uma senha como chamada, finalizada e atendida e tambĆ©m conseguir ver detalhe de senha e listar senhas conforme intervalo de dia(s)/data(s) e status.
Nas lista de "todas as senhas geradas" e de "todas as senhas geradas e não finalizadas", se o utilizador possui perfil somente de ATENDENTE, então retorna somente as senhas de filas vinculadas ao(s) departamento(s) que o atendente pertence/atende.
| Método | Endpoint | Descrição |
|--------|--------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|
| POST | /api/v1/senha | Gera uma nova senha para fila e tipo de atendimento |
| GET | /api/v1/senha | Lista todas as senhas geradas |
| GET | /api/v1/senha/nao-finalizadas | Lista todas as senhas geradas e não finalizadas |
| GET | /api/v1/senha/{id} | Detalha senha |
| GET | /api/v1/senha/{dataInicio}/{dataFim} | Lista as senhas por intervalo de dias/datas |
| GET | /api/v1/senha/chamadas/{dataInicio}/{dataFim} | Lista as senhas chamadas por intervalo de dias/datas |
| GET | /api/v1/senha/finalizadas/{dataInicio}/{dataFim} | Lista as senhas finalizadas por intervalo de dias/datas |
| GET | /api/v1/senha/atendidas/{dataInicio}/{dataFim} | Lista as senhas atendidas por intervalo de dias/datas |
| PATCH | /api/v1/senha/{id}/chamar-senha | Chama senha especificada |
| PATCH | /api/v1/senha/fila/{filaId}/chamar-senha | Chama próxima senha da fila especificada conforme definições de prioridade do(s) tipo(s) de atendimento |
| PATCH | /api/v1/senha/{id}/finalizar-senha | Marca a senha especĆficada como finalizada com respectivo motivo informado |
| PATCH | /api/v1/senha/finalizar-senhas | Marca as senhas como finalizadas conforme fila e tipo de atendimento especificados juntamente com devido motivo informado |
| PATCH | /api/v1/senha/finalizar-todas-senhas | Marca como finalizada todas as senhas que ainda não estavam finalizadas no sistema com motivo informado |
| PATCH | /api/v1/senha/{id}/atender-senha | Marca a senha como atendida |
| PATCH | /api/v1/senha/{id}/resetar-status | Reseta status da senha, retira a marcação de que foi chamada, atendida e finalizada |
š Para documentação mais completa dos Endpoints, basta acessar o Swagger que fica disponĆvel em http://localhost:8080/swagger-ui.html
quando o projeto Ć© executado.
š½ Para testar localmente os Endpoints, existe coleção do [Postman] que jĆ” possuĆ requisiƧƵes HTTP configuradas. O
arquivo `Queue Service API.postman_collection.json` e `Queue Service API - Enviroments.postman_collection` estão na
pasta [postman](https://github.com/didifive/queue-service-api/tree/master/postman). Basta importar os dois arquivos no
aplicativo do Postman e selecionar o ambiente (environment) Localhost. A vantagem de utilizar a configuração do domĆnio
com ambientes (environments) é permitir uma rÔpida utilização da aplicação em local host e qualquer outro ambiente em
que foi feito deploy.
---
## šØ Visuais
Logotipo:

UML - Diagrama de Classes:

OpenAPI - Swagger:

Spring Banner Personalizado:

---
## ~~š± Frontend em React para este projeto~~
~~Em desenvolvimento.~~
---
š Qualquer dĆŗvida, sugestĆ£o ou crĆtica Ć© só entrar em contato ou abrir uma Issue (https://github.com/didifive).
š Feito com muita dedicação e aprendizado. #EnjoyThis
---
š Links Interessantes:
* [Java 17 - Documentation]
* [IntelliJ]
* [ElephantSQL]
* [spring]
* [spring initializr]
* [SQLite Database with Spring Boot]
* [Jakarta Validation]
* [Lombok]
* [Maven]
[Jakarta Validation]: https://beanvalidation.org/
[Lombok]: https://projectlombok.org/
[Java 17 - Documentation]: https://docs.oracle.com/en/java/javase/17/
[IntelliJ]: https://www.jetbrains.com/pt-br/idea/
[Maven]: https://maven.apache.org/
[H2 Database]: https://h2database.com/
[spring initializr]: https://start.spring.io/
[spring]: https://spring.io/
[ElephantSQL]: https://www.elephantsql.com/
[didifive/queue-service-api]: https://github.com/didifive/queue-service-api
[SQLite Database with Spring Boot]: https://fullstackdeveloper.guru/2020/05/01/how-to-integrate-sqlite-database-with-spring-boot/#:~:text=SQLite%20is%20the%20most%20used%20database%20engine%20in,you%20don%E2%80%99t%20have%20to%20do%20for%20other%20databases.
[Postman]: https://www.postman.com/