Compare commits

..

17 Commits

Author SHA1 Message Date
CloudAlb
79cefe3c34 Merge pull request #4 from Hzin/VAN-45-create-view-search-itinerary
Van 45 create view search itinerary
2022-09-09 20:55:10 -03:00
Matheus Albino Brunhara
405c5f8300 Merge develop 2022-09-09 20:50:33 -03:00
Matheus Albino Brunhara
b14de624da Correções 2022-09-05 19:14:29 -03:00
Matheus Albino Brunhara
ce60ec6c0b Ajusta nomes de variáveis 2022-09-03 20:51:46 -03:00
Matheus Albino Brunhara
a2356782fb Ajustes rota get itineraries in radius 2022-09-03 20:45:25 -03:00
Matheus Albino Brunhara
3aa7b9bf96 Ajustes CRUDs das rotas de itineraries 2022-09-03 20:29:15 -03:00
Matheus Albino Brunhara
76f2d63fbc Inclui Models de Itinerary, Destination e NeighborhoodServed 2022-09-03 20:28:38 -03:00
Matheus Albino Brunhara
0ff59fcfea Refatora Van para Vehicle 2022-09-03 19:39:07 -03:00
Matheus Albino Brunhara
7ce2e602cc Otimiza migrations com gambiarra 2022-09-03 19:19:40 -03:00
Hugo Falcao
c1c8dc7a5e feat(migrations): Add column "is_active" in index of Itineraries table 2022-09-01 22:40:16 -03:00
Matheus Albino Brunhara
36e4464669 Cria branch VAN-45-create-view-search-itinerary 2022-08-29 20:10:02 -03:00
Matheus Albino Brunhara
64dc999ba4 Merge branch 'develop' of https://github.com/Hzin/tcc-vamos-backend 2022-08-29 19:59:51 -03:00
CloudAlb
7f95452fc9 Merge pull request #3 from Hzin/feature/VAN-6-van-models-table
Remove tabela CarBrands e inclui rotas para recuperar marcas e modelos
2022-08-29 02:08:42 -03:00
Matheus Albino Brunhara
22a1a3dbfa Remove tabela CarBrands e inclui rotas para recuperar marcas e modelos 2022-08-29 01:30:23 -03:00
CloudAlb
b4998b7c3e Merge pull request #2 from Hzin/bugfix/data-nascimento
Ajustes em data
2022-08-22 19:39:33 -03:00
Matheus Albino Brunhara
a4b3b02cf2 Ajustes em data 2022-08-22 19:40:05 -03:00
Matheus Albino Brunhara
d86a37613f Atualizando arquivo .gitignore 2022-08-11 19:52:37 -03:00
45 changed files with 2163 additions and 1678 deletions

162
.gitignore vendored
View File

