Merge branch 'master' into feature/buscar-transporte
This commit is contained in:
142
src/constants/carModels.ts
Normal file
142
src/constants/carModels.ts
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
const carModels = [
|
||||||
|
{
|
||||||
|
name: 'Aston Martin',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Audi',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Bentley',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'BMW',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'BMW Motorrad',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'BYD',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Caoa Chery',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Chevrolet',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Chrysler',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Citroën',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Dodge',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Ferrari',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Fiat',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Ford',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Honda',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Husqvarna',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Hyundai',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'JAC',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Jaguar',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Jeep',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Kia',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Lamborghini',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Land Rover',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Lexus',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Lifan',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Maserati',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'McLaren',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Mercedes-Benz',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Mini',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Mitsubishi',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Nissan',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Peugeot',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Porsche',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Ram',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Renault',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Rolls Royce',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Royal Enfield',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Smart',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Subaru',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Suzuki',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Toyota',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Triumph',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Troller',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Volkswagen',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Volvo',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Yamaha',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default carModels;
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import {MigrationInterface, QueryRunner, TableColumn} from "typeorm";
|
||||||
|
|
||||||
|
export class AlterUsersTableAddLastnameColumn1653437653433 implements MigrationInterface {
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.addColumn('users', new TableColumn({
|
||||||
|
name: 'lastname',
|
||||||
|
type: 'varchar',
|
||||||
|
isNullable: true
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.dropColumn('users', 'lastname')
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import { MigrationInterface, QueryRunner, Table } from 'typeorm';
|
||||||
|
|
||||||
|
export class CreateCarModelsTable1653768789073 implements MigrationInterface {
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.createTable(
|
||||||
|
new Table({
|
||||||
|
name: 'carModels',
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
name: 'id_model',
|
||||||
|
type: 'uuid',
|
||||||
|
isPrimary: true,
|
||||||
|
generationStrategy: 'uuid',
|
||||||
|
default: 'uuid_generate_v4()',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'name',
|
||||||
|
type: 'varchar',
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.dropTable('carModels');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import { getConnection, MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
|
||||||
|
import carModels from '../../constants/carModels'
|
||||||
|
import CarModels from "../../models/CarModels";
|
||||||
|
|
||||||
|
export class InsertDataIntoCarModelsTable1653769103891 implements MigrationInterface {
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
carModels.forEach(async (car) => {
|
||||||
|
const GBP = await queryRunner.manager.save(queryRunner.manager.create<CarModels>(CarModels, { name: car.name }))
|
||||||
|
}
|
||||||
|
)}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await getConnection()
|
||||||
|
.createQueryBuilder()
|
||||||
|
.delete()
|
||||||
|
.from(CarModels)
|
||||||
|
.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
12
src/models/CarModels.ts
Normal file
12
src/models/CarModels.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
|
||||||
|
|
||||||
|
@Entity('carModels')
|
||||||
|
class CarModels {
|
||||||
|
@PrimaryGeneratedColumn('uuid')
|
||||||
|
id_model: string;
|
||||||
|
|
||||||
|
@Column()
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CarModels;
|
||||||
@@ -14,6 +14,9 @@ class User {
|
|||||||
@Column()
|
@Column()
|
||||||
name: string;
|
name: string;
|
||||||
|
|
||||||
|
@Column()
|
||||||
|
lastname: string;
|
||||||
|
|
||||||
@Column()
|
@Column()
|
||||||
email: string;
|
email: string;
|
||||||
|
|
||||||
|
|||||||
17
src/routes/cars.routes.ts
Normal file
17
src/routes/cars.routes.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { Router } from 'express';
|
||||||
|
|
||||||
|
import ensureAuthenticated from '../middlewares/ensureAuthenticated';
|
||||||
|
|
||||||
|
import GetCarModelsService from '../services/GetCarModelsService';
|
||||||
|
|
||||||
|
const carsRouter = Router();
|
||||||
|
|
||||||
|
carsRouter.get('/list', ensureAuthenticated, async (request, response) => {
|
||||||
|
const getCarModelsService = new GetCarModelsService();
|
||||||
|
|
||||||
|
const carModels = await getCarModelsService.execute();
|
||||||
|
|
||||||
|
return response.json({ data: carModels });
|
||||||
|
});
|
||||||
|
|
||||||
|
export default carsRouter;
|
||||||
@@ -4,6 +4,7 @@ import searchRoutes from './search.routes';
|
|||||||
import sessionsRouter from './sessions.routes';
|
import sessionsRouter from './sessions.routes';
|
||||||
import transportesRouter from './transportes.routes';
|
import transportesRouter from './transportes.routes';
|
||||||
import usersRouter from './users.routes';
|
import usersRouter from './users.routes';
|
||||||
|
import carsRouter from './cars.routes';
|
||||||
|
|
||||||
const routes = Router();
|
const routes = Router();
|
||||||
|
|
||||||
@@ -11,5 +12,6 @@ routes.use('/users', usersRouter);
|
|||||||
routes.use('/sessions', sessionsRouter);
|
routes.use('/sessions', sessionsRouter);
|
||||||
routes.use('/search', searchRoutes);
|
routes.use('/search', searchRoutes);
|
||||||
routes.use('/transportes', transportesRouter);
|
routes.use('/transportes', transportesRouter);
|
||||||
|
routes.use('/cars', carsRouter);
|
||||||
|
|
||||||
export default routes;
|
export default routes;
|
||||||
|
|||||||
@@ -1,9 +1,19 @@
|
|||||||
import { Router } from 'express';
|
import { Router } from 'express';
|
||||||
|
import { sign, verify } from 'jsonwebtoken';
|
||||||
|
|
||||||
|
import authConfig from '../config/auth';
|
||||||
|
import AppError from '../errors/AppError';
|
||||||
|
|
||||||
import AuthenticateUserService from '../services/AuthenticateUserService';
|
import AuthenticateUserService from '../services/AuthenticateUserService';
|
||||||
|
|
||||||
const sessionsRouter = Router();
|
const sessionsRouter = Router();
|
||||||
|
|
||||||
|
interface TokenPayload {
|
||||||
|
iat: number;
|
||||||
|
exp: number;
|
||||||
|
sub: string;
|
||||||
|
}
|
||||||
|
|
||||||
// login pode ser: email ou username
|
// login pode ser: email ou username
|
||||||
sessionsRouter.post('/', async (request, response) => {
|
sessionsRouter.post('/', async (request, response) => {
|
||||||
const { login, password } = request.body;
|
const { login, password } = request.body;
|
||||||
@@ -15,7 +25,24 @@ sessionsRouter.post('/', async (request, response) => {
|
|||||||
password,
|
password,
|
||||||
});
|
});
|
||||||
|
|
||||||
return response.json({ message: 'User logged in sucessfully', token: token });
|
return response.json({ message: 'Usuário autenticado com sucesso!', token: token });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
sessionsRouter.post('/refresh', async(request, response) => {
|
||||||
|
const { token } = request.body;
|
||||||
|
|
||||||
|
let sub = null;
|
||||||
|
let decoded = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
decoded = verify(token, authConfig.jwt.secret);
|
||||||
|
} catch (error) {
|
||||||
|
throw new AppError('Token de autenticação inválido.', 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub = decoded as TokenPayload;
|
||||||
|
|
||||||
|
return response.json({ "status": "success", "userId": sub.sub });
|
||||||
|
})
|
||||||
|
|
||||||
export default sessionsRouter;
|
export default sessionsRouter;
|
||||||
|
|||||||
@@ -50,27 +50,38 @@ usersRouter.get('/:id', ensureAuthenticated, async (request, response) => {
|
|||||||
|
|
||||||
const user = await findUser.execute(id);
|
const user = await findUser.execute(id);
|
||||||
|
|
||||||
|
// converting ISO 8601 date to normal date
|
||||||
|
let birth_date = new Date(user.birth_date)
|
||||||
|
|
||||||
|
let year = birth_date.getFullYear()
|
||||||
|
let month = birth_date.getMonth()+1
|
||||||
|
let date = birth_date.getDate()
|
||||||
|
|
||||||
|
const finalDate = `${date}/${month}/${year}`
|
||||||
|
|
||||||
const userWithoutPassword = {
|
const userWithoutPassword = {
|
||||||
id_user: user.id_user,
|
id_user: user.id_user,
|
||||||
name: user.name,
|
name: user.name,
|
||||||
|
lastname: user.lastname,
|
||||||
email: user.email,
|
email: user.email,
|
||||||
birth_date: user.birth_date,
|
birth_date: finalDate,
|
||||||
avatar_image: user.avatar_image,
|
avatar_image: user.avatar_image,
|
||||||
bio: user.bio,
|
bio: user.bio,
|
||||||
created_at: user.created_at,
|
// created_at: user.created_at,
|
||||||
updated_at: user.updated_at,
|
// updated_at: user.updated_at,
|
||||||
};
|
};
|
||||||
|
|
||||||
return response.json({ data: userWithoutPassword });
|
return response.json({ data: userWithoutPassword });
|
||||||
});
|
});
|
||||||
|
|
||||||
usersRouter.post('/', async (request, response) => {
|
usersRouter.post('/', async (request, response) => {
|
||||||
const { name, email, birth_date, password } = request.body;
|
const { name, lastname, email, birth_date, password } = request.body;
|
||||||
|
|
||||||
const createUser = new CreateUserService();
|
const createUser = new CreateUserService();
|
||||||
|
|
||||||
const user = await createUser.execute({
|
const user = await createUser.execute({
|
||||||
name,
|
name,
|
||||||
|
lastname,
|
||||||
email,
|
email,
|
||||||
birth_date,
|
birth_date,
|
||||||
password,
|
password,
|
||||||
@@ -87,13 +98,14 @@ usersRouter.post('/', async (request, response) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
usersRouter.patch('/edit', ensureAuthenticated, async (request, response) => {
|
usersRouter.patch('/edit', ensureAuthenticated, async (request, response) => {
|
||||||
const { name, username, bio, email, birth_date } = request.body;
|
const { name, lastname, username, bio, email, birth_date } = request.body;
|
||||||
|
|
||||||
const updateUserService = new UpdateUserService();
|
const updateUserService = new UpdateUserService();
|
||||||
|
|
||||||
await updateUserService.execute({
|
await updateUserService.execute({
|
||||||
id_user: request.user.id_user,
|
id_user: request.user.id_user,
|
||||||
name,
|
name,
|
||||||
|
lastname,
|
||||||
username,
|
username,
|
||||||
bio,
|
bio,
|
||||||
email,
|
email,
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ app.use((err: Error, request: Request, response: Response, _: NextFunction) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
app.listen(3333, () => {
|
const port = 10002
|
||||||
console.log('🚀 Server started on port 3333!');
|
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`🚀 Server started on port ${port}!`);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ interface Response {
|
|||||||
id_user: string;
|
id_user: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const failedLoginMessage = { message: 'Combinação incorreta de login e senha.', statusCode: 200 }
|
||||||
|
|
||||||
class AuthenticateUserService {
|
class AuthenticateUserService {
|
||||||
public async execute({ login, password }: Request): Promise<Response> {
|
public async execute({ login, password }: Request): Promise<Response> {
|
||||||
const usersRepository = getRepository(User);
|
const usersRepository = getRepository(User);
|
||||||
@@ -28,7 +30,7 @@ class AuthenticateUserService {
|
|||||||
// TODO, ajeitar todos os HTTP status code
|
// TODO, ajeitar todos os HTTP status code
|
||||||
// Por que tem que deixar 200 para funcionar?
|
// Por que tem que deixar 200 para funcionar?
|
||||||
if (!user) {
|
if (!user) {
|
||||||
throw new AppError('Incorrect login/password combination.', 200);
|
throw new AppError(failedLoginMessage.message, failedLoginMessage.statusCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// user.password -> senha criptografada
|
// user.password -> senha criptografada
|
||||||
@@ -37,7 +39,7 @@ class AuthenticateUserService {
|
|||||||
const passwordMatched = await compare(password, user.password);
|
const passwordMatched = await compare(password, user.password);
|
||||||
|
|
||||||
if (!passwordMatched) {
|
if (!passwordMatched) {
|
||||||
throw new AppError('Incorrect login/password combination.', 200);
|
throw new AppError(failedLoginMessage.message, failedLoginMessage.statusCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// usuário autenticado
|
// usuário autenticado
|
||||||
|
|||||||
@@ -9,13 +9,14 @@ import Social from '../models/Social';
|
|||||||
|
|
||||||
interface Request {
|
interface Request {
|
||||||
name: string;
|
name: string;
|
||||||
|
lastname: string;
|
||||||
email: string;
|
email: string;
|
||||||
birth_date: string;
|
birth_date: string;
|
||||||
password: string;
|
password: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
class CreateUserService {
|
class CreateUserService {
|
||||||
public async execute({ name, email, birth_date, password }: Request): Promise<User> {
|
public async execute({ name, lastname, email, birth_date, password }: Request): Promise<User> {
|
||||||
const usersRepository = getRepository(User);
|
const usersRepository = getRepository(User);
|
||||||
const socialsRepository = getRepository(Social);
|
const socialsRepository = getRepository(Social);
|
||||||
|
|
||||||
@@ -33,8 +34,9 @@ class CreateUserService {
|
|||||||
// TODO, arrumar o formato das datas e padronizar com a equipe
|
// TODO, arrumar o formato das datas e padronizar com a equipe
|
||||||
|
|
||||||
const user = usersRepository.create({
|
const user = usersRepository.create({
|
||||||
id_user: v4(), name, email, birth_date, password: hashedPassword, avatar_image: "", bio: ""
|
id_user: v4(), name, lastname, email, birth_date, password: hashedPassword, avatar_image: "", bio: ""
|
||||||
});
|
});
|
||||||
|
|
||||||
await usersRepository.save(user);
|
await usersRepository.save(user);
|
||||||
|
|
||||||
// já criar registro na tabela Socials para evitar inconsistências
|
// já criar registro na tabela Socials para evitar inconsistências
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ class CreateUserService {
|
|||||||
public async execute(id: string): Promise<User> {
|
public async execute(id: string): Promise<User> {
|
||||||
const usersRepository = getRepository(User);
|
const usersRepository = getRepository(User);
|
||||||
|
|
||||||
const user = await usersRepository.findOne({
|
let user = await usersRepository.findOne({
|
||||||
where: { id_user: id },
|
where: { id_user: id },
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
throw new AppError('User does not exist.');
|
throw new AppError('Usuário não existe.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return user;
|
return user;
|
||||||
|
|||||||
22
src/services/GetCarModelsService.ts
Normal file
22
src/services/GetCarModelsService.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import { getRepository } from 'typeorm';
|
||||||
|
|
||||||
|
import AppError from '../errors/AppError';
|
||||||
|
|
||||||
|
import CarModels from '../models/CarModels';
|
||||||
|
|
||||||
|
class GetCarModelsService {
|
||||||
|
public async execute(): Promise<CarModels[]> {
|
||||||
|
const carModelsRepository = getRepository(CarModels);
|
||||||
|
|
||||||
|
const carModels = await carModelsRepository.find();
|
||||||
|
|
||||||
|
if (!carModels) {
|
||||||
|
// carModels, fazer no front um tratamento para isso
|
||||||
|
throw new AppError('Não há modelos de carro cadastrados.');
|
||||||
|
};
|
||||||
|
|
||||||
|
return carModels;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default GetCarModelsService;
|
||||||
@@ -8,6 +8,7 @@ import Social from '../models/Social';
|
|||||||
interface Request {
|
interface Request {
|
||||||
id_user: string;
|
id_user: string;
|
||||||
name: string;
|
name: string;
|
||||||
|
lastname: string;
|
||||||
username: string;
|
username: string;
|
||||||
bio: string;
|
bio: string;
|
||||||
email: string;
|
email: string;
|
||||||
@@ -15,7 +16,7 @@ interface Request {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class UpdateUserService {
|
class UpdateUserService {
|
||||||
public async execute({ id_user, name, username, bio, email, birth_date }: Request): Promise<User> {
|
public async execute({ id_user, name, lastname, username, bio, email, birth_date }: Request): Promise<User> {
|
||||||
const usersRepository = getRepository(User);
|
const usersRepository = getRepository(User);
|
||||||
const socialRepository = getRepository(Social);
|
const socialRepository = getRepository(Social);
|
||||||
|
|
||||||
@@ -27,9 +28,12 @@ class UpdateUserService {
|
|||||||
throw new AppError('User does not exist.');
|
throw new AppError('User does not exist.');
|
||||||
};
|
};
|
||||||
|
|
||||||
user.name = name;
|
user.name = name
|
||||||
user.bio = bio;
|
user.lastname = lastname
|
||||||
user.birth_date = new Date(birth_date); // TODO, funciona?
|
user.bio = bio
|
||||||
|
user.email = email
|
||||||
|
|
||||||
|
// user.birth_date = new Date(birth_date); // TODO, funciona?
|
||||||
|
|
||||||
await usersRepository.save(user);
|
await usersRepository.save(user);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user