Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/codewarriorsdevs/opus-backend

Repositório backend do Opus, plataforma com o objetivo de facilitar a empregabilidade na região de Pedro II - PI
https://github.com/codewarriorsdevs/opus-backend

docker mysql nodejs prisma projeto-ativo

Last synced: about 21 hours ago
JSON representation

Repositório backend do Opus, plataforma com o objetivo de facilitar a empregabilidade na região de Pedro II - PI

Awesome Lists containing this project

README

        

react
typescript
nodejs
expressjs
MySQL
Docker


Opus


Documentação oficial do projeto "Opus", uma plataforma responsável por conectar candidatos a empresas e serviços da região de Pedro II - PI.

Explore the docs »


## Em Desenvolvimento... ⚠

## Equipe de Desenvolvimento




Foto do Ruan Victor no GitHub


Ruan Victor





Foto do Bruno Lima no GitHub


Bruno Lima





Foto de Kely Soares no GitHub


Kely Soares





Foto do Hugo Amadio no GitHub


Hugo Amadio





Foto do Jorge Jesus no GitHub


Jorge Jesus





Foto do Matheus Mozart no GitHub


Matheus Mozart





Foto do Jociel Andrade no GitHub


Jociel Andrade





Foto do João Carlos no GitHub


João Carlos





Foto do Abdenaide no GitHub


Abdenaide Ribeiro




## Sumário