@@ -1 +1,161 @@
node_modules # Created by https://www.toptal.com/developers/gitignore/api/yarn,node
# Edit at https://www.toptal.com/developers/gitignore?templates=yarn,node
### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
### Node Patch ###
# Serverless Webpack directories
.webpack/
# Optional stylelint cache
# SvelteKit build / generate output
.svelte-kit
### yarn ###
# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
.yarn/*
!.yarn/releases
!.yarn/patches
!.yarn/plugins
!.yarn/sdks
!.yarn/versions
# if you are NOT using Zero-installs, then:
# comment the following lines
!.yarn/cache
# and uncomment the following lines
# .pnp.*
# End of https://www.toptal.com/developers/gitignore/api/yarn,node

View File

@@ -0,0 +1,43 @@
import Destination from "../models/Destination";
import Itinerary from "../models/Itinerary";
import NeighborhoodServed from "../models/NeighborhoodServed";
const itineraryExample: Itinerary = {
id_itinerary: 1,
vehicle_plate: 'ABC1234',
price: 120.00,
days_of_week: '0111110',
specific_day: undefined,
estimated_departure_time: '17:40:00',
estimated_arrival_time: '19:00:00',
available_seats: 5,
itinerary_nickname: 'Van do Osva',
// created_at: new Date('2022-09-03T20:54:04'),
// updated_at: new Date('2022-09-03T20:54:05'),
};
const neighborhoodsServed: NeighborhoodServed[] = [
{
id_neighborhood: 1,
itinerary: itineraryExample,
name: 'Parque Jambeiro',
latitude: -22.962812284675504,
longitude: -47.0504998323243,
// created_at: new Date('2022-09-03T20:54:04'),
// updated_at: new Date('2022-09-03T20:54:05'),
}
];
const destinations: Destination[] = [
{
id_destination: 1,
itinerary: itineraryExample,
name: 'PUC Campinas 1',
latitude: -22.83427688865263,
longitude: -47.048043986779355,
// created_at: new Date('2022-09-03T20:54:04'),
// updated_at: new Date('2022-09-03T20:54:05'),
}
];
export default { itineraryExample, neighborhoodsServed, destinations };

View File

@@ -0,0 +1,3 @@
const maxRadius = 10
export default maxRadius

View File

@@ -17,12 +17,25 @@ export class CreateUsers1617210132141 implements MigrationInterface {
name: 'name', name: 'name',
type: 'varchar', type: 'varchar',
}, },
{
name: 'lastname',
type: 'varchar',
},
{ {
name: 'email', name: 'email',
type: 'varchar', type: 'varchar',
length: '255',
isUnique: true, isUnique: true,
}, },
// {
// name: 'cpf',
// type: 'varchar',
// isUnique: true,
// },
// {
// name: 'cnpj',
// type: 'varchar',
// isUnique: true,
// },
{ {
name: 'phone_number', name: 'phone_number',
type: 'varchar', type: 'varchar',
@@ -32,7 +45,7 @@ export class CreateUsers1617210132141 implements MigrationInterface {
}, },
{ {
name: 'birth_date', name: 'birth_date',
type: 'date', type: 'varchar',
}, },
{ {
name: 'password', name: 'password',
@@ -55,6 +68,16 @@ export class CreateUsers1617210132141 implements MigrationInterface {
scale: 2, scale: 2,
isNullable: true isNullable: true
}, },
{
name: 'document',
type: 'varchar',
isNullable: true
},
{
name: 'document_type',
type: 'varchar',
isNullable: true
},
{ {
name: 'created_at', name: 'created_at',
type: 'timestamp', type: 'timestamp',

View File

@@ -1,15 +0,0 @@
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')
}
}

View File

@@ -1,28 +0,0 @@
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');
}
}

View File

@@ -1,20 +0,0 @@
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();
}
}

View File

@@ -1,24 +0,0 @@
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';
export class AddCpfAndCnpjFieldToUsers1654814986232
implements MigrationInterface
{
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumns('users', [
new TableColumn({
name: 'cpf',
type: 'varchar',
isNullable: true,
}),
new TableColumn({
name: 'cnpj',
type: 'varchar',
isNullable: true,
}),
]);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumns('users', ['cnpj', 'cpf']);
}
}

View File

@@ -1,11 +1,15 @@
import { MigrationInterface, QueryRunner, Table } from 'typeorm'; import { MigrationInterface, QueryRunner, Table } from 'typeorm';
export class CreateVansTable1655691282002 implements MigrationInterface { export class CreateVehiclesTable1655691282002 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> { public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable( await queryRunner.createTable(
new Table({ new Table({
name: 'vans', name: 'vehicles',
columns: [ columns: [
{
name: 'user_id',
type: 'uuid',
},
{ {
name: 'plate', name: 'plate',
type: 'varchar', type: 'varchar',
@@ -69,6 +73,6 @@ export class CreateVansTable1655691282002 implements MigrationInterface {
} }
public async down(queryRunner: QueryRunner): Promise<void> { public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('vans'); await queryRunner.dropTable('vehicles');
} }
} }

View File

@@ -1,24 +0,0 @@
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';
export class RemoveCpfAndCnpjFieldsFromUsersTable1655711281662
implements MigrationInterface
{
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumns('users', ['cnpj', 'cpf']);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumns('users', [
new TableColumn({
name: 'cpf',
type: 'varchar',
isNullable: true,
}),
new TableColumn({
name: 'cnpj',
type: 'varchar',
isNullable: true,
}),
]);
}
}

View File

@@ -1,24 +0,0 @@
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';
export class AddDocumentAndDocumentTypeFieldsToUsersTable1655711315251
implements MigrationInterface
{
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumns('users', [
new TableColumn({
name: 'document',
type: 'varchar',
isNullable: true,
}),
new TableColumn({
name: 'document_type',
type: 'varchar',
isNullable: true,
}),
]);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumns('users', ['document_type', 'document']);
}
}

View File

@@ -1,20 +0,0 @@
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';
export class AddUserIdFieldToVansTable1655720865095
implements MigrationInterface
{
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.addColumn(
'vans',
new TableColumn({
name: 'user_id',
type: 'uuid',
isNullable: true,
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropColumn('vans', 'user_id');
}
}

View File

@@ -1,11 +1,11 @@
import { MigrationInterface, QueryRunner, TableForeignKey } from 'typeorm'; import { MigrationInterface, QueryRunner, TableForeignKey } from 'typeorm';
export class AddFKUserIdToVansTable1655720873936 implements MigrationInterface { export class AddFKUserIdToVehiclesTable1655720873936 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> { public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createForeignKey( await queryRunner.createForeignKey(
'vans', 'vehicles',
new TableForeignKey({ new TableForeignKey({
name: 'UserIdVan', // nome da FK, serve para referenciar numa exclusão pelo QueryRunner se necessário name: 'UserIdVehicle', // nome da FK, serve para referenciar numa exclusão pelo QueryRunner se necessário
columnNames: ['user_id'], // coluna que vai virar FK columnNames: ['user_id'], // coluna que vai virar FK
referencedColumnNames: ['id_user'], // coluna PK da primeira tabela referencedColumnNames: ['id_user'], // coluna PK da primeira tabela
referencedTableName: 'users', // nome da tabela que possui a PK referencedTableName: 'users', // nome da tabela que possui a PK
@@ -17,8 +17,8 @@ export class AddFKUserIdToVansTable1655720873936 implements MigrationInterface {
public async down(queryRunner: QueryRunner): Promise<void> { public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropForeignKey( await queryRunner.dropForeignKey(
'vans', 'vehicles',
'UserIdVan', 'UserIdVehicle',
); );
} }
} }

View File

@@ -20,7 +20,7 @@ export class CreateItineraries1659404395471 implements MigrationInterface {
generationStrategy: 'increment', generationStrategy: 'increment',
}, },
{ {
name: 'van_plate', name: 'vehicle_plate',
type: 'varchar', type: 'varchar',
}, },
{ {
@@ -29,7 +29,7 @@ export class CreateItineraries1659404395471 implements MigrationInterface {
}, },
{ {
name: 'days_of_week', name: 'days_of_week',
type: 'bit', type: 'varchar',
isNullable: true, isNullable: true,
}, },
{ {
@@ -86,10 +86,10 @@ export class CreateItineraries1659404395471 implements MigrationInterface {
await queryRunner.createForeignKey( await queryRunner.createForeignKey(
'itineraries', 'itineraries',
new TableForeignKey({ new TableForeignKey({
name: 'itineraries_van_plate_fk', // nome da FK, serve para referenciar numa exclusão pelo QueryRunner se necessário name: 'itineraries_vehicle_plate_fk', // nome da FK, serve para referenciar numa exclusão pelo QueryRunner se necessário
columnNames: ['van_plate'], // coluna que vai virar FK columnNames: ['vehicle_plate'], // coluna que vai virar FK
referencedColumnNames: ['plate'], // coluna PK da primeira tabela referencedColumnNames: ['plate'], // coluna PK da primeira tabela
referencedTableName: 'vans', // nome da tabela que possui a PK referencedTableName: 'vehicles', // nome da tabela que possui a PK
onDelete: 'SET NULL', onDelete: 'SET NULL',
onUpdate: 'CASCADE', onUpdate: 'CASCADE',
}), }),
@@ -100,10 +100,11 @@ export class CreateItineraries1659404395471 implements MigrationInterface {
new TableIndex({ new TableIndex({
name: 'itineraries_idx', name: 'itineraries_idx',
columnNames: [ columnNames: [
'van_plate', 'vehicle_plate',
'days_of_week', 'days_of_week',
'specific_day', 'specific_day',
'estimated_departure_time', 'estimated_departure_time',
'is_active',
], ],
isUnique: true, isUnique: true,
}), }),
@@ -112,7 +113,7 @@ export class CreateItineraries1659404395471 implements MigrationInterface {
public async down(queryRunner: QueryRunner): Promise<void> { public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('itineraries'); await queryRunner.dropTable('itineraries');
await queryRunner.dropForeignKey('itineraries', 'itineraries_van_plate_fk'); await queryRunner.dropForeignKey('itineraries', 'itineraries_vehicle_plate_fk');
await queryRunner.dropIndex('itineraries', 'itineraries_idx'); await queryRunner.dropIndex('itineraries', 'itineraries_idx');
} }
} }

View File

@@ -0,0 +1,123 @@
import {
MigrationInterface,
QueryRunner,
Table,
TableForeignKey,
TableIndex,
} from 'typeorm';
export class CreateItineraries1659404395471 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: 'itineraries',
columns: [
{
name: 'id_itinerary',
type: 'integer',
isPrimary: true,
isGenerated: true,
generationStrategy: 'increment',
},
{
name: 'vehicle_plate',
type: 'varchar',
},
{
name: 'price',
type: 'float',
},
{
name: 'days_of_week',
type: 'varchar',
isNullable: true,
},
{
name: 'specific_day',
type: 'date',
isNullable: true,
},
{
name: 'estimated_departure_time',
type: 'time',
},
{
name: 'estimated_arrival_time',
type: 'time',
},
{
name: 'available_seats',
type: 'integer',
},
{
name: 'itinerary_nickname',
type: 'varchar',
},
{
name: 'is_active',
type: 'boolean',
},
{
name: 'estimated_departure_address',
type: 'varchar',
},
{
name: 'departure_latitude',
type: 'numeric',
},
{
name: 'departure_longitude',
type: 'numeric',
},
{
name: 'created_at',
type: 'timestamp',
default: 'now()',
},
{
name: 'updated_at',
type: 'timestamp',
default: 'now()',
},
],
}),
);
await queryRunner.createForeignKey(
'itineraries',
new TableForeignKey({
name: 'itineraries_vehicle_plate_fk', // nome da FK, serve para referenciar numa exclusão pelo QueryRunner se necessário
columnNames: ['vehicle_plate'], // coluna que vai virar FK
referencedColumnNames: ['plate'], // coluna PK da primeira tabela
referencedTableName: 'vehicles', // nome da tabela que possui a PK
onDelete: 'SET NULL',
onUpdate: 'CASCADE',
}),
);
await queryRunner.createIndex(
'itineraries',
new TableIndex({
name: 'itineraries_idx',
<<<<<<< HEAD
columnNames: ['vehicle_plate', 'days_of_week', 'specific_day', 'estimated_departure_time'],
=======
columnNames: [
'van_plate',
'days_of_week',
'specific_day',
'estimated_departure_time',
'is_active',
],
>>>>>>> c1c8dc7a5ec1043bff7ae027e0b959e0cc561254
isUnique: true,
}),
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('itineraries');
await queryRunner.dropForeignKey('itineraries', 'itineraries_vehicle_plate_fk');
await queryRunner.dropIndex('itineraries', 'itineraries_idx');
}
}

View File

@@ -49,7 +49,7 @@ export class CreateNeighborhoodsServed1660009211327
} }
public async down(queryRunner: QueryRunner): Promise<void> { public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable('neighborhoods_served');
await queryRunner.dropForeignKey('neighborhoods_served', 'neighborhoods_served_itinerary_id_fk'); await queryRunner.dropForeignKey('neighborhoods_served', 'neighborhoods_served_itinerary_id_fk');
await queryRunner.dropTable('neighborhoods_served');
} }
} }

12
src/models/CarBrands.ts Normal file
View File

@@ -0,0 +1,12 @@
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity('carBrands')
class CarBrands {
@PrimaryGeneratedColumn('uuid')
id_brand: string;
@Column()
name: string;
}
export default CarBrands;

37
src/models/Destination.ts Normal file
View File

@@ -0,0 +1,37 @@
import {
Entity,
Column,
PrimaryGeneratedColumn,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import Itinerary from './Itinerary';
@Entity('destinations')
class Destination {
@PrimaryGeneratedColumn('increment')
id_destination: number;
@ManyToOne(() => Itinerary, itinerary => itinerary.destinations)
@JoinColumn({ name: 'itinerary_id' })
itinerary: Itinerary;
@Column()
name: string;
@Column()
latitude: number;
@Column()
longitude: number;
// @CreateDateColumn()
// created_at: Date;
// @UpdateDateColumn()
// updated_at: Date;
}
export default Destination;

56
src/models/Itinerary.ts Normal file
View File

@@ -0,0 +1,56 @@
import {
Entity,
Column,
PrimaryGeneratedColumn,
CreateDateColumn,
UpdateDateColumn,
OneToMany,
JoinColumn,
} from 'typeorm';
import Destination from './Destination';
import NeighborhoodServed from './NeighborhoodServed';
import Vehicle from './Vehicle';
@Entity('itineraries')
class Itinerary {
@PrimaryGeneratedColumn('increment')
id_itinerary: number;
@Column()
vehicle_plate: string;
@Column()
price: number;
@Column()
days_of_week: string;
@Column()
specific_day?: Date;
@Column()
estimated_departure_time: string;
@Column()
estimated_arrival_time: string;
@Column()
available_seats: number;
@Column()
itinerary_nickname: string;
@OneToMany(() => NeighborhoodServed, neighborhoodServed => neighborhoodServed.itinerary, { eager: true, cascade: true, nullable: true })
neighborhoodsServed?: NeighborhoodServed[];
@OneToMany(() => Destination, destination => destination.itinerary, { eager: true, cascade: true, nullable: true })
destinations?: Destination[];
// @CreateDateColumn()
// created_at: Date;
// @UpdateDateColumn()
// updated_at: Date;
}
export default Itinerary;

View File

@@ -0,0 +1,37 @@
import {
Entity,
Column,
PrimaryGeneratedColumn,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import Itinerary from './Itinerary';
@Entity('neighborhoods_served')
class NeighborhoodServed {
@PrimaryGeneratedColumn('increment')
id_neighborhood: number;
@ManyToOne(() => Itinerary, itinerary => itinerary.neighborhoodsServed)
@JoinColumn({ name: 'itinerary_id' })
itinerary: Itinerary;
@Column()
name: string;
@Column()
latitude: number;
@Column()
longitude: number;
// @CreateDateColumn()
// created_at: Date;
// @UpdateDateColumn()
// updated_at: Date;
}
export default NeighborhoodServed;

View File

@@ -6,7 +6,7 @@ import {
UpdateDateColumn, UpdateDateColumn,
OneToMany, OneToMany,
} from 'typeorm'; } from 'typeorm';
import Van from './Van'; import Vehicle from './Vehicle';
@Entity('users') @Entity('users')
class User { class User {
@@ -21,12 +21,12 @@ class User {
@Column() @Column()
email: string; email: string;
@Column() @Column()
phone_number: string; phone_number: string;
@Column() @Column()
birth_date: Date; birth_date: string;
@Column() @Column()
password: string; password: string;
@@ -36,7 +36,7 @@ class User {
@Column() @Column()
bio: string; bio: string;
@Column() @Column()
star_rating: number; star_rating: number;
@@ -46,8 +46,8 @@ class User {
@Column() @Column()
document: string; document: string;
@OneToMany(() => Van, van => van.user) @OneToMany(() => Vehicle, vehicle => vehicle.user)
van: Van[]; vehicle: Vehicle[];
@CreateDateColumn() @CreateDateColumn()
created_at: Date; created_at: Date;

View File

@@ -12,8 +12,8 @@ import {
} from 'typeorm'; } from 'typeorm';
import User from './User'; import User from './User';
@Entity('vans') @Entity('vehicles')
class Van { class Vehicle {
@PrimaryColumn() @PrimaryColumn()
plate: string; plate: string;
@@ -31,20 +31,20 @@ class Van {
@Column() @Column()
locator_name: string; locator_name: string;
@Column() @Column()
locator_address: string; locator_address: string;
@Column() @Column()
locator_complement: string; locator_complement: string;
@Column() @Column()
locator_city: string; locator_city: string;
@Column() @Column()
locator_state: string; locator_state: string;
@ManyToOne(() => User, user => user.van) @ManyToOne(() => User, user => user.vehicle)
@JoinColumn({ name: 'user_id' }) @JoinColumn({ name: 'user_id' })
user: User; user: User;
@@ -55,4 +55,4 @@ class Van {
updated_at: Date; updated_at: Date;
} }
export default Van; export default Vehicle;

View File

@@ -1,4 +1,7 @@
import { Router } from 'express'; import { Router } from 'express';
import axios from 'axios'
import AppError from '../errors/AppError';
import ensureAuthenticated from '../middlewares/ensureAuthenticated'; import ensureAuthenticated from '../middlewares/ensureAuthenticated';
@@ -6,12 +9,63 @@ import GetCarModelsService from '../services/GetCarModelsService';
const carsRouter = Router(); const carsRouter = Router();
carsRouter.get('/list', ensureAuthenticated, async (request, response) => { type Brand = {
const getCarModelsService = new GetCarModelsService(); codigo: string;
nome: string;
};
const carModels = await getCarModelsService.execute(); type GetBrandsResponse = {
data: Brand[];
};
return response.json({ data: carModels }); type Model = {
modelos: {
codigo: string;
nome: string;
}
};
type GetModelsResponse = {
modelos: Model[];
};
carsRouter.get('/brands/list', async (request, response) => {
// const getCarModelsService = new GetCarModelsService();
// const carModels = await getCarModelsService.execute();
const { data, status } = await axios.get<GetBrandsResponse>(
'https://parallelum.com.br/fipe/api/v1/carros/marcas',
{
headers: {
Accept: 'application/json',
},
},
);
if (status !== 200) {
throw new AppError('Não foi possível recuperar a lista de marcas de veículos.', 200);
}
return response.json({ data: data });
});
carsRouter.get('/models/list/:id', async (request, response) => {
const { id } = request.params;
const { data, status } = await axios.get<GetModelsResponse>(
`https://parallelum.com.br/fipe/api/v1/carros/marcas/${id}/modelos`,
{
headers: {
Accept: 'application/json',
},
},
);
if (status !== 200) {
throw new AppError('Não foi possível recuperar a lista de modelos do veículo informado.', 200);
}
return response.json({ data: data.modelos });
}); });
export default carsRouter; export default carsRouter;

View File

@@ -2,18 +2,18 @@ import { Router } from 'express';
import searchRoutes from './search.routes'; import searchRoutes from './search.routes';
import sessionsRouter from './sessions.routes'; import sessionsRouter from './sessions.routes';
import transportsRouter from './transports.routes'; import itinerariesRouter from './itineraries.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'; import vehiclesRouter from './vehicles.routes';
const routes = Router(); const routes = Router();
routes.use('/users', usersRouter); routes.use('/users', usersRouter);
routes.use('/sessions', sessionsRouter); routes.use('/sessions', sessionsRouter);
routes.use('/search', searchRoutes); routes.use('/search', searchRoutes);
routes.use('/transports', transportsRouter); routes.use('/itineraries', itinerariesRouter);
routes.use('/cars', carsRouter); routes.use('/cars', carsRouter);
routes.use('/vans', vansRouter); routes.use('/vehicles', vehiclesRouter);
export default routes; export default routes;

View File

@@ -0,0 +1,118 @@
import { Router } from 'express';
import { getRepository } from 'typeorm';
import Itinerary from '../models/Itinerary';
import CalculateDistanceBetweenCoords from '../services/CalculateDistanceBetweenCoords';
import CreateItineraryService from '../services/CreateItineraryService';
import testData from "../constants/itineraryExample"
import maxRadius from '../constants/mapRadiusConfig';
const itinerariesRouter = Router();
itinerariesRouter.get('/', async (request, response) => {
const itinerariesRepository = getRepository(Itinerary);
const itineraries = await itinerariesRepository.find();
return response.json({ data: itineraries });
})
itinerariesRouter.post('/', async (request, response) => {
const {
id_itinerary,
vehicle_plate,
price,
days_of_week,
specific_day,
estimated_departure_time,
estimated_arrival_time,
available_seats,
itinerary_nickname,
neighborhoodsServed,
destinations
} = request.body;
const createItineraryService = new CreateItineraryService();
const itinerary = await createItineraryService.execute({
id_itinerary,
vehicle_plate,
price,
days_of_week,
specific_day,
estimated_departure_time,
estimated_arrival_time,
available_seats,
itinerary_nickname,
neighborhoodsServed,
destinations
});
return response.json({ data: itinerary, message: 'Itinerário criado com sucesso!' });
});
itinerariesRouter.post('/examples', async (request, response) => {
const createItineraryService = new CreateItineraryService();
const itinerary = await createItineraryService.execute({
id_itinerary: testData.itineraryExample.id_itinerary,
vehicle_plate: testData.itineraryExample.vehicle_plate,
price: testData.itineraryExample.price,
days_of_week: testData.itineraryExample.days_of_week,
specific_day: testData.itineraryExample.specific_day,
estimated_departure_time: testData.itineraryExample.estimated_departure_time,
estimated_arrival_time: testData.itineraryExample.estimated_arrival_time,
available_seats: testData.itineraryExample.available_seats,
itinerary_nickname: testData.itineraryExample.itinerary_nickname,
neighborhoodsServed: testData.neighborhoodsServed,
destinations: testData.destinations,
});
return response.json({ data: itinerary, message: 'Itinerário criado com sucesso!' });
});
itinerariesRouter.post('/search/inradius', async (request, response) => {
const { coordinatesOrigin, coordinatesDestination } = request.body;
const itinerariesRepository = getRepository(Itinerary);
// console.log(coordinatesOrigin, coordinatesDestiny);
const lat_from: number = +coordinatesOrigin.lat;
const lng_from: number = +coordinatesOrigin.lng;
const lat_to: number = +coordinatesDestination.lat;
const lng_to: number = +coordinatesDestination.lng;
const itineraries = await itinerariesRepository.find();
let transportsFiltered = itineraries.filter(itinerary => {
if (!itinerary.neighborhoodsServed || !itinerary.destinations) return false
var distanceOrigins = 0;
var distanceDestinations = 0;
for (const neighborhoodServed of itinerary.neighborhoodsServed) {
let lat2: number = +neighborhoodServed.latitude;
let lng2: number = +neighborhoodServed.longitude;
distanceOrigins = CalculateDistanceBetweenCoords({ lat1: lat_from, lng1: lng_from, lat2, lng2 });
if (distanceOrigins <= maxRadius) break;
}
for (const destination of itinerary.destinations) {
let lat2: number = +destination.latitude;
let lng2: number = +destination.longitude;
distanceDestinations = CalculateDistanceBetweenCoords({ lat1: lat_to, lng1: lng_to, lat2, lng2 });
if (distanceDestinations <= maxRadius) break;
}
console.log('distanceOrigins: ' + distanceOrigins)
console.log('distanceDestinations: ' + distanceDestinations)
return (distanceOrigins <= maxRadius && distanceDestinations <= maxRadius);
});
return response.json({ data: transportsFiltered });
});
export default itinerariesRouter;

View File

@@ -1,98 +0,0 @@
import { Router } from 'express';
import { getRepository } from 'typeorm';
import CalculateDistanceBetweenCoords from '../services/CalculateDistanceBetweenCoords';
const transporteRouter = Router();
transporteRouter.post('/', async (request, response) => {
const { coordinatesFrom, coordinatesTo } = request.body;
console.log(coordinatesFrom, coordinatesTo);
const data = [
{
motorista: 'João',
valor: 'R$ 150,00',
lugares: '2',
avaliacao: '4.5',
bairros_atendidos: [{lat:-22.873432, lgn:-47.142274}],
destinos: [{lat:-22.833645, lgn:-47.048905}],
},
{
motorista: 'Ricardo',
valor: 'R$ 180,00',
lugares: '5',
avaliacao: '4.0',
bairros_atendidos: [{lat:-22.873432, lgn:-47.142274}],
destinos: [{lat:-22.833645, lgn:-47.048905}],
},
{
motorista: 'Luiz',
valor: 'R$ 200,00',
lugares: '1',
avaliacao: '4.3',
bairros_atendidos: [{lat:-22.873432, lgn:-47.142274}],
destinos: [{lat:-22.833645, lgn:-47.048905}],
},
{
motorista: 'Marcos',
valor: 'R$ 199,00',
lugares: '6',
avaliacao: '4.9',
bairros_atendidos: [{lat:-22.873432, lgn:-47.142274}],
destinos: [{lat:-22.833645, lgn:-47.048905}],
},
{
motorista: 'Orandi',
valor: 'R$ 210,00',
lugares: '8',
avaliacao: '5.0',
bairros_atendidos: [{lat:-22.873432, lgn:-47.142274}],
destinos: [{lat:-22.833645, lgn:-47.048905}],
},
{
motorista: 'Pedro',
valor: 'R$ 189,00',
lugares: '4',
avaliacao: '4.1',
bairros_atendidos: [{lat:-22.873432, lgn:-47.142274}],
destinos: [{lat:-22.833645, lgn:-47.048905}],
},
{
motorista: 'Pericles',
valor: 'R$ 220,00',
lugares: '19',
avaliacao: '4.5',
bairros_atendidos: [{lat:-23.873432, lgn:-47.142274}],
destinos: [{lat:-22.833645, lgn:-47.048905}],
},
];
let lat_from:number = +coordinatesFrom.lat;
let lng_from:number = +coordinatesFrom.lng;
let lat_to:number = +coordinatesTo.lat;
let lng_to:number = +coordinatesTo.lng;
let transportsFiltered = data.filter(x => {
var distance = 0;
var distance2 = 0;
for (const i of x.bairros_atendidos) {
let lat2:number = +i.lat;
let lng2:number = +i.lgn;
distance = CalculateDistanceBetweenCoords({lat1:lat_from, lng1:lng_from, lat2, lng2});
if (distance <= 10) break;
}
for (const j of x.destinos) {
let lat2:number = +j.lat;
let lng2:number = +j.lgn;
distance2 = CalculateDistanceBetweenCoords({lat1:lat_to, lng1:lng_to, lat2, lng2});
if (distance2 <= 10) break;
}
return (distance <= 10 && distance2 <= 10);
});
console.log(transportsFiltered)
return response.json(transportsFiltered);
});
export default transporteRouter;

View File

@@ -12,7 +12,7 @@ import UpdateUserService from '../services/UpdateUserService';
import UpdateUserAvatarService from '../services/UpdateUserAvatarService'; import UpdateUserAvatarService from '../services/UpdateUserAvatarService';
import UpdateUserPasswordService from '../services/UpdateUserPasswordService'; import UpdateUserPasswordService from '../services/UpdateUserPasswordService';
import AuthenticateUserService from '../services/AuthenticateUserService'; import AuthenticateUserService from '../services/AuthenticateUserService';
import CheckIfUserHasVansService from '../services/CheckIfUserHasVansService'; import CheckIfUserHasVehiclesService from '../services/CheckIfUserHasVehiclesService';
const usersRouter = Router(); const usersRouter = Router();
@@ -49,14 +49,14 @@ usersRouter.get('/:id', ensureAuthenticated, async (request, response) => {
const user = await findUserService.execute(id); const user = await findUserService.execute(id);
// converting ISO 8601 date to normal date // // converting ISO 8601 date to normal date
let birth_date = new Date(user.birth_date); // let birth_date = new Date(user.birth_date);
let year = birth_date.getFullYear(); // let year = birth_date.getFullYear();
let month = birth_date.getMonth() + 1; // let month = birth_date.getMonth() + 1;
let date = birth_date.getDate(); // let date = birth_date.getDate();
const finalDate = `${date}/${month}/${year}`; // const newBirthDate = `${date}/${month}/${year}`;
const userWithoutPassword = { const userWithoutPassword = {
id_user: user.id_user, id_user: user.id_user,
@@ -64,7 +64,7 @@ usersRouter.get('/:id', ensureAuthenticated, async (request, response) => {
lastname: user.lastname, lastname: user.lastname,
email: user.email, email: user.email,
phone_number: user.phone_number, phone_number: user.phone_number,
birth_date: finalDate, birth_date: user.birth_date,
avatar_image: user.avatar_image, avatar_image: user.avatar_image,
bio: user.bio, bio: user.bio,
document_type: user.document_type, document_type: user.document_type,
@@ -134,13 +134,13 @@ usersRouter.get(
async (request, response) => { async (request, response) => {
const { id_user } = request.params; const { id_user } = request.params;
const checkIfUserHasVansService = new CheckIfUserHasVansService(); const checkIfUserHasVehiclesService = new CheckIfUserHasVehiclesService();
const userHasVans = await checkIfUserHasVansService.execute({ const userHasVehicles = await checkIfUserHasVehiclesService.execute({
id_user, id_user,
}); });
return response.json({ result: userHasVans }); return response.json({ result: userHasVehicles });
}, },
); );

View File

@@ -1,142 +0,0 @@
import { Router } from 'express';
import { getRepository } from 'typeorm';
import Van from '../models/Van';
import ensureAuthenticated from '../middlewares/ensureAuthenticated';
import FindVanService from '../services/FindVanService';
import CreateVanService from '../services/CreateVanService';
import UpdateVanService from '../services/UpdateVanService';
import UpdateVanPlateService from '../services/UpdateVanPlateService';
import FindVanByUserIdService from '../services/FindVansByUserIdService';
const vansRouter = Router();
vansRouter.get('/list', async (request, response) => {
const vansRepository = getRepository(Van);
const vans = await vansRepository.find();
return response.json({ data: vans });
});
vansRouter.get(
'/plate/:plate',
ensureAuthenticated,
async (request, response) => {
const { plate } = request.params;
const findVanService = new FindVanService();
const van = await findVanService.execute(plate);
return response.json({ data: van });
},
);
vansRouter.get(
'/user/:id_user',
async (request, response) => {
const { id_user } = request.params;
const findVanByUserIdService = new FindVanByUserIdService();
const vans = await findVanByUserIdService.execute(id_user);
return response.json({ data: vans });
},
);
vansRouter.post('/', ensureAuthenticated, async (request, response) => {
const {
plate,
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
} = request.body;
const createVanService = new CreateVanService();
console.log('aaaaaaaaaaaaaaa');
console.log(request.user);
const van = await createVanService.execute({
id_user: request.user.id_user,
plate,
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
});
return response.json({ message: 'Van criada com sucesso.', data: van });
});
vansRouter.patch(
'/edit/:plate',
ensureAuthenticated,
async (request, response) => {
const {
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
} = request.body;
const { plate } = request.params;
const updateVanService = new UpdateVanService();
await updateVanService.execute({
plate,
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
});
return response.json({
message: 'Informações da van atualizadas com sucesso.',
});
},
);
vansRouter.patch(
'/edit/plate/:plate',
ensureAuthenticated,
async (request, response) => {
const { newPlate } = request.body;
const { plate } = request.params;
const updateVanPlateService = new UpdateVanPlateService();
await updateVanPlateService.execute({
oldPlate: plate,
newPlate,
});
return response.json({
message: 'Placa da van atualizada com sucesso.',
});
},
);
export default vansRouter;

View File

@@ -0,0 +1,139 @@
import { Router } from 'express';
import { getRepository } from 'typeorm';
import Vehicle from '../models/Vehicle';
import ensureAuthenticated from '../middlewares/ensureAuthenticated';
import FindVehicleService from '../services/FindVehicleService';
import CreateVehicleService from '../services/CreateVehicleService';
import UpdateVehicleService from '../services/UpdateVehicleService';
import UpdateVehiclePlateService from '../services/UpdateVehiclePlateService';
import FindVehicleByUserIdService from '../services/FindVehiclesByUserIdService';
const vehiclesRouter = Router();
vehiclesRouter.get('/list', async (request, response) => {
const vehiclesRepository = getRepository(Vehicle);
const vehicles = await vehiclesRepository.find();
return response.json({ data: vehicles });
});
vehiclesRouter.get(
'/plate/:plate',
ensureAuthenticated,
async (request, response) => {
const { plate } = request.params;
const findVehicleService = new FindVehicleService();
const vehicle = await findVehicleService.execute(plate);
return response.json({ data: vehicle });
},
);
vehiclesRouter.get(
'/user/:id_user',
async (request, response) => {
const { id_user } = request.params;
const findVehicleByUserIdService = new FindVehicleByUserIdService();
const vehicles = await findVehicleByUserIdService.execute(id_user);
return response.json({ data: vehicles });
},
);
vehiclesRouter.post('/', ensureAuthenticated, async (request, response) => {
const {
plate,
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
} = request.body;
const createVehicleService = new CreateVehicleService();
const vehicle = await createVehicleService.execute({
id_user: request.user.id_user,
plate,
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
});
return response.json({ message: 'Veículo criado com sucesso.', data: vehicle });
});
vehiclesRouter.patch(
'/edit/:plate',
ensureAuthenticated,
async (request, response) => {
const {
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
} = request.body;
const { plate } = request.params;
const updateVehicleService = new UpdateVehicleService();
await updateVehicleService.execute({
plate,
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
});
return response.json({
message: 'Informações da vehicle atualizadas com sucesso.',
});
},
);
vehiclesRouter.patch(
'/edit/plate/:plate',
ensureAuthenticated,
async (request, response) => {
const { newPlate } = request.body;
const { plate } = request.params;
const updateVehiclePlateService = new UpdateVehiclePlateService();
await updateVehiclePlateService.execute({
oldPlate: plate,
newPlate,
});
return response.json({
message: 'Placa da vehicle atualizada com sucesso.',
});
},
);
export default vehiclesRouter;

View File

@@ -3,16 +3,16 @@ import { getRepository } from 'typeorm';
import AppError from '../errors/AppError'; import AppError from '../errors/AppError';
import User from '../models/User'; import User from '../models/User';
import Van from '../models/Van'; import Vehicle from '../models/Vehicle';
interface Request { interface Request {
id_user: string; id_user: string;
} }
class CheckIfUserHasVansService { class CheckIfUserHasVehiclesService {
public async execute({ id_user }: Request): Promise<Boolean> { public async execute({ id_user }: Request): Promise<Boolean> {
const usersRepository = getRepository(User); const usersRepository = getRepository(User);
const vansRepository = getRepository(Van); const vehiclesRepository = getRepository(Vehicle);
const user = await usersRepository.findOne({ const user = await usersRepository.findOne({
where: { id_user }, where: { id_user },
@@ -22,12 +22,12 @@ class CheckIfUserHasVansService {
throw new AppError('O usuário informado não foi encontrado.', 404); throw new AppError('O usuário informado não foi encontrado.', 404);
} }
const vanExists = await vansRepository.findOne({ const vehicleExists = await vehiclesRepository.findOne({
where: { user }, where: { user },
}); });
return !!vanExists return !!vehicleExists
} }
} }
export default CheckIfUserHasVansService; export default CheckIfUserHasVehiclesService;

View File

@@ -0,0 +1,71 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import Itinerary from '../models/Itinerary';
import NeighborhoodServed from '../models/NeighborhoodServed';
import Destination from '../models/Destination';
interface Request {
id_itinerary: number,
vehicle_plate: string,
price: number,
days_of_week: string,
specific_day: Date | undefined,
estimated_departure_time: string,
estimated_arrival_time: string,
available_seats: number,
itinerary_nickname: string,
neighborhoodsServed: NeighborhoodServed[],
destinations: Destination[]
}
class CreateItineraryService {
public async execute({
id_itinerary,
vehicle_plate,
price,
days_of_week,
specific_day,
estimated_departure_time,
estimated_arrival_time,
available_seats,
itinerary_nickname,
neighborhoodsServed,
destinations,
}: Request): Promise<Itinerary> {
const itinerariesRepository = getRepository(Itinerary);
// TODO, verificar se o período já está ocupado para a placa da vehicle informada!
// const checkUserEmailExists = await usersRepository.findOne({
// where: { id_itinerary },
// });
// if (checkUserEmailExists) {
// throw new AppError('Email já cadastrado!', 200);
// }
const itinerary = itinerariesRepository.create({
id_itinerary,
vehicle_plate,
price,
days_of_week,
specific_day,
estimated_departure_time,
estimated_arrival_time,
available_seats,
itinerary_nickname
});
await itinerariesRepository.save(itinerary);
itinerary.neighborhoodsServed = neighborhoodsServed
itinerary.destinations = destinations
await itinerariesRepository.save(itinerary);
return itinerary;
}
}
export default CreateItineraryService;

View File

@@ -18,7 +18,7 @@ interface Request {
class CreateUserService { class CreateUserService {
public async execute({ name, lastname, 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 socialInformationRepository = getRepository(Social); // const socialInformationRepository = getRepository(Social);
const checkUserEmailExists = await usersRepository.findOne({ const checkUserEmailExists = await usersRepository.findOne({
where: { email }, where: { email },

View File

@@ -3,7 +3,7 @@ import { getRepository } from 'typeorm';
import AppError from '../errors/AppError'; import AppError from '../errors/AppError';
import User from '../models/User'; import User from '../models/User';
import Van from '../models/Van'; import Vehicle from '../models/Vehicle';
interface Request { interface Request {
id_user: string; id_user: string;
@@ -18,7 +18,7 @@ interface Request {
locator_state: string; locator_state: string;
} }
class CreateVanService { class CreateVehicleService {
public async execute({ public async execute({
id_user, id_user,
plate, plate,
@@ -30,8 +30,8 @@ class CreateVanService {
locator_complement, locator_complement,
locator_city, locator_city,
locator_state, locator_state,
}: Request): Promise<Van> { }: Request): Promise<Vehicle> {
const vansRepository = getRepository(Van); const vehiclesRepository = getRepository(Vehicle);
const usersRepository = getRepository(User); const usersRepository = getRepository(User);
const user = await usersRepository.findOne({ const user = await usersRepository.findOne({
@@ -45,18 +45,18 @@ class CreateVanService {
); );
} }
const vanExists = await vansRepository.findOne({ const vehicleExists = await vehiclesRepository.findOne({
where: { plate }, where: { plate },
}); });
if (vanExists) { if (vehicleExists) {
throw new AppError( throw new AppError(
'Uma van com a placa informada já foi cadastrada.', 'Uma vehicle com a placa informada já foi cadastrada.',
409, 409,
); );
} }
const van = vansRepository.create({ const vehicle = vehiclesRepository.create({
user, user,
plate, plate,
brand, brand,
@@ -70,10 +70,10 @@ class CreateVanService {
locator_state, locator_state,
}); });
await vansRepository.save(van); await vehiclesRepository.save(vehicle);
return van; return vehicle;
} }
} }
export default CreateVanService; export default CreateVehicleService;

View File

@@ -1,25 +0,0 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import Van from '../models/Van';
import VanLocator from '../models/VanLocator';
class FindVanLocatorService {
public async execute(id_van: string): 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);
};
return van.locator;
}
}
export default FindVanLocatorService;

View File

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

View File

@@ -1,33 +0,0 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import User from '../models/User';
import Van from '../models/Van';
class FindVanByUserIdService {
public async execute(id_user: string): Promise<Van[]> {
const usersRepository = getRepository(User);
const vansRepository = getRepository(Van);
const user = await usersRepository.findOne({
where: { id_user }
});
if (!user) {
throw new AppError('O usuário informado não existe.', 404);
};
const van = await vansRepository.find({
where: { user }
});
if (!van) {
throw new AppError('Não há nenhuma van cadastrada para esse usuário.');
};
return van;
}
}
export default FindVanByUserIdService;

View File

@@ -0,0 +1,25 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import Vehicle from '../models/Vehicle';
import VehicleLocator from '../models/VehicleLocator';
class FindVehicleLocatorService {
public async execute(id_vehicle: string): Promise<VehicleLocator> {
const vehiclesRepository = getRepository(Vehicle);
const vehiclesLocatorsRepository = getRepository(VehicleLocator);
const vehicle = await vehiclesRepository.findOne({
where: { id_vehicle }
});
if (!vehicle) {
throw new AppError('A Vehicle informada não existe.', 404);
};
return vehicle.locator;
}
}
export default FindVehicleLocatorService;

View File

@@ -0,0 +1,23 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import Vehicle from '../models/Vehicle';
class FindVehicleService {
public async execute(plate: string): Promise<Vehicle> {
const vehiclesRepository = getRepository(Vehicle);
const vehicle = await vehiclesRepository.findOne({
where: { plate }
});
if (!vehicle) {
throw new AppError('A vehicle informada não existe.');
};
return vehicle;
}
}
export default FindVehicleService;

View File

@@ -0,0 +1,33 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import User from '../models/User';
import Vehicle from '../models/Vehicle';
class FindVehiclesByUserIdService {
public async execute(id_user: string): Promise<Vehicle[]> {
const usersRepository = getRepository(User);
const vehiclesRepository = getRepository(Vehicle);
const user = await usersRepository.findOne({
where: { id_user }
});
if (!user) {
throw new AppError('O usuário informado não existe.', 404);
};
const vehicle = await vehiclesRepository.find({
where: { user }
});
if (!vehicle) {
throw new AppError('Não há nenhuma vehicle cadastrada para esse usuário.');
};
return vehicle;
}
}
export default FindVehiclesByUserIdService;

View File

@@ -34,6 +34,7 @@ class UpdateUserService {
if (lastname) user.lastname = lastname if (lastname) user.lastname = lastname
if (bio) user.bio = bio if (bio) user.bio = bio
if (email) user.email = email if (email) user.email = email
if (birth_date) user.birth_date = birth_date
if (phone_number) { if (phone_number) {
const phoneAlreadyExists = await usersRepository.findOne({ const phoneAlreadyExists = await usersRepository.findOne({
@@ -44,13 +45,11 @@ class UpdateUserService {
throw new AppError('O telefone informado já está em uso por outra conta!', 409); throw new AppError('O telefone informado já está em uso por outra conta!', 409);
} }
} }
user.phone_number = phone_number user.phone_number = phone_number
if (document_type) user.document_type = document_type if (document_type) user.document_type = document_type
if (document) user.document = document if (document) user.document = document
// user.birth_date = new Date(birth_date); // TODO, funciona?
await usersRepository.save(user); await usersRepository.save(user);

View File

@@ -1,32 +0,0 @@
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

@@ -1,56 +0,0 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import Van from '../models/Van';
interface Request {
plate: string;
brand?: string;
model?: string;
seats_number?: string;
locator_name?: string;
locator_address?: string;
locator_complement?: string;
locator_city?: string;
locator_state?: string;
}
class UpdateVanService {
public async execute({
plate,
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
}: Request): Promise<Van> {
const vansRepository = getRepository(Van);
const van = await vansRepository.findOne({
where: { plate },
});
if (!van) {
throw new AppError('A van informada não existe.');
}
if (brand) van.brand = brand
if (model) van.model = model
if (seats_number) van.seats_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);
return van;
}
}
export default UpdateVanService;

View File

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

View File

@@ -0,0 +1,56 @@
import { getRepository } from 'typeorm';
import AppError from '../errors/AppError';
import Vehicle from '../models/Vehicle';
interface Request {
plate: string;
brand?: string;
model?: string;
seats_number?: string;
locator_name?: string;
locator_address?: string;
locator_complement?: string;
locator_city?: string;
locator_state?: string;
}
class UpdateVehicleService {
public async execute({
plate,
brand,
model,
seats_number,
locator_name,
locator_address,
locator_complement,
locator_city,
locator_state,
}: Request): Promise<Vehicle> {
const vehiclesRepository = getRepository(Vehicle);
const vehicle = await vehiclesRepository.findOne({
where: { plate },
});
if (!vehicle) {
throw new AppError('A vehicle informada não existe.');
}
if (brand) vehicle.brand = brand
if (model) vehicle.model = model
if (seats_number) vehicle.seats_number = seats_number
if (locator_name) vehicle.locator_name = locator_name
if (locator_address) vehicle.locator_address = locator_address
if (locator_complement) vehicle.locator_complement = locator_complement
if (locator_city) vehicle.locator_city = locator_city
if (locator_state) vehicle.locator_state = locator_state
await vehiclesRepository.save(vehicle);
return vehicle;
}
}
export default UpdateVehicleService;

2084
yarn.lock

File diff suppressed because it is too large Load Diff