From 9e62b25b19ec83183fabece1cd664660e02ed195 Mon Sep 17 00:00:00 2001 From: Marco Santana Date: Mon, 4 May 2020 11:31:10 -0300 Subject: [PATCH] added a service for create appointment --- src/routes/appointments.router.ts | 28 +++++++++-------- src/services/CreateAppointmentService.ts | 40 ++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 13 deletions(-) create mode 100644 src/services/CreateAppointmentService.ts diff --git a/src/routes/appointments.router.ts b/src/routes/appointments.router.ts index 98bd3d8..a2e4b30 100644 --- a/src/routes/appointments.router.ts +++ b/src/routes/appointments.router.ts @@ -1,6 +1,7 @@ import { Router } from 'express'; -import { startOfHour, parseISO } from 'date-fns'; +import { parseISO } from 'date-fns'; import AppointmentsRepository from '../repositories/AppointmentsRepository'; +import CreateAppointmentService from '../services/CreateAppointmentService'; const router = Router(); @@ -13,20 +14,21 @@ router.get('/', (request, response) => { router.post('/', (request, response) => { const { provider, date } = request.body; - const parsedDate = startOfHour(parseISO(date)); + try { + const parsedDate = parseISO(date); - if (appointmentsRepository.findByDate(parsedDate)) { - return response - .status(400) - .json({ message: 'This date is already booked.' }); - } - - const appointment = appointmentsRepository.create({ - provider, - date: parsedDate, - }); + const createAppointment = new CreateAppointmentService( + appointmentsRepository, + ); + const appointment = createAppointment.execute({ + provider, + date: parsedDate, + }); - return response.json(appointment); + return response.json(appointment); + } catch (err) { + return response.status(400).json({ error: err.message }); + } }); export default router; diff --git a/src/services/CreateAppointmentService.ts b/src/services/CreateAppointmentService.ts new file mode 100644 index 0000000..7a62566 --- /dev/null +++ b/src/services/CreateAppointmentService.ts @@ -0,0 +1,40 @@ +import { startOfHour } from 'date-fns'; +import AppointmentsRepository from '../repositories/AppointmentsRepository'; +import Appointment from '../models/Appointment'; + +interface CreateAppointmentServiceInterface { + provider: string; + + date: Date; +} + +class CreateAppointmentService { + private appointmentsRepository: AppointmentsRepository; + + constructor(appointmentRepository: AppointmentsRepository) { + this.appointmentsRepository = appointmentRepository; + } + + public execute({ + provider, + date, + }: CreateAppointmentServiceInterface): Appointment { + const appointmentDate = startOfHour(date); + + if (this.appointmentsRepository.findByDate(appointmentDate)) { + throw Error('This date is already booked.'); + // return response + // .status(400) + // .json({ message: 'This date is already booked.' }); + } + + const appointment = this.appointmentsRepository.create({ + provider, + date: appointmentDate, + }); + + return appointment; + } +} + +export default CreateAppointmentService;