Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
c477457
:tada: Initial commit - backend structure
soaresrodrigo Jan 21, 2025
46698a9
:sparkles: Linking prisma ORM and user table
soaresrodrigo Jan 21, 2025
50db2e5
:sparkles: Added crud in user with validations and services
soaresrodrigo Jan 21, 2025
38f65a9
:sparkles: Added pagination by prisma
soaresrodrigo Jan 21, 2025
d031df4
:sparkles: Added tests by jest
soaresrodrigo Jan 22, 2025
da0aa02
:bug: Fixed bug in npm start
soaresrodrigo Jan 22, 2025
856e617
:memo: Added readme in api
soaresrodrigo Jan 22, 2025
c9cd7e1
:tada: Initial commit - frontend structure
soaresrodrigo Jan 23, 2025
d3163cb
:sparkles: Added vuetify and configure default layout
soaresrodrigo Jan 24, 2025
5c9a853
:sparkles: Added cors settings and user list
soaresrodrigo Jan 24, 2025
4bf7da8
:sparkles: Create user without validation
soaresrodrigo Jan 26, 2025
e409bb8
:sparkles: Crud completed without validation
soaresrodrigo Jan 26, 2025
553297a
:sparkles: Notification and timestamp fields in user table
soaresrodrigo Jan 26, 2025
1de1266
:sparkles: Added toLower utils to strings
soaresrodrigo Jan 26, 2025
c91962a
:sparkles: API: Data uuid is required by client
soaresrodrigo Jan 26, 2025
f1afb60
:sparkles: Frontend: Data uuid is required by client
soaresrodrigo Jan 26, 2025
bc256c3
:bug: Fixed bug in test with uuid
soaresrodrigo Jan 27, 2025
f986fae
:white_check_mark: Tests in crud user
soaresrodrigo Jan 27, 2025
301fb66
:memo: Added readme in frontend
soaresrodrigo Jan 27, 2025
77f6c3e
:memo: Added swagger config
soaresrodrigo Jan 27, 2025
1ce219e
:memo: Added generate uuid swagger
soaresrodrigo Jan 27, 2025
9e07745
:sparkles: Frontend: Added icons and refactor cypress script
soaresrodrigo Jan 27, 2025
1782eb5
:memo: Added comments.md
soaresrodrigo Jan 27, 2025
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
65 changes: 65 additions & 0 deletions COMMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# COMMENTS.md

## Decisão da Arquitetura Utilizada

### **Frontend**
O frontend foi desenvolvido utilizando o framework **Vue 3** em conjunto com **Vite** para proporcionar uma experiência de desenvolvimento moderna, rápida e eficiente. Algumas decisões arquiteturais importantes incluem:
- **Composição Modular**: O uso do Pinia como gerenciador de estado promoveu uma estrutura escalável e de fácil manutenção.
- **Design Responsivo**: O Vuetify foi utilizado para garantir que o design da interface se adaptasse perfeitamente a diferentes dispositivos.
- **TypeScript**: Adotado para maior segurança no desenvolvimento e prevenção de erros em tempo de compilação.
- **Cypress**: Escolhido para testes E2E e de componentes, garantindo que todas as funcionalidades críticas funcionem corretamente.

### **Backend**
O backend foi implementado em **Node.js** com **Express**, acompanhado de **Prisma** como ORM, para facilitar o acesso e manipulação do banco de dados relacional. A validação de dados foi feita com **Zod** e a documentação foi gerada com **Swagger**.

#### Pilares da Arquitetura:
- **Modularidade**: Divisão de responsabilidades clara entre os módulos.
- **Escalabilidade**: Escolha de tecnologias que permitem crescer facilmente o sistema.
- **Testabilidade**: Uso de ferramentas como **Jest** para testes unitários e de integração no backend.

---

## Lista de Bibliotecas de Terceiros Utilizadas

