Alterando lógica das rotas de vans e MER da tabela Vans

This commit is contained in:
Matheus Albino Brunhara
2022-06-20 00:52:31 -05:00
parent 7edb3b5814
commit ac44716428
15 changed files with 171 additions and 435 deletions

View File

@@ -6,16 +6,10 @@ export class CreateVansTable1655691282002 implements MigrationInterface {
new Table({ new Table({
name: 'vans', name: 'vans',
columns: [ columns: [
{
name: 'id_van',
type: 'uuid',
isPrimary: true,
generationStrategy: 'uuid',
default: 'uuid_generate_v4()',
},
{ {
name: 'plate', name: 'plate',
type: 'varchar', type: 'varchar',
isPrimary: true,
}, },
{ {
name: 'brand', name: 'brand',
@@ -30,7 +24,32 @@ export class CreateVansTable1655691282002 implements MigrationInterface {
type: 'numeric', type: 'numeric',
}, },
{ {
name: 'document', name: 'document_status',
type: 'boolean',
isNullable: true
},
{
name: 'locator_name',
type: 'varchar',
isNullable: true
},
{
name: 'locator_address',
type: 'varchar',
isNullable: true
},
{
name: 'locator_complement',
type: 'varchar',
isNullable: true
},
{
name: 'locator_city',
type: 'varchar',
isNullable: true
},
{
name: 'locator_state',
type: 'varchar', type: 'varchar',
isNullable: true isNullable: true
}, },

View File

@@ -1,54 +0,0 @@
import { MigrationInterface, QueryRunner, Table } from 'typeorm';
export class CreateVanLocatorTable1655692363126 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: 'vanLocator',
columns: [
{
name: 'id_vanLocator',
type: 'uuid',
isPrimary: true,
generationStrategy: 'uuid',
default: 'uuid_generate_v4()',
},
{
name: 'name',
type: 'varchar',
},
{
name: 'address',
type: 'varchar',
},
{
name: 'complement',
type: 'varchar',
},
{
name: 'city',
type: 'varchar',
},
{
name: 'state',
type: 'varchar',
},
{
name: 'created_at',
type: 'timestamp',
default: 'now()',
},
{
name: 'updated_at',
type: 'timestamp',
default: 'now()',
},
],
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('vanLocator');
}
}

View File

@@ -1,42 +0,0 @@
import { MigrationInterface, QueryRunner, Table } from 'typeorm';
export class CreateVanDocumentsTable1655692498005
implements MigrationInterface
{
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: 'vanDocuments',
columns: [
{
name: 'document_van',
type: 'varchar',
isPrimary: true,
},
{
name: 'vanLocator_id',
type: 'uuid',
},
{
name: 'document_status',
type: 'varchar',
},
{
name: 'created_at',
type: 'timestamp',
default: 'now()',
},
{
name: 'updated_at',
type: 'timestamp',
default: 'now()',
},
],
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('vanDocuments');
}
}

View File

@@ -1,26 +0,0 @@
import { MigrationInterface, QueryRunner, TableForeignKey } from 'typeorm';
export class AddFKVanLocatorIdToVanDocumentsTable1655692624024
implements MigrationInterface
{
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createForeignKey(
'vanDocuments',
new TableForeignKey({
name: 'VanLocatorVanDocuments', // nome da FK, serve para referenciar numa exclusão pelo QueryRunner se necessário
columnNames: ['vanLocator_id'], // coluna que vai virar FK
referencedColumnNames: ['id_vanLocator'], // coluna PK da primeira tabela
referencedTableName: 'vanLocator', // nome da tabela que possui a PK
onDelete: 'SET NULL',
onUpdate: 'CASCADE',
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropForeignKey(
'vanDocuments',
'VanLocatorVanDocuments',
);
}
}

View File

@@ -1,23 +0,0 @@
import { MigrationInterface, QueryRunner, TableForeignKey } from 'typeorm';
export class AddFKVanDocumentToVanDocumentsTable1655696991836
implements MigrationInterface
{
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createForeignKey(
'vanDocuments',
new TableForeignKey({
name: 'VanDocumentVanDocuments', // nome da FK, serve para referenciar numa exclusão pelo QueryRunner se necessário
columnNames: ['document_van'], // coluna que vai virar FK
referencedColumnNames: ['document'], // coluna PK da primeira tabela
referencedTableName: 'vanDocuments', // nome da tabela que possui a PK
onDelete: 'SET NULL',
onUpdate: 'CASCADE',
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropForeignKey('vanDocuments', 'VanDocumentVanDocuments');
}
}

View File

@@ -6,16 +6,12 @@ import {
UpdateDateColumn, UpdateDateColumn,
JoinColumn, JoinColumn,
OneToOne, OneToOne,
PrimaryColumn,
} from 'typeorm'; } from 'typeorm';
import VanDocuments from './VanDocuments';
import VanLocator from './VanLocator';
@Entity('vans') @Entity('vans')
class Van { class Van {
@PrimaryGeneratedColumn('uuid') @PrimaryColumn()
id_van: string;
@Column()
plate: string; plate: string;
@Column() @Column()
@@ -25,11 +21,25 @@ class Van {
model: string; model: string;
@Column() @Column()
seats_number: number; seats_number: string;
@OneToOne(() => VanLocator, { eager: true }) @Column()
@JoinColumn({ name: 'document' }) document_status: boolean
locator: VanLocator;
@Column()
locator_name: string;
@Column()
locator_address: string;
@Column()
locator_complement: string;
@Column()
locator_city: string;
@Column()
locator_state: string;
@CreateDateColumn() @CreateDateColumn()
created_at: Date; created_at: Date;

View File

@@ -1,33 +0,0 @@
import {
Entity,
Column,
CreateDateColumn,
UpdateDateColumn,
JoinColumn,
OneToOne,
PrimaryColumn,
} from 'typeorm';
import VanLocator from './VanLocator';
@Entity('vanDocuments')
class VanDocuments {
@PrimaryColumn()
@OneToOne(() => VanDocuments, { eager: true })
@JoinColumn({ name: 'document' })
vanDocuments: string;
@OneToOne(() => VanLocator, { eager: true })
@JoinColumn({ name: 'vanLocator_id' })
vanLocator: VanLocator;
@Column()
document_status: string;
@CreateDateColumn()
created_at: Date;
@UpdateDateColumn()
updated_at: Date;
}
export default VanDocuments;

View File

@@ -1,36 +0,0 @@
import {
Entity,
Column,
PrimaryGeneratedColumn,
CreateDateColumn,
UpdateDateColumn,
} from 'typeorm';
@Entity('vanLocator')
class VanLocator {
@PrimaryGeneratedColumn('uuid')
id_vanLocator: string;
@Column()
name: string;
@Column()
address: string;
@Column()
complement: string;
@Column()
city: string;
@Column()
state: string;
@CreateDateColumn()
created_at: Date;
@UpdateDateColumn()
updated_at: Date;
}
export default VanLocator;

View File

@@ -5,6 +5,7 @@ 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'; import carsRouter from './cars.routes';
import vansRouter from './vans.routes';
const routes = Router(); const routes = Router();
@@ -13,5 +14,6 @@ routes.use('/sessions', sessionsRouter);
routes.use('/search', searchRoutes); routes.use('/search', searchRoutes);
routes.use('/transportes', transportesRouter); routes.use('/transportes', transportesRouter);
routes.use('/cars', carsRouter); routes.use('/cars', carsRouter);
routes.use('/vans', vansRouter);
export default routes; export default routes;

View File

@@ -7,10 +7,7 @@ import ensureAuthenticated from '../middlewares/ensureAuthenticated';
import FindVanService from '../services/FindVanService'; import FindVanService from '../services/FindVanService';
import CreateVanService from '../services/CreateVanService'; import CreateVanService from '../services/CreateVanService';
import UpdateVanService from '../services/UpdateVanService'; import UpdateVanService from '../services/UpdateVanService';
import VanLocator from '../models/VanLocator'; import UpdateVanPlateService from '../services/UpdateVanPlateService';
import FindVanLocatorService from '../services/FindVanLocatorService';
import CreateVanLocatorService from '../services/CreateVanLocatorService';
import UpdateVanLocatorService from '../services/UpdateVanLocatorService';
const vansRouter = Router(); const vansRouter = Router();
@@ -22,18 +19,28 @@ vansRouter.get('/list', async (request, response) => {
return response.json({ data: vans }); return response.json({ data: vans });
}); });
vansRouter.get('/:id', ensureAuthenticated, async (request, response) => { vansRouter.get('/:plate', ensureAuthenticated, async (request, response) => {
const { id } = request.params; const { plate } = request.params;
const findVanService = new FindVanService(); const findVanService = new FindVanService();
const van = await findVanService.execute(id); const van = await findVanService.execute(plate);
return response.json({ data: van }); return response.json({ data: van });
}); });
vansRouter.post('/', async (request, response) => { vansRouter.post('/', async (request, response) => {
const { plate, brand, model, seats_number } = request.body; const {
plate,
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
} = request.body;
const createVanService = new CreateVanService(); const createVanService = new CreateVanService();
@@ -42,6 +49,11 @@ vansRouter.post('/', async (request, response) => {
brand, brand,
model, model,
seats_number, seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
}); });
return response.json({ message: 'Van criada com sucesso.', data: van }); return response.json({ message: 'Van criada com sucesso.', data: van });
@@ -51,17 +63,31 @@ vansRouter.patch(
'/edit/:plate', '/edit/:plate',
ensureAuthenticated, ensureAuthenticated,
async (request, response) => { async (request, response) => {
const { brand, model, seats_number } = request.body; const {
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
} = request.body;
const { plate } = request.params; const { plate } = request.params;
const updateUserService = new UpdateVanService(); const updateVanService = new UpdateVanService();
await updateUserService.execute({ await updateVanService.execute({
plate, plate,
brand, brand,
model, model,
seats_number, seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
}); });
return response.json({ return response.json({
@@ -70,72 +96,23 @@ vansRouter.patch(
}, },
); );
// locadores de van
vansRouter.get('/locator/list', async (request, response) => {
const vanLocatorsRepository = getRepository(VanLocator);
const vansLocators = await vanLocatorsRepository.find();
return response.json({ data: vansLocators });
});
vansRouter.get(
'/locator/:id',
ensureAuthenticated,
async (request, response) => {
const { id } = request.params;
const findVanLocatorService = new FindVanLocatorService();
const vanLocator = await findVanLocatorService.execute(id);
return response.json({ data: vanLocator });
},
);
vansRouter.post('/locator/:id_van', async (request, response) => {
const { name, address, complement, city, state } = request.body;
const { id_van } = request.params;
const createVanLocatorService = new CreateVanLocatorService();
const vanLocator = await createVanLocatorService.execute({
id_van,
name,
address,
complement,
city,
state,
});
return response.json({
message: 'Locador da van configurado com sucesso.',
data: vanLocator,
});
});
vansRouter.patch( vansRouter.patch(
'/locator/edit/:id_van', '/edit/plate/:plate',
ensureAuthenticated, ensureAuthenticated,
async (request, response) => { async (request, response) => {
const { name, address, complement, city, state } = request.body; const { newPlate } = request.body;
const { id_van } = request.params; const { plate } = request.params;
const updateVanLocatorService = new UpdateVanLocatorService(); const updateVanPlateService = new UpdateVanPlateService();
await updateVanLocatorService.execute({ await updateVanPlateService.execute({
id_van, oldPlate: plate,
name, newPlate,
address,
complement,
city,
state,
}); });
return response.json({ return response.json({
message: 'Informações da van atualizadas com sucesso.', message: 'Placa da van atualizada com sucesso.',
}); });
}, },
); );

View File

@@ -1,64 +0,0 @@
import { getRepository } from 'typeorm';
import { v4 } from 'uuid';
import { hash } from 'bcryptjs';
import AppError from '../errors/AppError';
import Van from '../models/Van';
import VanLocator from '../models/VanLocator';
interface Request {
id_van: string;
name: string;
address: string;
complement: string;
city: string;
state: string;
}
class CreateVanLocatorService {
public async execute({
id_van,
name,
address,
complement,
city,
state,
}: Request): Promise<VanLocator> {
const vansRepository = getRepository(Van);
const vansLocatorsRepository = getRepository(VanLocator);
const van = await vansRepository.findOne({
where: { id_van },
});
if (!van) {
throw new AppError('A van informada não existe.', 404);
}
if (van.locator) {
throw new AppError(
'A van informada já possui um locador cadastrado.',
400,
);
}
const vanLocator = vansLocatorsRepository.create({
name,
address,
complement,
city,
state,
});
await vansLocatorsRepository.save(vanLocator);
// linka o locador para o registro da van
van.locator = vanLocator
await vansRepository.save(van);
return vanLocator;
}
}
export default CreateVanLocatorService;

View File

@@ -1,6 +1,4 @@
import { getRepository } from 'typeorm'; import { getRepository } from 'typeorm';
import { v4 } from 'uuid';
import { hash } from 'bcryptjs';
import AppError from '../errors/AppError'; import AppError from '../errors/AppError';
@@ -11,6 +9,11 @@ interface Request {
brand: string; brand: string;
model: string; model: string;
seats_number: string; seats_number: string;
locator_name: string;
locator_address: string;
locator_complement: string;
locator_city: string;
locator_state: string;
} }
class CreateVanService { class CreateVanService {
@@ -19,23 +22,36 @@ class CreateVanService {
brand, brand,
model, model,
seats_number, seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
}: Request): Promise<Van> { }: Request): Promise<Van> {
const vansRepository = getRepository(Van); const vansRepository = getRepository(Van);
const checkVanPlateExists = await vansRepository.findOne({ const vanExists = await vansRepository.findOne({
where: { plate }, where: { plate },
}); });
if (checkVanPlateExists) { if (vanExists) {
throw new AppError('Placa do veículo já cadastrado!', 409); throw new AppError(
'Uma van com a placa informada já foi cadastrada.',
409,
);
} }
const van = vansRepository.create({ const van = vansRepository.create({
id_van: v4(),
plate, plate,
brand, brand,
model, model,
seats_number: (Number)(seats_number), seats_number,
document_status: false,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
}); });
await vansRepository.save(van); await vansRepository.save(van);

View File

@@ -1,56 +0,0 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import Van from '../models/Van';
import VanLocator from '../models/VanLocator';
interface Request {
id_van: string;
name: string;
address: string;
complement: string;
city: string;
state: string;
}
class UpdateVanLocatorService {
public async execute({
id_van,
name,
address,
complement,
city,
state,
}: Request): Promise<VanLocator> {
const vansRepository = getRepository(Van);
const vansLocatorsRepository = getRepository(VanLocator);
const van = await vansRepository.findOne({
where: { id_van },
});
if (!van) {
throw new AppError('A van informada não existe.', 404);
}
if (!van.locator) {
throw new AppError(
'A van informada não possui um locador cadastrado.',
404,
);
}
if (name) van.locator.name = name
if (address) van.locator.address = address
if (complement) van.locator.complement = complement
if (city) van.locator.city = city
if (state) van.locator.state = state
await vansRepository.save(van);
return van.locator;
}
}
export default UpdateVanLocatorService;

View File

@@ -0,0 +1,32 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import Van from '../models/Van';
interface Request {
oldPlate: string;
newPlate: string;
}
class UpdateVanPlateService {
public async execute({ oldPlate, newPlate }: Request): Promise<Van> {
const vansRepository = getRepository(Van);
const van = await vansRepository.findOne({
where: { plate: oldPlate },
});
if (!van) {
throw new AppError('A van informada não existe.');
}
van.plate = newPlate
await vansRepository.save(van);
return van;
}
}
export default UpdateVanPlateService;

View File

@@ -6,9 +6,14 @@ import Van from '../models/Van';
interface Request { interface Request {
plate: string; plate: string;
brand: string; brand?: string;
model: string; model?: string;
seats_number: string; seats_number?: string;
locator_name?: string;
locator_address?: string;
locator_complement?: string;
locator_city?: string;
locator_state?: string;
} }
class UpdateVanService { class UpdateVanService {
@@ -17,6 +22,11 @@ class UpdateVanService {
brand, brand,
model, model,
seats_number, seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
}: Request): Promise<Van> { }: Request): Promise<Van> {
const vansRepository = getRepository(Van); const vansRepository = getRepository(Van);
@@ -25,13 +35,17 @@ class UpdateVanService {
}); });
if (!van) { if (!van) {
throw new AppError('Van informada não existe.'); throw new AppError('A van informada não existe.');
} }
if (plate) van.plate = plate; if (brand) van.brand = brand
if (brand) van.brand = brand; if (model) van.model = model
if (model) van.model = model; if (seats_number) van.seats_number = seats_number
if (seats_number) van.seats_number = (Number)(seats_number); if (locator_name) van.locator_name = locator_name
if (locator_address) van.locator_address = locator_address
if (locator_complement) van.locator_complement = locator_complement
if (locator_city) van.locator_city = locator_city
if (locator_state) van.locator_state = locator_state
await vansRepository.save(van); await vansRepository.save(van);