Skip to content

Commit

Permalink
FEAT: Projeto de backend reescrito de JavaScript para Typescript (#61)
Browse files Browse the repository at this point in the history
* feat: instala alguns pacotes para o backend

* feat: ajusta alguns componentes

* feat: altera todos os arquivos do projeto backend para typescript

* feat: adiciona os changesets
  • Loading branch information
LeohsPaixao authored Nov 30, 2024
1 parent 9cda398 commit abe1ffc
Show file tree
Hide file tree
Showing 30 changed files with 588 additions and 168 deletions.
5 changes: 5 additions & 0 deletions .changeset/silly-forks-destroy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"qa-solar": patch
---

chore: instala pacotes para o projeto backend
5 changes: 5 additions & 0 deletions .changeset/tame-birds-flash.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"frontend": patch
---

feat: ajusta alguns componentes
23 changes: 23 additions & 0 deletions .changeset/witty-planets-doubt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
"backend": major
---

feat: migra o projeto de JavaScript para TypeScript

BREAKING CHANGE:

### O que mudou:
- Todo o código do backend foi reescrito de JavaScript para TypeScript.
- Foram adicionados tipos para garantir maior segurança e previsibilidade no código.
- Algumas estruturas e middlewares foram refatorados para aderir às melhores práticas do TypeScript.

### Por que a mudança foi feita:
- Para melhorar a qualidade do código e reduzir erros em tempo de execução.
- Para facilitar a manutenção do projeto e a escalabilidade futura.
- Para alinhar o projeto com padrões modernos de desenvolvimento.

### Como atualizar seu código:
1. Certifique-se de ter o TypeScript instalado no seu ambiente de desenvolvimento.
2. Atualize os comandos de execução do projeto para usar `ts-node` ou compile os arquivos com `tsc`.
3. Verifique suas integrações externas para ajustar chamadas e tipos, se necessário.
4. Revise os exemplos no `README.md` (se aplicável) para garantir compatibilidade com o novo código.
17 changes: 13 additions & 4 deletions backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@
"type": "module",
"private": false,
"scripts": {
"api": "ts-node src/server.js",
"format": "prettier --write src/",
"lint": "echo 'Ainda não tem um linter instalado no backend'",
"prisma:seed": "ts-node prisma/seeders/*.js"
"build": "rimraf disc && tsc",
"start": "node dist/server.js",
"dev": "yarn build && yarn start",
"format": "prettier --write src/*{.ts,.json}",
"lint": "echo 'Ainda não'"
},
"dependencies": {
"@faker-js/faker": "^9.2.0",
Expand All @@ -27,6 +28,14 @@
},
"devDependencies": {
"@tsconfig/node22": "^22.0.0",
"@types/bcryptjs": "^2.4.6",
"@types/cors": "^2.8.17",
"@types/express": "^5.0.0",
"@types/jsonwebtoken": "^9.0.7",
"@types/node": "^22.10.1",
"@typescript-eslint/eslint-plugin": "^8.16.0",
"@typescript-eslint/parser": "^8.16.0",
"rimraf": "^6.0.1",
"ts-node": "^10.9.2",
"typescript": "^5.7.2"
}
Expand Down
2 changes: 1 addition & 1 deletion backend/src/app.js → backend/src/app.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import bodyParser from 'body-parser';
import cors from 'cors';
import express from 'express';
import router from './routes/routes.js';
import router from './routes/routes.ts';

const app = express();

Expand Down
9 changes: 9 additions & 0 deletions backend/src/config/env.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import dotenv from 'dotenv';

dotenv.config();

if (!process.env.JWT_SECRET) {
throw new Error('JWT_SECRET não definido no arquivo .env');
}

export const JWT_SECRET = process.env.JWT_SECRET;
File renamed without changes.
28 changes: 0 additions & 28 deletions backend/src/controllers/deleteUser.js

This file was deleted.

30 changes: 30 additions & 0 deletions backend/src/controllers/deleteUser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { PrismaClient } from '@prisma/client';
import { Request, Response } from 'express';

const prisma = new PrismaClient();

export async function deleteUser(req: Request, res: Response): Promise<void> {
const { ids } = req.body;

if (ids.includes(req.userId)) {
res.status(400).json({ message: 'Você não pode excluir o usuário logado.' });
return
}

try {
const deletedUsers = await prisma.user.deleteMany({
where: {
id: { in: ids },
},
});

if (deletedUsers.count === 0) {
res.status(404).json({ message: 'Nenhum usuário encontrado para excluir.' });
return
}

res.status(200).json({ message: `${deletedUsers.count} usuário(s) excluído(s) com sucesso!` });
} catch (error) {
res.status(500).json({ message: 'Erro ao excluir o usuário.' });
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { PrismaClient } from '@prisma/client';
import { Request, Response } from 'express';
import { formatDateTime } from '../utils/formatDate.js';

const prisma = new PrismaClient();

export async function getAllUsers(req, res) {
export async function getAllUsers(req: Request, res: Response): Promise<void> {
try {
const users = await prisma.user.findMany({
select: {
Expand All @@ -18,7 +19,8 @@ export async function getAllUsers(req, res) {
});

if (users.length === 0) {
return res.status(404).json({ message: 'Nenhum usuário encontrado.' });
res.status(404).json({ message: 'Nenhum usuário encontrado.' });
return
}

const formattedUsers = users.map((user) => ({
Expand All @@ -28,6 +30,6 @@ export async function getAllUsers(req, res) {

res.status(200).json(formattedUsers);
} catch (error) {
return res.status(500).json({ message: 'Erro ao buscar usuários.' });
res.status(500).json({ message: 'Erro ao buscar usuários.' });
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { PrismaClient } from '@prisma/client';
import { Request, Response } from 'express';

const prisma = new PrismaClient();

export async function getEmailUser(req, res) {
export async function getEmailUser(req: Request, res: Response): Promise<void> {
const email = req.validatedEmail;

try {
Expand All @@ -11,12 +12,12 @@ export async function getEmailUser(req, res) {
});

if (!user) {
return res.status(404).json({ message: 'Este email não esta cadastrado no banco de dados.' });
res.status(404).json({ message: 'Este email não esta cadastrado no banco de dados.' });
return
}

res.status(200).json({ message: 'Um e-mail foi enviado com instruções para recuperar a senha.' });
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Erro interno no servidor.' });
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { PrismaClient } from '@prisma/client';
import { Request, Response } from 'express';

const prisma = new PrismaClient();

export async function getUser(req, res) {

export async function getUser(req: Request, res: Response): Promise<void> {
const email = req.validatedEmail;

try {
Expand All @@ -19,11 +21,12 @@ export async function getUser(req, res) {
});

if (!user) {
return res.status(404).json({ message: 'Este email não esta cadastrado no banco de dados.' });
res.status(404).json({ message: 'Este email não esta cadastrado no banco de dados.' });
return
}

res.status(200).json(user);
} catch (error) {
return res.status(500).json({ message: 'Erro ao buscar usuário.' });
res.status(500).json({ message: 'Erro ao buscar usuário.' });
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { PrismaClient } from '@prisma/client';
import bcrypt from 'bcryptjs';
import { Request, Response } from 'express';
import jwt from 'jsonwebtoken';
import { JWT_SECRET } from '../config/env.ts';

const prisma = new PrismaClient();

export async function loginUser(req, res) {
export async function loginUser(req: Request, res: Response): Promise<void> {
const { email, password } = req.body;

try {
Expand All @@ -13,23 +15,22 @@ export async function loginUser(req, res) {
});

if (!user) {
return res.status(400).json({ message: 'Não foi possivel realizar login com este usuário.' });
res.status(400).json({ message: 'Não foi possivel realizar login com este usuário.' });
return
}

const isPasswordValid = await bcrypt.compare(password, user.password);

if (!isPasswordValid) {
return res.status(400).json({ message: 'A senha não confere.' });
res.status(400).json({ message: 'A senha não confere.' });
return
}

const token = jwt.sign({ userId: user.id, email: user.email }, process.env.JWT_SECRET, {
const token = jwt.sign({ userId: user.id, email: user.email }, JWT_SECRET, {
expiresIn: '4h',
});

res.status(200).json({
message: 'Login realizado com sucesso!',
token,
});
res.status(200).json({ message: 'Login realizado com sucesso!', token });
} catch (error) {
res.status(500).json({ message: 'Erro ao tentar realizar o login.' });
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
export async function logoutUser(req, res) {
import { Request, Response } from 'express';

export async function logoutUser(req: Request, res: Response): Promise<void> {
try {
const userId = req.userId;

res.status(200).json({ message: `Logout realizado com sucesso do usuário com o ID: ${userId}` });
} catch (error) {
res.status(500).json({ message: `Erro ao processar o logout do usuário com o ID: ${userId}` });
res.status(500).json({ message: `Erro ao processar o logout do usuário` });
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { PrismaClient } from '@prisma/client';
import bcrypt from 'bcryptjs';
import { Request, Response } from 'express';

const prisma = new PrismaClient();

export const registerUser = async (req, res) => {
export const registerUser = async (req: Request, res: Response): Promise<void> => {
const { fullName, socialName, document, docType, phone, email, password } = req.body;

try {
Expand All @@ -22,13 +23,15 @@ export const registerUser = async (req, res) => {
});

res.status(201).json({ message: 'Usuário cadastrado com sucesso!' });
} catch (error) {
} catch (error: any) {
if (error.code === 'P2002') {
if (error.meta?.target?.includes('email')) {
return res.status(400).json({ message: 'E-mail já está em uso.' });
res.status(400).json({ message: 'E-mail já está em uso.' });
return
}
if (error.meta?.target?.includes('document')) {
return res.status(400).json({ message: 'CPF ou CNPJ já está em uso.' });
res.status(400).json({ message: 'CPF ou CNPJ já está em uso.' });
return
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { PrismaClient } from '@prisma/client';
import { Request, Response } from 'express';

const prisma = new PrismaClient();

export async function updateUser(req, res) {
export async function updateUser(req: Request, res: Response) {
const userId = req.userId;
const { fullName, socialName, phone } = req.body;

Expand Down
39 changes: 0 additions & 39 deletions backend/src/middleware/auth.js

This file was deleted.

Loading

0 comments on commit abe1ffc

Please sign in to comment.