BookingServiceImpl.java
package com.aleprimo.Booking_System_App.service.serviceImpl;
import com.aleprimo.Booking_System_App.entity.Booking;
import com.aleprimo.Booking_System_App.entity.Notification;
import com.aleprimo.Booking_System_App.entity.User;
import com.aleprimo.Booking_System_App.entity.enums.BookingStatus;
import com.aleprimo.Booking_System_App.entity.enums.NotificationType;
import com.aleprimo.Booking_System_App.exception.ResourceNotFoundException;
import com.aleprimo.Booking_System_App.persistence.BookingDAO;
import com.aleprimo.Booking_System_App.service.BookingService;
import com.aleprimo.Booking_System_App.service.NotificationService;
import com.aleprimo.Booking_System_App.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Optional;
@Service
@RequiredArgsConstructor
public class BookingServiceImpl implements BookingService {
private final BookingDAO bookingDAO;
private final NotificationService notificationService;
private final UserService userService;
public Booking createBooking(Booking booking) {
Booking savedBooking = bookingDAO.save(booking);
if (savedBooking.getOffering() != null && savedBooking.getOffering().getProvider() != null) {
User provider = savedBooking.getOffering().getProvider();
Notification emailNotification = Notification.builder()
.message("Nuevo pedido de reserva: " + savedBooking.getCustomer().getName())
.recipient(provider)
.type(NotificationType.EMAIL)
.sent(false)
.build();
notificationService.createNotification(emailNotification);
Notification smsNotification = Notification.builder()
.message("Nuevo pedido de reserva: " + savedBooking.getCustomer().getName())
.recipient(provider)
.type(NotificationType.SMS)
.sent(false)
.build();
notificationService.createNotification(smsNotification);
}
return savedBooking;
}
@Override
public Booking updateBooking(Long id, Booking booking) {
Booking booking1 = bookingDAO.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Reserva no encontrada"));
booking1.setCustomer(booking.getCustomer());
booking1.setStatus(booking.getStatus());
booking1.setBookingDateTime(booking.getBookingDateTime());
booking1.setOffering(booking.getOffering());
Booking updatedBooking = bookingDAO.save(booking1);
if (updatedBooking.getOffering() != null && updatedBooking.getOffering().getProvider() != null) {
User provider = updatedBooking.getOffering().getProvider();
Notification notification = Notification.builder()
.message("Reserva actualizada: " + updatedBooking.getCustomer().getName() +
" - Estado: " + updatedBooking.getStatus())
.recipient(provider)
.type(NotificationType.EMAIL)
.sent(false)
.build();
notificationService.createNotification(notification);
Notification smsNotification = Notification.builder()
.message("Reserva actualizada: " + updatedBooking.getCustomer().getName() +
" - Estado: " + updatedBooking.getStatus())
.recipient(provider)
.type(NotificationType.SMS)
.sent(false)
.build();
notificationService.createNotification(smsNotification);
}
return updatedBooking;
}
@Override
public Booking updateBookingStatus(Long id, BookingStatus status) {
Booking booking = bookingDAO.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Reserva no encontrada"));
booking.setStatus(status);
return bookingDAO.save(booking);
}
@Override
public void deleteBooking(Long id) {
bookingDAO.deleteById(id);
}
@Override
public Optional<Booking> getBookingById(Long id) {
return bookingDAO.findById(id);
}
@Override
public Page<Booking> getAllBookings(Pageable pageable) {
return bookingDAO.findAll(pageable);
}
@Override
public Page<Booking> getBookingsByCustomerId(Long customerId, Pageable pageable) {
return bookingDAO.findByCustomerId(customerId, pageable);
}
@Override
public Page<Booking> getBookingsByOfferingId(Long offeringId, Pageable pageable) {
return bookingDAO.findByOfferingId(offeringId, pageable);
}
@Override
public Page<Booking> getBookingsByStatus(BookingStatus status, Pageable pageable) {
return bookingDAO.findByStatus(status, pageable);
}
@Override
public Page<Booking> getBookingsBetween(LocalDateTime start, LocalDateTime end, Pageable pageable) {
return bookingDAO.findByBookingDateTimeBetween(start, end, pageable);
}
}