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.
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.
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.
- 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
eTOKEN_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
- Criar testes unitƔrios
- Implementar Log
- Implementar Cache
- Revisar DTOs de respostas para melhor aproveitamento do Front-End
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 emspring.datasource.url
noapplication.properties
, exemplo de valor para esta variƔvel: jdbc:postgresql://host.db.elephantsql.com: 5432/database?user=usuario&password=senhaTOKEN_API_SECRET
: Token de segredo para o JWT, este valor Ć© utilizado emqueue-service-api.jwt.secret
noapplication.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:
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:
./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
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.
- 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)
Abaixo segue uma lista geral dos endpoints com resumo de suas funcionalidades:
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. |
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 |
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 |
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 |
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 |
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 |
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 |
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. 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.
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: