Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
cdfb43b
chore: Configuração inicial
jefersonsann Jul 20, 2024
89801a8
chore: Adicionando e configurando prisma ORM
jefersonsann Jul 20, 2024
648d545
feat: Add e configurando tasks
jefersonsann Jul 20, 2024
a5c4d7a
fix: Slug do prisma deve ser único
jefersonsann Jul 20, 2024
fbce687
feat: Adicionando validação com zod
jefersonsann Jul 20, 2024
b154274
refactor: Melhorando a logica para criar tasks e query no findAll
jefersonsann Jul 20, 2024
d0a62fc
feat: Rota para buscar task por id
jefersonsann Jul 21, 2024
a20dafb
feat: Adicionado update das tasks
jefersonsann Jul 21, 2024
6aae017
feat: Adicionado delete task
jefersonsann Jul 21, 2024
fdaf874
feat: CRUD de usuário feito
jefersonsann Jul 21, 2024
d65c8b3
feat: adicionado auth + jwt ao criar usuário e login
jefersonsann Jul 21, 2024
1f0cb2c
fix: correção do retorno user e erro
jefersonsann Jul 21, 2024
fb79359
feat: Middleware de validação token JWT e proteger rotas privadas
jefersonsann Jul 21, 2024
76c1862
refactor: Deletar usuário somente após confirmar senha correta. Rotas…
jefersonsann Jul 22, 2024
604f25f
refactor: Deletar task apenas quando o usuário estiver autenticado
jefersonsann Jul 22, 2024
f92e6fb
chore: Arquivos de .http para testar rotas com extensão REST Client
jefersonsann Jul 22, 2024
1dd3999
refactor: Incluindo tabela comments no projeto e alterando o campo Se…
jefersonsann Jul 22, 2024
fd7a41c
docs: Passando readme para required.md
jefersonsann Jul 23, 2024
aba5551
docs: README agora conta sobre o projeto e minha experiencia em desen…
jefersonsann Jul 23, 2024
d1d201f
feat: Agora as tasks porem ser marcadas como concluídas
jefersonsann Jul 23, 2024
d637d34
fix: Correção para receber o id da task a ser editada
jefersonsann Jul 23, 2024
3a2f5fa
fix: Agora quando uma nova autenticação é feita o token na seção desa…
jefersonsann Jul 23, 2024
cde9548
chore: Correção na chamada do tsup para build e ignorar arquivos .http
jefersonsann Jul 23, 2024
9c00f07
docs: Passo-a-passo no readme sobre como rodas o projeto.
jefersonsann Jul 23, 2024
a0cc9cf
chore: Adicionando docker a aplicação
jefersonsann Jul 23, 2024
2f60cd1
docs: Documentação das rotas com swagger path /docs
jefersonsann Jul 24, 2024
c664790
feat: Rota de logout
jefersonsann Jul 24, 2024
187df06
docs: Adicionando CORS
jefersonsann Jul 24, 2024
dfbfa3b
fix: Correção de pequenos erros
jefersonsann Jul 24, 2024
6a183b7
docs: Atualização do readme
jefersonsann Jul 24, 2024
dc50537
fix: reconfigurando dockerfile e docker-compose para funcionar como e…
jefersonsann Jul 24, 2024
3e00d1c
fix: Correção para pegar Id do usuário no headers
jefersonsann Jul 24, 2024
a60586f
docs: Swagger agora tem uma url base dinâmica
jefersonsann Jul 24, 2024
0154685
docs: Dotenv adicionado
jefersonsann Jul 24, 2024
3dc0258
docs: Dotenv adicionado
jefersonsann Jul 24, 2024
554bafb
Merge branch 'main' of https://github.com/jefersonsann/TrilhaBackEndJ…
jefersonsann Jul 24, 2024
c2d2b9b
fix: Configurando host para subir em produção
jefersonsann Jul 25, 2024
998cc79
docs: Adicionando link deploy no readme
jefersonsann Jul 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules
dist
.env
6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
HOST=::0.0.0.0
PORT=4000
DB_DATABASE_NAME="trilhabackend-jr"
DATABASE_URL="file:./${DB_DATABASE_NAME}.db"