- [Documentação](#documentação)
- [Tecnologias Utilizadas](#tecnologias-utilizadas)
- [Instalação](#instalação)
- [Comandos para rodar o projeto](#comandos-para-rodar-o-projeto)
- [Rotas de autenticação e candidato](#rotas-de-autenticação-e-candidato)
- [Rota de login](#rota-de-login)
- [Rota de cadastro de candidato](#rota-de-cadastro-de-candidato)
- [Rotas de busca de candidatos](#rotas-de-busca-de-candidatos)
- [Buscar um candidato](#buscar-um-candidato)
- [Buscar todos os candidatos](#buscar-todos-os-candidatos)
- [Rotas de edição e deleção de candidatos](#rotas-de-edição-e-deleção-de-candidatos)
- [Editar um candidato](#editar-um-candidato)
- [Deletar um candidato](#deletar-um-candidato)
- [Restaurar um candidato](#restaurar-um-candidato)
- [Rotas de Upload de Arquivos](#rotas-de-upload-de-arquivos)
- [Upload de Currículo](#upload-de-currículo)
- [Rotas estáticas](#rotas-estáticas)
- [Visualizar Currículo](#visualizar-currículo)
- [Contact](#contact)

# Documentação

Está documentação trás as informações necessárias para a utilização do backend do projeto Opus. Nela você encontrará informações sobre as rotas disponíveis, os métodos aceitos, os parâmetros necessários e os comandos para rodar o projeto e os testes.

## Tecnologias Utilizadas


| Tecnologia | Descrição |
| -------------------- | --------------------------------------- |
| Node.js | Runtime de JavaScript |
| Express | Framework Web |
| Prisma | ORM (Mapeamento de Objetos-Relacionais) |
| Docker | Contêinerização |
| MySQL | Banco de Dados |
| Jest | Testes |
| Vitest | Testes |
| Bcrypt | Criptografia |
| Json Web Token (JWT) | Autenticação |
| Cors | Segurança |
| Dotenv | Gerenciamento de Variáveis de Ambiente |
| Nodemon | Ferramenta de Desenvolvimento |
| SuperTest | Testes de Integração |
| Multer | Upload de Arquivos |
| Ts-node | Execução de Código TypeScript |
| Typescript | Linguagem de Programação |

## Instalação

[Sumário](#sumário)

O servidor e o banco de dados estão em containers docker.

É altamente recomendável não modificar o arquivo `docker-compose.yml` para evitar problemas com a execução do projeto. Igualmente, não altere os scripts de execução do projeto no `package.json`.

Caso seja necessário alterar alguma configuração de porta, tenha certeza de fazer o bind corretamente no arquivo `docker-compose.yml` e no `dockerfile` no caso do backend.

Não é necessário instalar o banco de dados.


## Comandos para rodar o projeto

Instale as dependências do projeto:

```bash
npm install # Instala as dependências do projeto localmente
```

Essas dependências locais são necessária para poder fazer edições no projeto.

Em seguida, rode o projeto com o comando abaixo para rodar o servidor e o banco de dados:

```bash
docker-compose up # Roda o servidor e o banco de dados em modo de visualização de logs
docker-compose up -d # Roda o servidor e o banco de dados em modo de background
```

O Docker irá baixar as imagens e criar os containers automaticamente.

Além disso, irá instalar as dependências do projeto e um script irá inicializar o prisma(generate) e rodar as migrations e os seeders.

Após todos os comandos terem sidos executados, o projeto estará rodando e pronto para ser utilizado.

Para rodar os testes, você deverá estar dentro do container do backend e rodar o comando:

```bash
docker exec -it opus_backend /bin/bash # Acessa o container do backend
```

```bash
npm run test # Roda os testes
```

Caso encontre algum erro, por favor, abra uma issue no repositório do projeto.

## Rotas de autenticação e candidatos

[Sumário](#sumário)

Todas as rotas podem ser acessadas através do endereço `http://localhost:8000/*`, onde `*` é o caminho da rota.
Todas as rotas, com exceção da rota de login e cadastro, necessitam de um token de autenticação no header da requisição.

```json
{
"Authorization": "Bearer "
}
```

### Rota de login

> **_Rota livre de autenticação._**

- **METHOD:** _POST_.
- **PATH:** `/auth`.
- **BODY:**

```json
{
"email": "[email protected]",
"password": "senha123"
}
```

- **RESPONSE:**

```json
{
"token": "" # Isso é um exemplo, o token é gerado pelo jwt. Um token real terá um formato diferente
}
```


**Descrição:**

Essa rota autentica o usuário e gera um token com **jwt** (Json Web Token).

Ela recebe um objeto com o email e a senha do usuário e valida esses dados comparando as informações, email e senha, com os do banco de dados. A senha passada é comparada com o hash armazenado no banco de dados utilizando o **bcrypt**, e se for validado, o login é permitido e um token é gerado e retornado na resposta da requisição.

### Rota de cadastro de candidato

> **_Rota livre de autenticação._**

[Sumário](#sumário)

- **METHOD:** _POST_.
- **PATH:** `/candidate/register`.
- **BODY:**

```json
{
"name": "Nome do Candidato",
"email": "[email protected]",
"password": "senha123",
"phone": "123456789",
"address": "Rua dos Bobos, nº 0",
"age": 20,
"about": "Sobre o candidato",
"experience": "Experiência do candidato",
"formation": "Formação do candidato",
"curriculum": "file.pdf" # Arquivo do currículo
}
```

- **RESPONSE:**

```json
{
"message": "Candidato cadastrado com sucesso"
}
```


**DESCRIPTION:**

O formato do email é validado utilizando uma expressão regular(regex).

Esses dados são divididos em três tabelas para melhor organização: `candidates`, `education` e `contactInfo`.

- A tabela `candidates` armazena as informações do candidato, como nome, email, senha, idade, sobre e as FKs para as outras duas tabelas.

- A tabela `education` armazena as informações de formação do candidato, como experiência, formação e o caminho do arquivo do currículo.

- A tabela `contactInfo` armazena as informações de contato do candidato, como telefone e endereço.

Todas as operações são executadas dentro de uma transação para garantir que, se ocorrer qualquer erro durante a inserção, nenhuma mudança seja feita no banco de dados, mantendo a integridade dos dados.

O arquivo do currículo é salvo no diretório `uploads/curriculum` e o nomw do arquivo é salvo no banco de dados.

## Rotas de busca de candidatos

[Sumário](#sumário)

### Buscar um candidato

> **_Rota protegida por autenticação._**

- **METHOD:** _GET_.
- **PATH:** `/candidate/:id`.
- **RESPONSE:**

```json
{
"id": 1,
"name": "Nome do Candidato",
"email": "[email protected]",
"phone": "123456789",
"address": "Rua dos Bobos, nº 0",
"age": 20,
"about": "Sobre o candidato",
"experience": "Experiência do candidato",
"formation": "Formação do candidato",
"curriculum": "file.pdf" # caminho do currículo,
"createdAt": "2021-10-10T00:00:00.000Z",
"updatedAt": "2021-10-10T00:00:00.000Z",
"isDeleted": false
}
```

**DESCRIPTION:**

Essa rota é responsável por buscar um candidato pelo seu id.
Ela trás todas as informações do candidato incluido a `URL` do currículo.

### Buscar todos os candidatos

> **_Rota protegida por autenticação._**

- **METHOD:** _GET_.
- **PATH:** `/candidates`.
- **RESPONSE:**

```json
[
{
"id": 1,
"name": "João Silva",
"email": "[email protected]",
"age": 25,
"about": "Desenvolvedor Full Stack",
"createdAt": "2024-10-15T14:28:23.347Z",
"updatedAt": "2024-10-15T14:28:23.347Z",
"contactInfoId": 1,
"isDeleted": false,
"curriculum": "host/view/curriculum/curriculum.pdf" # o host é o endereço do servidor
},
{
"id": 2,
"name": "Maria Oliveira",
"email": "[email protected]",
"age": 30,
"about": "Designer Gráfico",
"createdAt": "2024-10-15T14:28:23.351Z",
"updatedAt": "2024-10-15T14:28:23.351Z",
"contactInfoId": 2,
"isDeleted": false,
"curriculum": "host/view/curriculum/curriculum.pdf" # o host é o endereço do servidor
}
]
```

**DESCRIPTION:**

Trás somente as informações básicas do candidato, como nome, email, idade e sobre o candidato.

Possivelmente será implementado um sistema de busca com filtros para que o recrutador possa buscar candidatos com base em suas habilidades, formação, experiência, idade, etc.

## Rotas de edição e deleção de candidatos

[Sumário](#sumário)

### Editar um candidato

> **_Rota protegida por autenticação._**

- **METHOD:** _PUT_.
- **PATH:** `/candidate/:id`.
- **BODY:**

```json
{
"name": "John Doe",
"email": "[email protected]",
"phone": "123456789",
"address": "1234 Test St",
"age": 25,
"about": "I am a test",
"experience": "I have experience in testing",
"formation": "I have a degree in testing",
"curriculum": "file.pdf",
"password": "12345678'"
}
```

- **RESPONSE:**

```json
{
"message": "Candidato atualizado com sucesso"
}
```

**DESCRIPTION:**

Essa edição pode ser parcial, ou seja, o candidato pode editar somente as informações que desejar ou todas as informações.

Essa mesma rota lida muito bem com os dois casos, pois ela verifica quais campos foram enviados e atualiza somente os campos que foram enviados.

### Deletar um candidato

> **_Rota protegida por autenticação._**

[Sumário](#sumário)

- **METHOD:** _DELETE_.
- **PATH:** `/candidate/:id`.
- **RESPONSE:**

```json
{
"message": "Candidato deletado com sucesso"
}
```

**DESCRIPTION:**

A deleção de um candidato é feita através do sistema de soft delete, ou seja, o candidato não é removido do banco de dados, mas sim marcado como deletado, `isDeleted = true`.

Essa técnica é também conhecida como deleção lógica e é muito utilizada em sistemas que necessitam manter o histórico de dados. Assim é possível recuperar os dados deletados caso seja necessário.

### Restaurar um candidato

> **_Rota protegida por autenticação._**

[Sumário](#sumário)

- **METHOD:** _PATCH_.
- **PATH:** `/candidate/restore/:id`.
- **RESPONSE:**

```json
{
"message": "Candidato restaurado com sucesso"
}
```

**DESCRIPTION:**

A restauração é feita alterando o campo `isDeleted` para `false` no banco de dados. Com isso, o candidato é restaurado e volta a ser exibido na lista de candidatos.

## Rotas de Upload de Arquivos

[Sumário](#sumário)

### Upload de Currículo

> **_Rota protegida por autenticação._**

- **METHOD:** _POST_.
- **PATH:** `/uploads/curriculum`.
- **BODY:** _Multipart Form Data_.

- **RESPONSE:**

```json
{
"message": "Currículo enviado com sucesso"
}
```

- **RESPONSE COM ERROR:**
Resposta padrão, tanto para o não envio do arquivo, quanto para o envio de um arquivo inválido.

```json
{
"message": "Arquivo não enviado ou com formato inválido. Permitido somente arquivos .pdf"
}
```

**DESCRIPTION:**

O upload de arquivos é feito através de um formulário do tipo `multipart/form-data`.

Um middleware é utilizado para fazer o upload do arquivo e salvar no diretório `uploads/curriculum`. Uma `string` com o nome do arquivo é salva no banco de dados e o arquivo pode ser acessado através do caminho estático `/view/curriculum/`.

## Rotas estáticas

[Sumário](#sumário)

### Visualizar Currículo

> **_Rota protegidas por autenticação._**

- **METHOD:** _GET_.
- **PATH:** `/view/curriculum/* - O asterisco é o nome do arquivo`.

**RESPONSE:**

> _O arquivo será exibido no navegador._

**DESCRIPTION:**

Todas as rotas estáticas começam com prefixo `/view` e são utilizadas para visualizar arquivos estáticos, como imagens, currículos, etc.


## Contact

[Sumário](#sumário)

For any inquiries or feedback, please contact the community: [[email protected]]([email protected]).

Thanks! :)