Skip to content

Commit

Permalink
[HottelStaff] Quản lý bookings
Browse files Browse the repository at this point in the history
  • Loading branch information
TranHuyHoangIT committed Sep 11, 2024
1 parent b0f5f56 commit 27606c0
Show file tree
Hide file tree
Showing 14 changed files with 631 additions and 29 deletions.
19 changes: 19 additions & 0 deletions src/main/java/com/app/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.app.config;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public FilterRegistrationBean<HiddenHttpMethodFilter> hiddenHttpMethodFilter() {
FilterRegistrationBean<HiddenHttpMethodFilter> filterRegistrationBean = new FilterRegistrationBean<>(new HiddenHttpMethodFilter());
filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return filterRegistrationBean;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,43 @@
import com.app.constants.Role;
import com.app.controllers.BaseController;
import com.app.dtos.UserRegistrationDTO;
import com.app.services.BookingService;
import com.app.services.HotelService;
import com.app.services.UserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.ui.Model;

@Controller
@RequestMapping("/manager")
@Slf4j
public class HotelManagerController extends BaseController {
@Autowired
BookingService bookingService;
@Autowired
UserService userService;
@Autowired
HotelService hotelService;
public HotelManagerController(UserService userService) {
super(userService);
}

@GetMapping("/dashboard")
public String dashboard() {
public String dashboard(Model model) {
int bookingCount = bookingService.countBookings();
int hotelCount = hotelService.countHotels();
int userCount = userService.countUsers();

// Add attributes to the model to be used in the Thymeleaf template
model.addAttribute("bookingCount", bookingCount);
model.addAttribute("hotelCount", hotelCount);
model.addAttribute("userCount", userCount);
return "manager/dashboard";
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package com.app.controllers.manager;

import com.app.dtos.BookingDTO;
import com.app.models.Booking;
import com.app.services.BookingService;
import com.app.services.UserService;
import groovy.util.logging.Slf4j;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.List;
import java.util.Optional;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

@Controller
@RequestMapping("/manager/bookings")
@RequiredArgsConstructor
@Slf4j
public class ManagerBookingController {

@Autowired
BookingService bookingService;

@Autowired
UserService userService;

@GetMapping
public String index(Model model,
@RequestParam("page") Optional<Integer> page,
@RequestParam("size") Optional<Integer> size) {
int currentPage = page.orElse(1);
int pageSize = size.orElse(5);

Pageable pageable = PageRequest.of(currentPage - 1, pageSize);
Page<Booking> bookingPage = bookingService.findPaginatedBookings(pageable);
int totalPages = bookingPage.getTotalPages();
model.addAttribute("bookingPage", bookingPage);
if (totalPages > 0) {
List<Integer> pageNumbers = IntStream.rangeClosed(1, totalPages)
.boxed()
.collect(Collectors.toList());
model.addAttribute("pageNumbers", pageNumbers);
}

return "manager/bookings/index";
}

@GetMapping("/new")
public String showCreateForm(Model model) {
model.addAttribute("bookingDTO", new BookingDTO());
model.addAttribute("customers", userService.findAll());
return "manager/bookings/add-booking";
}

@PostMapping("/")
public String saveBooking(@ModelAttribute("bookingDTO") BookingDTO bookingDTO, RedirectAttributes redirectAttributes) {
bookingService.saveBooking(bookingDTO);
redirectAttributes.addFlashAttribute("message", "Booking created successfully!");
return "redirect:/manager/bookings";
}

@GetMapping("/{id}/edit")
public String showEditForm(@PathVariable("id") Integer id, Model model) {
Booking booking = bookingService.findById(id);
model.addAttribute("bookingDTO", bookingService.convertToDTO(booking));
return "manager/bookings/edit-booking";
}

@PatchMapping("/{id}/update")
public String updateBooking(@PathVariable("id") Integer id, @ModelAttribute("bookingDTO") BookingDTO bookingDTO, RedirectAttributes redirectAttributes) {
bookingService.updateBooking(id, bookingDTO);
redirectAttributes.addFlashAttribute("message", "Booking updated successfully!");
return "redirect:/manager/bookings";
}

@DeleteMapping("/{id}")
public String deleteBooking(@PathVariable("id") Integer id, RedirectAttributes redirectAttributes) {
bookingService.deleteBooking(id);
redirectAttributes.addFlashAttribute("message", "Booking deleted successfully!");
return "redirect:/manager/bookings";
}
}
3 changes: 3 additions & 0 deletions src/main/java/com/app/dtos/BookingDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
Expand All @@ -13,6 +14,8 @@
@AllArgsConstructor
@Getter
@Setter
@Data
@Builder
public class BookingDTO {
private Integer id;
private Integer customerId;
Expand Down
50 changes: 44 additions & 6 deletions src/main/java/com/app/initialize/TestDataInitializer.java
Original file line number Diff line number Diff line change
@@ -1,32 +1,37 @@
package com.app.initialize;


import com.app.models.Booking;
import com.app.models.User;
import com.app.repositories.BookingRepository;
import com.app.repositories.UserRepository;
import com.app.constants.BookingStatus;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.dao.DataAccessException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
import com.app.models.User;
import com.app.constants.Role;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

import com.app.constants.Role;

@Component
@RequiredArgsConstructor
@Slf4j
public class TestDataInitializer implements CommandLineRunner {

private final UserRepository userRepository;
private final BookingRepository bookingRepository;
private final PasswordEncoder passwordEncoder;

@Override
@Transactional
public void run(String... args) {

try {
log.warn("Checking if test data persistence is required...");

Expand All @@ -38,19 +43,52 @@ public void run(String... args) {
User user3 = User.builder().email("manager1@hotel.com").password(passwordEncoder.encode("123456")).name("John").role(Role.valueOf("HOTEL_STAFF")).build();
User user4 = User.builder().email("manager2@hotel.com").password(passwordEncoder.encode("123456")).name("Max").role(Role.valueOf("HOTEL_STAFF")).build();

log.debug("Saving users...");
userRepository.save(user1);
userRepository.save(user2);
userRepository.save(user3);
userRepository.save(user4);

log.info("Users saved. Creating sample bookings...");
createSampleBookings(user2); // Assuming user2 is a customer

log.info("Sample bookings created successfully!");

} else {
log.info("Test data persistence is not required");
}
log.warn("App ready");
} catch (DataAccessException e) {
log.error("Exception occurred during data persistence: " + e.getMessage());
log.error("Exception occurred during data persistence: " + e.getMessage(), e);
} catch (Exception e) {
log.error("Unexpected exception occurred: " + e.getMessage());
log.error("Unexpected exception occurred: " + e.getMessage(), e);
}
}

private void createSampleBookings(User customer) {
List<String> statuses = Arrays.asList("PENDING", "CONFIRMED", "CANCELLED");
Random random = new Random();

log.debug("Creating bookings for customer: {}", customer.getEmail());
for (int i = 1; i <= 10; i++) {
LocalDate checkinDate = LocalDate.now().plusDays(random.nextInt(30));
LocalDate checkoutDate = checkinDate.plusDays(random.nextInt(5) + 1); // Random stay between 1 and 5 days

Booking booking = Booking.builder()
.customer(customer) // Assigning the customer from the sample user
.name("Booking " + i)
.email("customer" + i + "@hotel.com")
.phone("+12345678" + i)
.address("Address " + i)
.checkinDate(checkinDate)
.checkoutDate(checkoutDate)
.status(BookingStatus.valueOf(statuses.get(random.nextInt(statuses.size()))))
.totalAmount(100.0 + random.nextInt(500)) // Random amount between 100 and 600
.build();

log.debug("Saving booking: {}", booking);
bookingRepository.save(booking);
}
log.debug("All bookings saved successfully.");
}
}
5 changes: 4 additions & 1 deletion src/main/java/com/app/models/Booking.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
Expand All @@ -17,10 +18,12 @@
@AllArgsConstructor
@Getter
@Setter
@Data
@Builder
public class Booking {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@ManyToOne
Expand Down
18 changes: 15 additions & 3 deletions src/main/java/com/app/services/BookingService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.app.services;

import com.app.dtos.BookingDTO;
import com.app.models.Booking;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
Expand All @@ -16,8 +19,17 @@ public interface BookingService {

public List<Booking> findBookingsByHotelStaff() ;

public void save(Booking booking) ;
Page<Booking> findPaginatedBookings(Pageable pageable);

public void update(Integer id, Booking booking) ;
public void delete(Integer id) ;
void saveBooking(BookingDTO bookingDTO);

void updateBooking(Integer id, BookingDTO bookingDTO);

void deleteBooking(Integer id);

BookingDTO convertToDTO(Booking booking);

Booking convertToEntity(BookingDTO bookingDTO);
}


2 changes: 2 additions & 0 deletions src/main/java/com/app/services/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,6 @@ public interface UserService {
User convertToEntity(UserInfoDTO userDTO);

void saveUserInfo(UserInfoDTO userDTO);

List<User> findAll();
}
Loading

0 comments on commit 27606c0

Please sign in to comment.