### **Frontend**
- **[@mdi/font](https://github.com/Templarian/MaterialDesign-Webfont)**: Ícones de material design.
- **[axios](https://axios-http.com/)**: Cliente HTTP para comunicação com o backend.
- **[pinia](https://pinia.vuejs.org/)**: Gerenciamento de estado.
- **[vue](https://vuejs.org/)**: Framework principal do frontend.
- **[vue-router](https://router.vuejs.org/)**: Gerenciamento de rotas no frontend.
- **[vuetify](https://vuetifyjs.com/)**: Framework de design responsivo.
- **[cypress](https://www.cypress.io/)**: Ferramenta para testes E2E.

### **Backend**
- **[@prisma/client](https://www.prisma.io/)**: ORM para manipulação do banco de dados.
- **[cors](https://github.com/expressjs/cors)**: Permitir requisições cross-origin.
- **[express](https://expressjs.com/)**: Framework web para o backend.
- **[swagger-jsdoc](https://github.com/Surnet/swagger-jsdoc)** e **[swagger-ui-express](https://github.com/scottie1984/swagger-ui-express)**: Documentação da API.
- **[zod](https://github.com/colinhacks/zod)**: Validação e tipagem de dados.

---

## O que Você Melhoraria se Tivesse Mais Tempo

1. **Frontend**:
- Implementação de **testes de unidade mais abrangentes** para cobrir todos os cenários.
- Criação de temas personalizados no Vuetify para melhorar a identidade visual.
- Melhorias no desempenho do carregamento inicial.

2. **Backend**:
- Adição de um sistema de **autenticação** para gerenciar acessos de forma segura.
- Criação de **seeds** para configurar um administrador padrão no sistema.
- Implementação de um controle de **histórico de mudanças** para registrar alterações realizadas nos dados do usuário.
- Configuração de **cache** (ex.: Redis) para otimizar requisições frequentes.
- Melhoria das mensagens de erro e log para maior clareza durante o desenvolvimento e produção.

3. **Testes**:
- Ampliação dos testes E2E com cenários de borda.
- Integração com ferramentas de análise de cobertura de testes.


---

## Quais Requisitos Não Foram Entregues

1. **Autenticação**: Não foi implementado um sistema de autenticação para gerenciar acessos.
9 changes: 9 additions & 0 deletions api/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}]
charset = utf-8
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

end_of_line = lf
max_line_length = 100
3 changes: 3 additions & 0 deletions api/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
PORT=3000
DATABASE_URL="postgresql://user:password@localhost:5432/database_name"
SERVER_URL=http://localhost:3000
3 changes: 3 additions & 0 deletions api/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules
.env
dist
121 changes: 121 additions & 0 deletions api/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
### API Desafio de Desenvolvedor Full Stack

#### Descrição
Este projeto é uma API para um desafio de desenvolvedor full-stack. Ele utiliza **Node.js**, **TypeScript**, **Prisma ORM**, **Express.js** e outras bibliotecas para fornecer uma base robusta e escalável para a aplicação. Além disso, a API conta com uma documentação interativa utilizando o **Swagger**.

---

### Pré-requisitos
Antes de começar, certifique-se de ter o seguinte instalado:
- **Node.js** (versão 18 ou superior)
- **npm** ou **yarn**
- **PostgreSQL** (instância local ou um serviço de nuvem como o PostgreSQL do Heroku)

---

### Configuração do Ambiente

#### 1. Clone o Repositório
```bash
git clone https://github.com/soaresrodrigo/challenge-full-stack-web-developer.git
cd challenge-full-stack-web-developer/api
```

#### 2. Instale as Dependências
Use `npm` ou `yarn` para instalar as dependências do projeto:
```bash
npm ci
# ou
yarn install
```

#### 3. Configure as Variáveis de Ambiente
Copie o arquivo `.env.example` para um novo arquivo `.env`:
```bash
cp .env.example .env
```
Edite o arquivo `.env` para incluir a URL do seu **banco de dados PostgreSQL** e outras configurações necessárias:
```
DATABASE_URL="postgresql://usuario:senha@localhost:5432/nome_do_banco"
PORT=3000
```

---

### Configuração do Banco de Dados

#### 4. Execute as Migrations do Banco de Dados
Use o Prisma para criar o esquema necessário no banco de dados:
```bash
npm run migrate
# ou
yarn migrate
```

#### 5. Popular o Banco de Dados
Popule o banco de dados com dados iniciais:
```bash
npm run seed
# ou
yarn seed
```

---

### Executando o Projeto

#### Modo de Desenvolvimento
Para iniciar o servidor no modo de desenvolvimento (com recarregamento automático ao fazer alterações), use:
```bash
npm run dev
# ou
yarn dev
```

#### Modo de Produção
1. Compile o projeto:
```bash
npm run build
# ou
yarn build
```
2. Inicie o servidor:
```bash
npm start
# ou
yarn start
```

O servidor estará disponível em `http://localhost:3000` (porta padrão).

---

### Documentação da API (Swagger)
A API inclui uma documentação interativa gerada pelo **Swagger**. Para acessá-la, inicie o servidor e abra o seguinte link no seu navegador:
```
http://localhost:3000/api-docs
```

Na documentação, você encontrará todas as rotas disponíveis, os métodos suportados, os parâmetros esperados, e exemplos de requisições e respostas.

---

### Testes
Execute os testes com:
```bash
npm test
# ou
yarn test
```

---

### Tecnologias Utilizadas
- **Node.js**
- **TypeScript**
- **Express.js**
- **Prisma ORM**
- **Swagger**
- **Jest**
- **Zod**
- **PostgreSQL**
15 changes: 15 additions & 0 deletions api/database/factories/user.factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { PrismaClient, User } from '@prisma/client';
import { faker } from '@faker-js/faker';
import { v4 as uuidv4 } from 'uuid'

const prisma = new PrismaClient();

export const createUser = async (): Promise<User> => {
return prisma.user.create({
data: {
uuid: uuidv4(),
email: faker.internet.email(),
name: faker.person.fullName(),
},
});
};
22 changes: 22 additions & 0 deletions api/database/seeders/database.seeder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { PrismaClient } from '@prisma/client';
import { createUser } from '../factories/user.factory';

const prisma = new PrismaClient();

const main = async () => {
console.log('Seeding database...');

for (let i = 0; i < 10; i++) {
await createUser();
}

console.log('Seeding finished.');
};

main()
.catch((e) => {
console.error(e);
})
.finally(async () => {
await prisma.$disconnect();
});
6 changes: 6 additions & 0 deletions api/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testMatch: ['**/*.test.ts'],
moduleFileExtensions: ['ts', 'js', 'json'],
};
Loading