src/main/resources/schema.sql
DROP TABLE IF EXISTS meeting_room CASCADE; DROP TABLE IF EXISTS reservable_room CASCADE; DROP TABLE IF EXISTS reservation CASCADE; DROP TABLE IF EXISTS usr CASCADE; CREATE TABLE IF NOT EXIST meeting_room( room_id SERIAL NOT NULL, room_name VARCHAR(255) NOT NULL, PRIMARY KEY (room_id) ); CREATE TABLE IF NOT EXIST reservable_room( reserved_data DATE NOT NULL, room_id INT4 NOT NULL, PRIMARY KEY(reserved_date, room_id) ); CREATE TABLE IF NOT EXIST meeting_room( reservation_id SERIAL NOT NULL, end_tim TIME NOT NULL, start_time TIME NOT NULL, reserved_date DATE NOT NULL, room_id INT4 NOT NULL, user_id VARCHAR(255) NOT NULL, PRIMARY KEY(reservation_id) ); CREATE TABLE IF NOT EXIST meeting_room( user_id VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, role_name VARCHAR(255) NOT NULL, PRIMARY KEY (user_id) );
repository class
package mrs.domain.repository.room;
import java.time.LocalDate;
import java.util.List;
import mrs.domain.model.ReservableRoom;
import mrs.domain.model.ReservableRoomId;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ReservableRoomRepository extends JpaRepository<ReservableRoom, ReservableRoomId>{
List<ReservableRoom> findByReservableRoom_reservedDateOrderByReservableRoomId_roomIdAsc(LocalDate reservedDate);
}
-> importで先ほど作ったmodelを読み込んでますね。なるほど、少しわかってきた。
domain/service/RoomService.java
package mrs.domain.repository.room;
import java.time.LocalDate;
import java.util.List;
import mrs.domain.model.ReservableRoom;
import mrs.domain.repository.room.ReservableRoomRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class RoomService {
@Autowired
ReservableRoomRepository reservableRoomRepository;
public List<ReservableRoom> findReservableRooms(LocalDate date){
return reservableRoomRepository.findByReservableRoomId_reservedDateOrderByReservableRoomId_roomIdAsc(date);
}
}
app/room/RoomsController.java
package mrs.app.room;
import java.time.LocalDate;
import java.util.List;
import mrs.domain.model.ReservableRoom;
import mrs.domain.service.room.RoomService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("rooms")
public class RoomsController {
@Autowired
RoomService roomService;
@RequestMapping(method = RequestMethod.GET)
String listRooms(Model model)
LocalDate today = LocalDate.now();
List<ReservableRoom> rooms = roomService.findReservableRooms(today);
model.addAttribute("date", today);
model.addAttribute("rooms", rooms);
return "room/listRooms";
}
-> ん? ControllerのRequestMappingでクエリ検索してる?
/main/resources/templates/room/listRooms.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title th:text="|${#temporals.format(date, 'yyyy/M/d')}の会議室|">2021/01/29の会議室</title>
</head>
<body>
<h3>会議室</h3>
<a th:href="@{'/rooms/' + ${date.minusDays(1)}}">< 前日</a>
<span th:text="|${#temporals.format(date, 'yyyy/M/d')}の会議室|">2021/01/29の会議室</span>
<a th:href="@{'/rooms/' + ${date.plusDays(1)}}">翌日 ></a>
<ul>
<li th:each="room: ${rooms}">
<a th:href="@{'/reservations/' + ${date}+ '/' + ${room.meetingRoom.roomId}}"
th:text="${room.meetingRoom.roomName}"></a>
</li>
</ul>
</body>
</html>
-> thymeleafはthで変数入れてますね。th:eachはforeachっぽい。
RoomsController
String listRooms(@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @PathVariable("date") LocalDate date, Model model)
規約が多い印象だが、想像してたより複雑ではなさそう。。