SECRET_KEY=batata
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules
dist
.env
4 changes: 4 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"singleQuote": true,
"trailingComma": "all"
}
12 changes: 12 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM node:18.18-alpine

WORKDIR /usr/app

COPY . .

EXPOSE 4000

RUN npm i
RUN npm run build

CMD ["npm", "start"]
5 changes: 5 additions & 0 deletions Dockerfile.sqlite
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM alpine:3.19

RUN apk add --no-cache sqlite

WORKDIR /database
305 changes: 206 additions & 99 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,99 +1,206 @@
![Código Certo Coders](https://utfs.io/f/3b2340e8-5523-4aca-a549-0688fd07450e-j4edu.jfif)

# 📚 Trilha Inicial BackEnd Jr
Este projeto tem como objetivo desenvolver uma API RESTful para gerenciamento de tarefas, proporcionando funcionalidades de CRUD (Create, Read, Update, Delete) de tarefas, autenticação de usuários e armazenamento dos dados em um banco de dados.

## Objetivos:
- Criar uma API que permita CRUD (Create, Read, Update, Delete) de tarefas.
- Implementar autenticação de usuários.
- Utilizar um banco de dados SQLite para armazenar as tarefas.
- Documentar todo o processo e apresentar as conclusões.

## Requisitos Funcionais:
- Criar Tarefa: Endpoint para criar uma nova tarefa.
- Listar Tarefas: Endpoint para listar todas as tarefas.
- Atualizar Tarefa: Endpoint para atualizar uma tarefa existente.
- Deletar Tarefa: Endpoint para deletar uma tarefa existente.

## Autenticação de Usuários:
- Registro de Usuário: Endpoint para registrar um novo usuário.
- Login de Usuário: Endpoint para autenticar um usuário e gerar um token JWT.
- Proteção de Rotas: Garantir que apenas usuários autenticados possam acessar os endpoints de tarefas.

## Banco de Dados:
- Utilizar SQLite como banco de dados para armazenar informações de usuários e tarefas.

#### Estrutura do Projeto:
```plaintext
project-root/
├── src/
│ ├── controllers/
│ ├── models/
│ ├── routes/
│ ├── middlewares/
│ ├── database/
│ └── app.js
├── .env
├── .gitignore
├── README.md
└── package.json
```
## Entregáveis:
1. **Código Fonte:**
- Código fonte do projeto, organizado conforme a estrutura acima.
2. **Repositório GitHub:**
- Repositório público contendo o código fonte e documentação.
3. **Documentação:**
- README.md com instruções sobre como configurar e executar o projeto, além de detalhes dos endpoints da API.

### Detalhes Técnicos: 🔧
- **Boas Práticas:** Utilizar boas práticas de código limpo, legível e bem documentado.
- **Git:** Utilizar Git para controle de versão e submeter o projeto através de um repositório público no GitHub.

### Dicas para Abordar o Projeto 🌟
- **Crie um Fork desse Repositório.**
- **Criar do Zero:** É fundamental que o projeto seja desenvolvido completamente do zero, demonstrando suas habilidades e criatividade desde o início.
- **Utilize bibliotecas** como Express para criação da API e jsonwebtoken para autenticação.
- **Documente cada etapa do processo para facilitar a compreensão.**

### Critérios de Avaliação: 📝
- **Funcionalidade:** A aplicação atende aos requisitos funcionais e funciona corretamente?
- **Qualidade do Código:** O código é limpo, bem estruturado e adequadamente documentado?
- **Segurança:** A autenticação foi implementada corretamente e as rotas estão protegidas?
- **Uso do Git:** O controle de versão é usado de forma eficaz com mensagens de commit significativas?
- **Documentação:** A documentação é clara e detalha o processo de desenvolvimento e uso da API?

### Não Queremos 🚫
- Descobrir que o candidato não foi quem realizou o teste.
- Ver commits grandes sem muita explicação nas mensagens no repositório.
- Entregas padrão ou cópias de outros projetos. Buscamos originalidade e autenticidade em cada contribuição.

### Prazo ⏳
A data máxima para entrega das trilhas foi removida, permitindo que as pessoas entreguem conforme sua disponibilidade. No entanto, ainda é necessário concluir a trilha com sucesso para ser inserido em uma equipe.

### Instruções de Entrega: 📬
Após finalizar o projeto, publique-o em uma URL pública (por exemplo, Vercel, Netlify, GitHub Pages, etc.) e hospede o seu servidor na nuvem. Use serviços que ofereçam uso gratiuto por um período, como a AWS e preencha o [Formulário](https://forms.gle/gZViPMTSDV5nidSu6):

---

### Desafio da Inovação 🚀
Achou esse projeto inicial simples? Eleve ainda mais! Estamos em busca de mentes inovadoras que não apenas criem, mas que também desafiem os padrões. Como você pode transformar essa estrutura inicial em algo verdadeiramente extraordinário? Demonstre o poder da sua criatividade e o impacto das suas ideias inovadoras!

---

🔗 **Mantenha-se Conectado:**
- [Discord](https://discord.gg/wzA9FGZHNv)
- [Website](http://www.codigocertocoders.com.br/)
- [LinkedIn](https://www.linkedin.com/company/codigocerto/)

🌐 **Contato:**
- Email: codigocertocoders@gmail.com

---

### Precisa de Ajuda?
Está com alguma dificuldade, encontrou algum problema no desafio ou tem alguma sugestão pra gente? Crie uma issue e descreva o que achar necessário.

**Construindo o amanhã, hoje.**
# Como foi construir esse projeto?

Foi algo bem desafiador por eu não ter usado o express puro ainda, apenas tinha usado o fastify e nestJS(_que usa o express como base_). Mas por outro lado acabou sendo mais tranquilo por que esse tipo de aplicação eu ja vinha desenvolvendo para uma outra aplicação pessoal que venho trabalhando o [MeuPet](https://jefersonsann.com/projects/meupet/), um projeto pessoal feito em next.js que estou passando a logica de negocio para nestJS.

Uma das coisas que me fez perder bastante tempo era que usando o Express eu precisava passa o `app.use(json())` para o corpo da requisição ser recebida(_eu não sabia_), por usar framework e bibliotecas que ja vem com isso configurado.

E em algumas partes como no **service** eu resolvi usar classes ao invés de function ou arrow function por questão de organização.

Mas no fim foi muito gratificante e prazeroso realizar esse projeto.
Estou aberto para dicas e sugestões.

Deploy AWS Swagger: [jefersonsann.online:4000/docs/](http://jefersonsann.online:4000/docs/#/)

## 1 - Mapear tudo o que era pedido e saber se eu era capaz de realizar(mais é logico que sim!)

- [x] Criar uma API que permita CRUD (Create, Read, Update, Delete) de tarefas.

- [x] Implementar autenticação de usuários.

- [x] Utilizar um banco de dados SQLite para armazenar as tarefas.

- [x] Documentar todo o processo e apresentar as conclusões.

> [!NOTE]
> Estou utilizando o [SQLite](https://www.sqlite.org/) junto com o [Prisma ORM](https://www.prisma.io/)

## 2 - Requisitos Funcionais:

- [x] Criar Tarefa: Endpoint para criar uma nova tarefa.

```
/api/task
```

É obrigatório para criar uma task:

- [x] O usuário estar autenticado
- [x] Passa um titulo e uma descrição

```
# Exemplo:
{
"title": "Task Title",
"description": "Task Description"
}
```

- [x] Listar Tarefas: Endpoint para listar todas as tarefas.

```
/api/task
```

Rota para listar todos as tarefas(tasks)

- [x] Atualizar Tarefa: Endpoint para atualizar uma tarefa existente.

```
/api/task
```

É obrigatório para atualizar uma task:

- [x] O usuário estar autenticado
- [x] A task ter sido ele quem a criou
- [x] Passa um titulo ou uma nova descrição

```
# Exemplo:
{
"title": "Task Title 2",
"description": "Other Description"
}
```

- [x] Deletar Tarefa: Endpoint para deletar uma tarefa existente.

```
/api/task
```

É obrigatório para deletar uma task:

- [x] O usuário estar autenticado
- [x] O Id deve ser informado como parâmetro na url
- [x] O usuário autenticado ter criado a task

> [!NOTE]
>
> Em routes é o local onde especifico o caminho base para cada Endpoint
>
> **routes.use('/api/task', Tasks);** // é o caminho base para os endpoint de tasks
> Ja no controller de _src/tasks_ é onde eu indico o final de cada rota e os middleware caso necessário

## 3 - Autenticação de Usuários:

- [x] Registro de Usuário: Endpoint para registrar um novo usuário.
- [x] Login de Usuário: Endpoint para autenticar um usuário e gerar um token JWT.
- [x] Proteção de Rotas: Garantir que apenas usuários autenticados possam acessar os endpoints de tarefas.

## 4 - Banco de Dados:

- [x] Utilizar SQLite como banco de dados para armazenar informações de usuários e tarefas.

### Tabela "users" no banco de dados:

| column | type | more |
| ---------- | --------- | ------- |
| id | String | cuid() |
| name | String |
| email | String | @unique |
| password | String |
| tasks | Task[] |
| comments | Comment[] |
| sessions | Session[] |
| created_at | DateTime |
| updated_at | DateTime |

### Tabela "sessions" no banco de dados:

| column | type | more |
| ---------- | -------- | -------------- |
| id | String | cuid() |
| userId | String |
| token | String | @unique |
| active | Boolean | @default(true) |
| created_at | DateTime |
| updated_at | DateTime |

> [!NOTE]
> Resolvi criar a autenticação em sessão separada, por achar ser mais fácil de controlar e implementar seguranças como refresh token, IP do usuário, seções em diversos aplicativos ou navegadores, ou seja, o que a aplicação pedir conforme ela se expandir.

### Tabela "tasks" no banco de dados:

| column | type | more |
| ----------- | --------- | ------- |
| id | String | cuid() |
| title | String |
| description | String |
| slug | String | @unique |
| userId | String |
| comments | Comment[] |
| created_at | DateTime |
| updated_at | DateTime |

# Como rodar esse projeto?

## 🚀 Configuração Inicial Local

> [!NOTE]
> Antes tenha garantido que voce esta com o [Nodejs](https://nodejs.org/) instalado na sua maquina, e o [docker](https://www.docker.com/) é opcional.

#### 1. Clone o repositório:

```
git clone https://github.com/jefersonsann/TrilhaBackEndJR-JUN15.git
```

Ou fork

```
git clone https://github.com/<SEU_USERNAME>/TrilhaBackEndJR-JUN15.git
```

#### 2. Clone o arquivo .env de exemplo `.env.example`:

Ou use o comando abaixo

```
cp .env.example > .env
```

#### 3. Instale as dependências:

```
$ npm install
$ npx prisma generate
$ npx prisma migrate dev
```

#### 4. Iniciando a aplicação como dev:

```
$ npm run start:dev
```

#### 5. Fazendo deploy:

```
$ npm run build
```

Iniciando a aplicação após deploy

```
$ npm run start
```

Rota para users disponível em <http://localhost:4000/api/user>.
Rota para auth disponível em <http://localhost:4000/api/auth + /login ou /logout>.
Rota para tasks disponível em <http://localhost:4000/api/task>.
As rotas com swagger estará disponível em <http://localhost:4000/docs>.

## Author

- [Jeferson Santos](https://jefersonsann.com) | [GitHub](https://github.com/jefersonsann)
Loading