O Skill Scan (Diagnóstico de Conhecimento) é um micro-serviço projetado para avaliar o nível de conhecimento em uma determinada tecnologia de novos colaboradores. Seu objetivo central é proporcionar uma análise precisa e eficaz das habilidades técnicas dos profissionais.
No Skill Scan, cada colaborador dispõe de uma aba personalizada, na qual pode selecionar a tecnologia desejada e responder a 10 questões de múltipla escolha. Após a submissão, o sistema fornecerá uma pontuação. Em caso de erro em alguma questão, serão sugeridos cursos relacionados para aprimorar o conhecimento do colaborador.
No âmbito da gestão, esses testes funcionam como parâmetros valiosos para acompanhar o progresso individual dos colaboradores. Ao analisar as pontuações ao longo do tempo, os gestores podem observar melhorias graduais e identificar áreas de desenvolvimento. Além disso, os resultados podem ser utilizados para criar insights, permitindo a elaboração de planos de carreira personalizados com base no perfil de cada colaborador. Essa abordagem estratégica facilita a promoção do desenvolvimento profissional e a otimização do desempenho da equipe.
A arquitetura empregada neste projeto adota a Clean Architecture, combinada com a abordagem Maven Multimodule. Essa sinergia entre as duas arquiteturas traz diversas vantagens significativas para o desenvolvimento do sistema. Aqui estão algumas razões para a escolha dessa combinação:
-
Separação de Responsabilidades: A Clean Architecture preconiza uma divisão clara e hierárquica das camadas do sistema, como Entidades, Casos de Uso, Adaptadores e Frameworks. Isso contribui para a manutenção de um código mais organizado e de fácil compreensão. O Maven Multimodule complementa essa abordagem ao permitir a criação de módulos independentes, cada um responsável por uma parte específica do sistema. Isso facilita a gestão de dependências e promove uma melhor separação de responsabilidades entre os diferentes componentes do projeto.
-
Reusabilidade de Código: Com a utilização de módulos no Maven, é possível criar componentes reutilizáveis que podem ser compartilhados entre diferentes partes do sistema ou até mesmo em projetos futuros. A Clean Architecture favorece a criação de componentes independentes, tornando mais fácil isolar e reutilizar lógicas de negócios específicas em diferentes contextos da aplicação.
-
Testabilidade Aprimorada: A Clean Architecture promove a testabilidade ao isolar a lógica de negócios em camadas independentes, facilitando a execução de testes unitários e a aplicação de práticas como TDD (Test-Driven Development). A estrutura modular do Maven possibilita a execução de testes de forma granular, focando em módulos específicos, o que é fundamental para garantir a integridade e confiabilidade do sistema como um todo.
-
Escalabilidade: A arquitetura limpa e os módulos do Maven proporcionam uma base sólida para a escalabilidade do projeto. À medida que a aplicação cresce, novos módulos podem ser adicionados ou existentes podem ser expandidos sem comprometer a estrutura global do sistema. A divisão clara de responsabilidades facilita a adição de novos recursos, evolução da aplicação e manutenção sustentável ao longo do tempo.
ROOT
├ __api__ (API)
│ pom.xml
├ modules
│ ├ __application__ (Casos de uso / Serviços de Aplicação)
│ │ pom.xml
│ ├ __domain__ (Model's / Repositórios e Serviços associados aos Models)
│ │ pom.xml
│ └ __infrastructure__ (Implementações utilizando dependências externas)
│ pom.xml
└ pom.xml
Projeto web com os pontos de interação com o usuário, irá conter:
Endpoint'sde entradaConfigurationpara injetar as implementações das dependênciasAuthentication, configurações de autenticação
Projeto contendo:
UseCasesda aplicação (Interface e Implementação)Servicesda aplicação, que não estão diretamento ligados aosmodelsAdapterspara o Domain
Projeto contendo:
ModelsRepositories, definição de interfaces
Projeto contendo as implementações:
Repositoryde domainServicede domain e aplication que possuem dependência de implementação específica
Link: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
Para os testes neste projeto, será adotado o padrão AAA(Triple A), que representa Arrange, Act, e Assert. Esse padrão é uma convenção estrutural comum em testes unitários e tem como objetivo fornecer uma estrutura clara e consistente para a organização dos testes. Aqui está o que cada parte do padrão AAA significa:
-
Arrange (Organizar): Nesta fase, são preparados todos os dados e contextos necessários para a execução do teste. Isso inclui a criação de objetos, a configuração de estados iniciais e a definição de quaisquer condições prévias necessárias para a operação que será testada.
-
Act (Agir): Durante esta etapa, a operação ou função que está sendo testada é executada. Isso envolve a interação com o sistema ou a chamada de métodos específicos que estão sendo avaliados. O objetivo é observar o comportamento do sistema sob condições controladas.
-
Assert (Verificar): Na fase de Assert, são feitas as verificações para confirmar se o comportamento do sistema está de acordo com o esperado. São utilizadas as asserções (assertions) para comparar o resultado real da operação com o resultado esperado. Se as condições definidas não forem atendidas, o teste é considerado falho.
Link: https://java-design-patterns.com/patterns/arrange-act-assert/
-
Instalando Java 21 LTS: https://www.oracle.com/br/java/technologies/downloads/#java21
-
Instalando o Docker: Certifique-se de ter o Docker instalado no seu sistema. Você pode baixá-lo aqui(https://www.docker.com/products/docker-desktop/).
No terminal, navegue até o diretório onde está o arquivo Dockerfile e execute o seguinte comando para construir a imagem:
docker build -t my-mongodb-image . -
Subindo o MongoDB com Docker: Execute o seguinte comando para iniciar um contêiner usando a imagem do MongoDB que acabou de ser criada:
docker run -d -p 27017:27017 --name my-mongodb-container my-mongodb-imageEntendendo o que o comando acima faz:
-d: Executa o contêiner em segundo plano.
-p 27017:27017: Mapeia a porta 27017 do host para a porta 27017 do contêiner.
--name my-mongodb-container: Define um nome para o contêiner.
-
Gerenciando o Contêiner MongoDB:
Para iniciar o contêiner (caso esteja parado), execute:
docker start my-mongodb-containerPara pausar o contêiner, execute:
docker pause my-mongodb-containerPara retomar a execução do contêiner após pausá-lo, execute:
docker unpause my-mongodb-container -
Instalando o MongoDB Compass: Para visualizar seu banco de dados, você tem duas opções: usar o Mongosh para consultas via terminal ou, se preferir, optar pelo Mongo Compass. O Mongo Compass oferece uma interface gráfica amigável que permite interagir com o banco de dados de forma intuitiva e fácil de usar. Você pode baixá-lo aqui(https://www.mongodb.com/try/download/compass).
Você pode acessar a documentação da API em: http://localhost:8888/swagger-ui.html quando o projeto estiver em execução.
Descrição: Cria um novo usuário.
Request Body:
{
"username": "string",
"password": "string",
"role": "ENUM"
}Descrição: Retorna uma lista de todos os usuários.
Descrição: Deleta um usuário com o ID especificado. Parâmetros:
- id (UUID): O ID do usuário a ser deletado.
Descrição: Retorna um usuário com o ID especificado. Parâmetros:
- id (UUID): O ID do usuário a ser retornado.
Descrição: Atualiza um usuário com o ID especificado. Parâmetros:
- id (UUID): O ID do usuário a ser atualizado.
Request Body:
{
"username": "string",
"password": "string",
"role": "ENUM"
}Descrição: Cria um novo curso.
Request Body:
{
"technologyId": "UUID",
"name": "string",
"content": "string",
"keywords": ["string"]
}Descrição: Retorna uma lista de todos os cursos.
Descrição: Deleta um curso com o ID especificado. Parâmetros:
- id (UUID): O ID do curso a ser deletado.
Descrição: Retorna um curso com o ID especificado. Parâmetros:
- id (UUID): O ID do curso a ser retornado.
Descrição: Atualiza um curso com o ID especificado. Parâmetros:
- id (UUID): O ID do curso a ser atualizado.
Request Body:
{
"technologyId": "UUID",
"name": "string",
"content": "string",
"keywords": ["string"]
}Descrição: Cria uma nova tecnologia.
Request Body:
{
"name": "string"
}Descrição: Retorna uma lista de todas as tecnologias.
Descrição: Deleta uma tecnologia com o ID especificado. Parâmetros:
- id (UUID): O ID da tecnologia a ser deletada.
Descrição: Retorna uma tecnologia com o ID especificado. Parâmetros:
- id (UUID): O ID da tecnologia a ser retornada.
Descrição: Atualiza uma tecnologia com o ID especificado. Parâmetros:
- id (UUID): O ID da tecnologia a ser atualizada.
Request Body:
{
"name": "string"
}Descrição: Cria uma nova questão.
Request Body:
{
"questionText": "string",
"answers": ["string"],
"difficulty": "ENUM",
"technologyId": "UUID"
}Descrição: Retorna uma lista de todas as questões.
Descrição: Deleta uma questão com o ID especificado. Parâmetros:
- id (UUID): O ID da questão a ser deletada.
Descrição: Retorna uma questão com o ID especificado. Parâmetros:
- id (UUID): O ID da questão a ser retornada.
Descrição: Atualiza uma questão com o ID especificado. Parâmetros:
- id (UUID): O ID da questão a ser atualizada.
Request Body:
{
"questionText": "string",
"answers": ["string"],
"difficulty": "ENUM",
"technologyId": "UUID"
}Descrição: Retorna uma questão aleatória com a tecnologia especificada. Parâmetros:
- technologyId (UUID): O ID da tecnologia da qual a questão será retornada.
Descrição: Cria uma nova tentativa de quiz.
Request Body:
{
"userId": "UUID",
"technologyId": "UUID",
"questionResponses": ["QuestionResponse"]
}Descrição: Retorna uma lista de todas as tentativas de quiz.
Descrição: Retorna uma tentativa de quiz com o ID especificado. Parâmetros:
- id (UUID): O ID da tentativa de quiz a ser retornada.
Description: Retorna uma lista de todos os resultados de teste dos usuários.
Descrição: Cria uma tentativa de de login.
Request Body:
{
"username": "String",
"password": "String"
}Descrição: Retorna os dados do gráfico para o usuário com o ID especificado.
- id (UUID): O ID do usuário a ser retornado.
{
"userId": "UUID",
"technologyName": "String",
"score": "Integer",
"testDate": "LocalDateTime"
}