Логика бронирования квартиры на конкретную дату
Задача: нужно проверить, может ли человек забронировать квартиру на заданную дату, если может, то сохранить в базе данных, если нет, то ничего не сохранять. Мой вариант кода оказался неправильным, я вообще не понимаю как лучше реализовать этот процесс, даже мыслей нет никаких на этот счёт. Code. Если не понадобится для ответа, то удалю.
@PostMapping("/rent")
@PreAuthorize("hasAuthority('user:write')")
public void homeRent(@RequestBody ContractDto contractDto) {
Contract contract = new Contract();
House house = houseRepository.findById(contractDto.getId_house()).orElseThrow();
Set<Contract> temp = house.getContract();
for(Contract s:temp) {
System.out.println(s.getStart_date());
if(s.getStart_date().equals("")) {
System.out.println("null");
}
}
Ответы (1 шт):
Неправильно ты, дядя Фёдор, бутерброд ешь
Прежде чем кодировать надо нарисовать структуру БД. В данном случае у вас есть таблица User, таблица House (квартиры) и таблица Contract - записи о контрактах. Не углубляясь в дебри теоремы Бойса-Кодда, более-менее очевидно, что, структура БД приблизительно следующая (в самоочевидном псевдокоде):
Contract {
contractId //первичный ключ
houseId //ссылка на арендуемую квартиру
userId //ссылка на юзера - кто арендует
startDate //с какой даты
endDate //до какой даты
}
Теперь пишем SQL запрос на свободность заданной квартиры, примерно так (опять же полупсевдокод):
select houseId from Contract where (myEndDate < Contract.startDate or (myStarteDate > Contract.endDate)
Запрос выдает список свободных квартир. Ежели в списке указанных квартир значится искомая, значит сохраняем.
Вооружившись таковым знанием уже проще все закодировать можно в виде HQL или программном коде Hibernate - что уже и не принципиально.