Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
- Host: GitHub
- URL: https://github.com/codewarriorsdevs/opus-backend
- Owner: codewarriorsdevs
- Created: 2024-10-15T01:14:39.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2024-10-29T23:21:08.000Z (19 days ago)
- Last Synced: 2024-10-30T01:51:15.994Z (19 days ago)
- Topics: docker, mysql, nodejs, prisma, projeto-ativo
- Language: TypeScript
- Homepage:
- Size: 201 KB
- Stars: 0
- Watchers: 0
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
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.
## Em Desenvolvimento... ⚠
## Equipe de Desenvolvimento
Ruan Victor
Bruno Lima
Kely Soares
Hugo Amadio
Jorge Jesus
Matheus Mozart
Jociel Andrade
João Carlos
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! :)