Skip to content

devhebert/skillscan-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Skill Scan (Diagnóstico de Conhecimento)

  1. Sobre o projeto

  2. Arquitetura

  3. Testes

  4. Setup

  5. Documentação da API

Skill Scan(Diagnóstico de Conhecimento)

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.


Arquitetura

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.

Estrutrura base do projeto

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

API

Projeto web com os pontos de interação com o usuário, irá conter:

  • Endpoint's de entrada
  • Configuration para injetar as implementações das dependências
  • Authentication, configurações de autenticação

Aplication

Projeto contendo:

  • UseCases da aplicação (Interface e Implementação)
  • Services da aplicação, que não estão diretamento ligados aos models
  • Adapters para o Domain

Domain

Projeto contendo:

  • Models
  • Repositories, definição de interfaces

Infrastructure

Projeto contendo as implementações:

  • Repository de domain
  • Service de 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


Testes

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/


Setup

  • 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-image

    Entendendo 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-container

    Para pausar o contêiner, execute: docker pause my-mongodb-container

    Para 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).


Documentação da API

Você pode acessar a documentação da API em: http://localhost:8888/swagger-ui.html quando o projeto estiver em execução.

User Endpoints

POST /api/v1/user/create

Descrição: Cria um novo usuário.

Request Body:

{
    "username": "string",
    "password": "string",
    "role": "ENUM"
}

GET /api/v1/user/get-all

Descrição: Retorna uma lista de todos os usuários.

DELETE /api/v1/user/{id}

Descrição: Deleta um usuário com o ID especificado. Parâmetros:

  • id (UUID): O ID do usuário a ser deletado.

GET /api/v1/user/{id}

Descrição: Retorna um usuário com o ID especificado. Parâmetros:

  • id (UUID): O ID do usuário a ser retornado.

PUT /api/v1/user/{id}

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"
}

Course Endpoints

POST /api/v1/course/create

Descrição: Cria um novo curso.

Request Body:

{
    "technologyId": "UUID",
    "name": "string",
    "content": "string",
    "keywords": ["string"]
}

GET /api/v1/course/get-all

Descrição: Retorna uma lista de todos os cursos.

DELETE /api/v1/course/{id}

Descrição: Deleta um curso com o ID especificado. Parâmetros:

  • id (UUID): O ID do curso a ser deletado.

GET /api/v1/course/{id}

Descrição: Retorna um curso com o ID especificado. Parâmetros:

  • id (UUID): O ID do curso a ser retornado.

PUT /api/v1/course/{id}

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"]
}

Technology Endpoints

POST /api/v1/technology/create

Descrição: Cria uma nova tecnologia.

Request Body:

{
    "name": "string"
}

GET /api/v1/technology/get-all

Descrição: Retorna uma lista de todas as tecnologias.

DELETE /api/v1/technology/{id}

Descrição: Deleta uma tecnologia com o ID especificado. Parâmetros:

  • id (UUID): O ID da tecnologia a ser deletada.

GET /api/v1/technology/{id}

Descrição: Retorna uma tecnologia com o ID especificado. Parâmetros:

  • id (UUID): O ID da tecnologia a ser retornada.

PUT /api/v1/technology/{id}

Descrição: Atualiza uma tecnologia com o ID especificado. Parâmetros:

  • id (UUID): O ID da tecnologia a ser atualizada.

Request Body:

{
    "name": "string"
}

Question Endpoints

POST /api/v1/question/create

Descrição: Cria uma nova questão.

Request Body:

{
    "questionText": "string",
    "answers": ["string"],
    "difficulty": "ENUM",
    "technologyId": "UUID"
}

GET /api/v1/question/get-all

Descrição: Retorna uma lista de todas as questões.

DELETE /api/v1/question/{id}

Descrição: Deleta uma questão com o ID especificado. Parâmetros:

  • id (UUID): O ID da questão a ser deletada.

GET /api/v1/question/{id}

Descrição: Retorna uma questão com o ID especificado. Parâmetros:

  • id (UUID): O ID da questão a ser retornada.

PUT /api/v1/question/{id}

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"
}

Random Question Endpoints

GET /api/v1/random-question/{technologyId}

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.

Quiz Attempt Endpoints

POST /api/v1/quiz-attempt/create

Descrição: Cria uma nova tentativa de quiz.

Request Body:

{
    "userId": "UUID",
    "technologyId": "UUID",
    "questionResponses": ["QuestionResponse"]
}

GET /api/v1/quiz-attempt/get-all

Descrição: Retorna uma lista de todas as tentativas de quiz.

GET /api/v1/quiz-attempt/{id}

Descrição: Retorna uma tentativa de quiz com o ID especificado. Parâmetros:

  • id (UUID): O ID da tentativa de quiz a ser retornada.

Get User Test Results Endpoints

GET /api/v1/user-test-results/get-all

Description: Retorna uma lista de todos os resultados de teste dos usuários.

Login Endpoints

POST /api/v1/auth/login

Descrição: Cria uma tentativa de de login.

Request Body:

{
    "username": "String",
    "password": "String"
}

ChartData Endpoints

GET /api/v1/chart-data/{id}

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"
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors