diff --git a/src/constants/itineraryExample.ts b/src/constants/itineraryExample.ts new file mode 100644 index 0000000..1ea47e1 --- /dev/null +++ b/src/constants/itineraryExample.ts @@ -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 }; diff --git a/src/routes/itineraries.routes.ts b/src/routes/itineraries.routes.ts index e344802..f2ad070 100644 --- a/src/routes/itineraries.routes.ts +++ b/src/routes/itineraries.routes.ts @@ -1,94 +1,119 @@ import { Router } from 'express'; import { getRepository } from 'typeorm'; +import axios from 'axios' + +import AppError from '../errors/AppError'; +import Itinerary from '../models/Itinerary'; import CalculateDistanceBetweenCoords from '../services/CalculateDistanceBetweenCoords'; +import CreateItineraryService from '../services/CreateItineraryService'; +import NeighborhoodServed from '../models/NeighborhoodServed'; +import Destination from '../models/Destination'; + +import testData from "../constants/itineraryExample" const itinerariesRouter = Router(); -itinerariesRouter.post('/', async (request, response) => { - 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}], - }, - ]; +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('/inradius', async (request, response) => { const { coordinatesFrom, coordinatesTo } = request.body; console.log(coordinatesFrom, coordinatesTo); + 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 lat_from:number = +coordinatesFrom.lat; - let lng_from:number = +coordinatesFrom.lng; - let lat_to:number = +coordinatesTo.lat; - let lng_to:number = +coordinatesTo.lng; + const { data, status } = await axios.get( + 'https://630d4f7fb37c364eb702a43d.mockapi.io/vehiclemos/itineraries', + { + 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); + } + + console.log(data) + + // "data" é a lista de itinerários 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}); + 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}); + let lat2: number = +j.lat; + let lng2: number = +j.lgn; + distance2 = CalculateDistanceBetweenCoords({ lat1: lat_to, lng1: lng_to, lat2, lng2 }); if (distance2 <= 10) break; } @@ -99,4 +124,11 @@ itinerariesRouter.post('/', async (request, response) => { return response.json(transportsFiltered); }); +itinerariesRouter.post('/', async (request, response) => { + const itinerariesRepository = getRepository(Itinerary); + // const itinerary = itinerariesRepository.create(); + + // return user; +}) + export default itinerariesRouter; diff --git a/src/services/CreateItineraryService.ts b/src/services/CreateItineraryService.ts new file mode 100644 index 0000000..1b364f6 --- /dev/null +++ b/src/services/CreateItineraryService.ts @@ -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 { + 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;