diff --git a/build.gradle b/build.gradle index 8d52aebc6..01347df89 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,11 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + + // jakarta.persistence-api 의존성 명시적 추가 (필요한 경우) + implementation 'jakarta.persistence:jakarta.persistence-api' + implementation 'dev.akkinoc.spring.boot:logback-access-spring-boot-starter:4.0.0' diff --git a/src/main/java/roomescape/auth/TokenInterceptor.java b/src/main/java/roomescape/auth/TokenInterceptor.java index 0e394e443..deb4193f3 100644 --- a/src/main/java/roomescape/auth/TokenInterceptor.java +++ b/src/main/java/roomescape/auth/TokenInterceptor.java @@ -21,19 +21,18 @@ public TokenInterceptor(AuthService authService) { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Cookie[] cookies = request.getCookies(); - if (cookies == null) { - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - return false; + if (cookies != null) { + String token = Arrays.stream(cookies) + .filter(cookie -> "token".equals(cookie.getName())) + .map(Cookie::getValue) + .findFirst() + .orElse(null); + + if (token != null && !token.isBlank()) { + LoginMember loginMember = authService.parseMemberInfo(token); + request.setAttribute("loginMember", loginMember); + } } - - String token = Arrays.stream(cookies) - .filter(cookie -> "token".equals(cookie.getName())) - .map(Cookie::getValue) - .findFirst() - .orElse(null); - - LoginMember loginMember = authService.parseMemberInfo(token); - request.setAttribute("loginMember", loginMember); return HandlerInterceptor.super.preHandle(request, response, handler); } } diff --git a/src/main/java/roomescape/member/Member.java b/src/main/java/roomescape/member/Member.java index 9ec10f04a..e566bb583 100644 --- a/src/main/java/roomescape/member/Member.java +++ b/src/main/java/roomescape/member/Member.java @@ -1,10 +1,27 @@ package roomescape.member; + +import jakarta.persistence.*; + +@Entity public class Member { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "member_id", nullable = false) private Long id; + + @Column(nullable = false) private String name; + + @Column(nullable = false) private String email; + + @Column(nullable = false) private String password; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) private Role role; public Member(Long id, String name, String email, Role role) { @@ -21,6 +38,10 @@ public Member(String name, String email, String password, Role role) { this.role = role; } + public Member() { + + } + public Long getId() { return id; } diff --git a/src/main/java/roomescape/member/MemberDao.java b/src/main/java/roomescape/member/MemberDao.java index 63898117c..b87daab72 100644 --- a/src/main/java/roomescape/member/MemberDao.java +++ b/src/main/java/roomescape/member/MemberDao.java @@ -39,17 +39,4 @@ public Member findByEmailAndPassword(String email, String password) { email, password ); } - - public Member findByName(String name) { - return jdbcTemplate.queryForObject( - "SELECT id, name, email, role FROM member WHERE name = ?", - (rs, rowNum) -> new Member( - rs.getLong("id"), - rs.getString("name"), - rs.getString("email"), - Role.valueOf(rs.getString("role")) - ), - name - ); - } } diff --git a/src/main/java/roomescape/member/MemberRepository.java b/src/main/java/roomescape/member/MemberRepository.java new file mode 100644 index 000000000..474154492 --- /dev/null +++ b/src/main/java/roomescape/member/MemberRepository.java @@ -0,0 +1,9 @@ +package roomescape.member; + +import org.springframework.data.repository.CrudRepository; + +import java.util.Optional; + +public interface MemberRepository extends CrudRepository { + Optional findByEmailAndPassword(String email, String password); +} diff --git a/src/main/java/roomescape/member/MemberService.java b/src/main/java/roomescape/member/MemberService.java index d9808f127..bb29b96a6 100644 --- a/src/main/java/roomescape/member/MemberService.java +++ b/src/main/java/roomescape/member/MemberService.java @@ -4,14 +4,16 @@ @Service public class MemberService { - private final MemberDao memberDao; - public MemberService(final MemberDao memberDao) { - this.memberDao = memberDao; + private final MemberRepository memberRepository; + + public MemberService(MemberRepository memberRepository) { + this.memberRepository = memberRepository; } public MemberResponse createMember(MemberRequest memberRequest) { - Member member = memberDao.save(new Member(memberRequest.name(), memberRequest.email(), memberRequest.password(), Role.USER)); + Member member = memberRepository.save(new Member(memberRequest.name(), memberRequest.email(), memberRequest.password(), Role.USER)); + return new MemberResponse(member.getId(), member.getName(), member.getEmail()); } diff --git a/src/main/java/roomescape/reservation/MyReservationResponse.java b/src/main/java/roomescape/reservation/MyReservationResponse.java new file mode 100644 index 000000000..ace8cf49f --- /dev/null +++ b/src/main/java/roomescape/reservation/MyReservationResponse.java @@ -0,0 +1,38 @@ +package roomescape.reservation; + +public class MyReservationResponse { + + private Long id; + private String theme; + private String date; + private String time; + private String status; + + public MyReservationResponse(Long id, String theme, String date, String time, String status) { + this.id = id; + this.theme = theme; + this.date = date; + this.time = time; + this.status = status; + } + + public Long getId() { + return id; + } + + public String getTheme() { + return theme; + } + + public String getDate() { + return date; + } + + public String getTime() { + return time; + } + + public String getStatus() { + return status; + } +} diff --git a/src/main/java/roomescape/reservation/Reservation.java b/src/main/java/roomescape/reservation/Reservation.java index 83a7edf1b..e9088aa2d 100644 --- a/src/main/java/roomescape/reservation/Reservation.java +++ b/src/main/java/roomescape/reservation/Reservation.java @@ -1,28 +1,66 @@ package roomescape.reservation; +import jakarta.persistence.*; +import roomescape.member.Member; import roomescape.theme.Theme; -import roomescape.time.Time; +import roomescape.time.ParticipationTime; +@Entity public class Reservation { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "reservation_id", nullable = false) private Long id; + + @Column(nullable = false) private String name; + + @Column(nullable = false) private String date; - private Time time; + + @ManyToOne + @JoinColumn(name = "member_id") + private Member member; + + @ManyToOne + @JoinColumn(name = "time_id") + private ParticipationTime participationTime; + + @ManyToOne + @JoinColumn(name = "theme_id") private Theme theme; - public Reservation(Long id, String name, String date, Time time, Theme theme) { + public Reservation(Long id, String name, String date, ParticipationTime participationTime, Theme theme, Member member) { this.id = id; this.name = name; this.date = date; - this.time = time; + this.participationTime = participationTime; + this.theme = theme; + this.member = member; + } + + public Reservation(Long id, String name, String date, ParticipationTime participationTime, Theme theme) { + this.id = id; + this.name = name; + this.date = date; + this.participationTime = participationTime; + this.theme = theme; + } + + public Reservation(String name, String date, ParticipationTime participationTime, Theme theme) { + this.name = name; + this.date = date; + this.participationTime = participationTime; this.theme = theme; } - public Reservation(String name, String date, Time time, Theme theme) { + public Reservation(String name, String date, ParticipationTime participationTime, Theme theme, Member member) { this.name = name; this.date = date; - this.time = time; + this.participationTime = participationTime; this.theme = theme; + this.member = member; } public Reservation() { @@ -41,8 +79,8 @@ public String getDate() { return date; } - public Time getTime() { - return time; + public ParticipationTime getTime() { + return participationTime; } public Theme getTheme() { diff --git a/src/main/java/roomescape/reservation/ReservationController.java b/src/main/java/roomescape/reservation/ReservationController.java index 66a7a89de..894690911 100644 --- a/src/main/java/roomescape/reservation/ReservationController.java +++ b/src/main/java/roomescape/reservation/ReservationController.java @@ -26,12 +26,17 @@ public List list() { return reservationService.findAll(); } + @GetMapping("/reservations/mine") + public List myReservations(LoginMember loginMember) { + return reservationService.findMyReservation(loginMember); + } + @PostMapping("/reservations") public ResponseEntity create(@RequestBody ReservationRequest reservationRequest, LoginMember loginMember) { if (reservationRequest.getDate() == null - || reservationRequest.getTheme() == null - || reservationRequest.getTime() == null) { + || reservationRequest.getThemeId() == null + || reservationRequest.getTimeId() == null) { return ResponseEntity.badRequest().build(); } @@ -44,4 +49,6 @@ public ResponseEntity delete(@PathVariable Long id) { reservationService.deleteById(id); return ResponseEntity.noContent().build(); } + + } diff --git a/src/main/java/roomescape/reservation/ReservationDao.java b/src/main/java/roomescape/reservation/ReservationDao.java deleted file mode 100644 index a4972430c..000000000 --- a/src/main/java/roomescape/reservation/ReservationDao.java +++ /dev/null @@ -1,127 +0,0 @@ -package roomescape.reservation; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; -import roomescape.theme.Theme; -import roomescape.time.Time; - -import java.sql.PreparedStatement; -import java.util.List; - -@Repository -public class ReservationDao { - - private final JdbcTemplate jdbcTemplate; - - public ReservationDao(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public List findAll() { - return jdbcTemplate.query( - "SELECT r.id AS reservation_id, r.name as reservation_name, r.date as reservation_date, " + - "t.id AS theme_id, t.name AS theme_name, t.description AS theme_description, " + - "ti.id AS time_id, ti.time_value AS time_value " + - "FROM reservation r " + - "JOIN theme t ON r.theme_id = t.id " + - "JOIN time ti ON r.time_id = ti.id", - - (rs, rowNum) -> new Reservation( - rs.getLong("reservation_id"), - rs.getString("reservation_name"), - rs.getString("reservation_date"), - new Time( - rs.getLong("time_id"), - rs.getString("time_value") - ), - new Theme( - rs.getLong("theme_id"), - rs.getString("theme_name"), - rs.getString("theme_description") - ))); - } - - public Reservation save(ReservationRequest reservationRequest) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(connection -> { - PreparedStatement ps = connection.prepareStatement("INSERT INTO reservation(date, name, theme_id, time_id) VALUES (?, ?, ?, ?)", new String[]{"id"}); - ps.setString(1, reservationRequest.getDate()); - ps.setString(2, reservationRequest.getName()); - ps.setLong(3, reservationRequest.getTheme()); - ps.setLong(4, reservationRequest.getTime()); - return ps; - }, keyHolder); - - Time time = jdbcTemplate.queryForObject("SELECT * FROM time WHERE id = ?", - (rs, rowNum) -> new Time(rs.getLong("id"), rs.getString("time_value")), - reservationRequest.getTime()); - - Theme theme = jdbcTemplate.queryForObject("SELECT * FROM theme WHERE id = ?", - (rs, rowNum) -> new Theme(rs.getLong("id"), rs.getString("name"), rs.getString("description")), - reservationRequest.getTheme()); - - return new Reservation( - keyHolder.getKey().longValue(), - reservationRequest.getName(), - reservationRequest.getDate(), - time, - theme - ); - } - - public void deleteById(Long id) { - jdbcTemplate.update("DELETE FROM reservation WHERE id = ?", id); - } - - public List findReservationsByDateAndTheme(String date, Long themeId) { - return jdbcTemplate.query( - "SELECT r.id AS reservation_id, r.name as reservation_name, r.date as reservation_date, " + - "t.id AS theme_id, t.name AS theme_name, t.description AS theme_description, " + - "ti.id AS time_id, ti.time_value AS time_value " + - "FROM reservation r " + - "JOIN theme t ON r.theme_id = t.id " + - "JOIN time ti ON r.time_id = ti.id" + - "WHERE r.date = ? AND r.theme_id = ?", - new Object[]{date, themeId}, - (rs, rowNum) -> new Reservation( - rs.getLong("reservation_id"), - rs.getString("reservation_name"), - rs.getString("reservation_date"), - new Time( - rs.getLong("time_id"), - rs.getString("time_value") - ), - new Theme( - rs.getLong("theme_id"), - rs.getString("theme_name"), - rs.getString("theme_description") - ))); - } - - public List findByDateAndThemeId(String date, Long themeId) { - return jdbcTemplate.query( - "SELECT r.id AS reservation_id, r.name as reservation_name, r.date as reservation_date, " + - "t.id AS theme_id, t.name AS theme_name, t.description AS theme_description, " + - "ti.id AS time_id, ti.time_value AS time_value " + - "FROM reservation r " + - "JOIN theme t ON r.theme_id = t.id " + - "JOIN time ti ON r.time_id = ti.id " + - "WHERE r.date = ? AND r.theme_id = ?", - new Object[]{date, themeId}, - (rs, rowNum) -> new Reservation( - rs.getLong("reservation_id"), - rs.getString("reservation_name"), - rs.getString("reservation_date"), - new Time( - rs.getLong("time_id"), - rs.getString("time_value") - ), - new Theme( - rs.getLong("theme_id"), - rs.getString("theme_name"), - rs.getString("theme_description") - ))); - } -} diff --git a/src/main/java/roomescape/reservation/ReservationRepository.java b/src/main/java/roomescape/reservation/ReservationRepository.java new file mode 100644 index 000000000..8356ff183 --- /dev/null +++ b/src/main/java/roomescape/reservation/ReservationRepository.java @@ -0,0 +1,21 @@ +package roomescape.reservation; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface ReservationRepository extends CrudRepository { + + Optional findById(Long id); + + List findByMemberId(Long memberId); + + List findAllByDateAndThemeId(String date, long themeId); + + Reservation save(Reservation reservation); + + List findAll(); +} diff --git a/src/main/java/roomescape/reservation/ReservationRequest.java b/src/main/java/roomescape/reservation/ReservationRequest.java index 41f424af7..87fde8c75 100644 --- a/src/main/java/roomescape/reservation/ReservationRequest.java +++ b/src/main/java/roomescape/reservation/ReservationRequest.java @@ -21,11 +21,11 @@ public String getDate() { return date; } - public Long getTheme() { + public Long getThemeId() { return theme; } - public Long getTime() { + public Long getTimeId() { return time; } } diff --git a/src/main/java/roomescape/reservation/ReservationService.java b/src/main/java/roomescape/reservation/ReservationService.java index 5d1757e59..c89732e97 100644 --- a/src/main/java/roomescape/reservation/ReservationService.java +++ b/src/main/java/roomescape/reservation/ReservationService.java @@ -3,20 +3,54 @@ import org.springframework.stereotype.Service; import roomescape.auth.LoginMember; +import roomescape.member.Member; +import roomescape.member.Role; +import roomescape.theme.Theme; +import roomescape.theme.ThemeRepository; +import roomescape.time.ParticipationTime; +import roomescape.time.ParticipationTimeRepository; +import roomescape.waiting.Waiting; +import roomescape.waiting.WaitingRepository; +import roomescape.waiting.WaitingWithRank; + + +import java.util.ArrayList; import java.util.List; @Service public class ReservationService { - private ReservationDao reservationDao; - public ReservationService(ReservationDao reservationDao) { - this.reservationDao = reservationDao; + private ReservationRepository reservationRepository; + private ParticipationTimeRepository participationTimeRepository; + private ThemeRepository themeRepository; + private WaitingRepository waitingRepository; + + public ReservationService(ReservationRepository reservationRepository, ParticipationTimeRepository participationTimeRepository, ThemeRepository themeRepository, WaitingRepository waitingRepository) { + this.reservationRepository = reservationRepository; + this.participationTimeRepository = participationTimeRepository; + this.themeRepository = themeRepository; + this.waitingRepository = waitingRepository; } public ReservationResponse save(ReservationRequest reservationRequest, LoginMember loginMember) { reservationRequest = replaceNameIfEmpty(reservationRequest, loginMember); - Reservation reservation = reservationDao.save(reservationRequest); - return new ReservationResponse(reservation.getId(), reservationRequest.getName(), reservation.getTheme().getName(), reservation.getDate(), reservation.getTime().getValue()); + + Member member = new Member(loginMember.getId(), loginMember.getName(), loginMember.getEmail(), Role.valueOf(loginMember.getRole())); + ParticipationTime time = participationTimeRepository.findById(reservationRequest.getTimeId()).orElseThrow(() -> new IllegalArgumentException("존재하지 않는 시간입니다.")); + Theme theme = themeRepository.findById(reservationRequest.getThemeId()).orElseThrow(() -> new IllegalArgumentException("존재하지 않는 테마입니다.")); + + Reservation reservation = new Reservation(reservationRequest.getName(), reservationRequest.getDate(), time, theme, member); + reservation = reservationRepository.save(reservation); + return new ReservationResponse(reservation.getId(), reservationRequest.getName(), reservation.getTheme().getName(), reservation.getDate(), reservation.getTime().getTime()); + } + + private ReservationRequest replaceNameIfEmpty(ReservationRequest request, LoginMember loginMember) { + String requestName = request.getName(); + if (requestName == null || requestName.isBlank()) { + return new ReservationRequest(loginMember.getName(), request.getDate(), request.getThemeId(), request.getTimeId()); + } + return request; + } private ReservationRequest replaceNameIfEmpty(ReservationRequest request, LoginMember loginMember) { @@ -28,12 +62,50 @@ private ReservationRequest replaceNameIfEmpty(ReservationRequest request, LoginM } public void deleteById(Long id) { - reservationDao.deleteById(id); + reservationRepository.deleteById(id); } public List findAll() { - return reservationDao.findAll().stream() - .map(it -> new ReservationResponse(it.getId(), it.getName(), it.getTheme().getName(), it.getDate(), it.getTime().getValue())) + return reservationRepository.findAll().stream() + .map(reservation -> new ReservationResponse( + reservation.getId(), + reservation.getName(), + reservation.getTheme().getName(), + reservation.getDate(), + reservation.getTime().getTime() + )) .toList(); } + + public List findMyReservation(LoginMember loginMembmer) { + List reservations = reservationRepository.findByMemberId(loginMembmer.getId()); + List waitings = waitingRepository.findWaitingsWithRankByMemberId(loginMembmer.getId()); + + List myReservationResponses = new ArrayList<>(); + reservations.forEach( + reservation -> myReservationResponses.add( + new MyReservationResponse( + reservation.getId(), + reservation.getTheme().getName(), + reservation.getDate(), + reservation.getTime().getTime(), + "예약" + ) + ) + ); + + waitings.forEach( + waitingWithRank -> { + Waiting waiting = waitingWithRank.getWaiting(); + myReservationResponses.add( + new MyReservationResponse( + waiting.getId(), + waiting.getTheme().getName(), + waiting.getDate(), + waiting.getTime().getTime(), + waitingWithRank.getRank() + "번째 예약대기")); + }); + + return myReservationResponses; + } } diff --git a/src/main/java/roomescape/theme/Theme.java b/src/main/java/roomescape/theme/Theme.java index 430a6239c..636fd469b 100644 --- a/src/main/java/roomescape/theme/Theme.java +++ b/src/main/java/roomescape/theme/Theme.java @@ -1,6 +1,13 @@ package roomescape.theme; +import jakarta.persistence.*; + +@Entity public class Theme { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "theme_id", nullable = false) private Long id; private String name; private String description; diff --git a/src/main/java/roomescape/theme/ThemeController.java b/src/main/java/roomescape/theme/ThemeController.java index 03bca41a6..318e1ab40 100644 --- a/src/main/java/roomescape/theme/ThemeController.java +++ b/src/main/java/roomescape/theme/ThemeController.java @@ -13,26 +13,28 @@ @RestController public class ThemeController { - private ThemeDao themeDao; + private final ThemeRepository themeRepository; - public ThemeController(ThemeDao themeDao) { - this.themeDao = themeDao; + public ThemeController(ThemeRepository themeRepository) { + this.themeRepository = themeRepository; } @PostMapping("/themes") public ResponseEntity createTheme(@RequestBody Theme theme) { - Theme newTheme = themeDao.save(theme); + Theme newTheme = themeRepository.save(theme); return ResponseEntity.created(URI.create("/themes/" + newTheme.getId())).body(newTheme); } @GetMapping("/themes") - public ResponseEntity> list() { - return ResponseEntity.ok(themeDao.findAll()); + public ResponseEntity> list() { + List themes = themeRepository.findAll(); + List response = themes.stream().map(theme -> new ThemeResponse(theme.getId(), theme.getName(), theme.getDescription())).toList(); + return ResponseEntity.ok(response); } @DeleteMapping("/themes/{id}") public ResponseEntity deleteTheme(@PathVariable Long id) { - themeDao.deleteById(id); + themeRepository.deleteById(id); return ResponseEntity.noContent().build(); } } diff --git a/src/main/java/roomescape/theme/ThemeDao.java b/src/main/java/roomescape/theme/ThemeDao.java deleted file mode 100644 index 945341d8d..000000000 --- a/src/main/java/roomescape/theme/ThemeDao.java +++ /dev/null @@ -1,41 +0,0 @@ -package roomescape.theme; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public class ThemeDao { - private JdbcTemplate jdbcTemplate; - - public ThemeDao(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public List findAll() { - return jdbcTemplate.query("SELECT * FROM theme where deleted = false", (rs, rowNum) -> new Theme( - rs.getLong("id"), - rs.getString("name"), - rs.getString("description") - )); - } - - public Theme save(Theme theme) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(connection -> { - var ps = connection.prepareStatement("INSERT INTO theme(name, description) VALUES (?, ?)", new String[]{"id"}); - ps.setString(1, theme.getName()); - ps.setString(2, theme.getDescription()); - return ps; - }, keyHolder); - - return new Theme(keyHolder.getKey().longValue(), theme.getName(), theme.getDescription()); - } - - public void deleteById(Long id) { - jdbcTemplate.update("UPDATE theme SET deleted = true WHERE id = ?", id); - } -} diff --git a/src/main/java/roomescape/theme/ThemeRepository.java b/src/main/java/roomescape/theme/ThemeRepository.java new file mode 100644 index 000000000..ea2011e9c --- /dev/null +++ b/src/main/java/roomescape/theme/ThemeRepository.java @@ -0,0 +1,14 @@ +package roomescape.theme; + +import org.springframework.data.repository.CrudRepository; + +import java.util.List; +import java.util.Optional; + +public interface ThemeRepository extends CrudRepository { + List findAll(); + + Optional findById(long id); + + void deleteById(long id); +} diff --git a/src/main/java/roomescape/theme/ThemeResponse.java b/src/main/java/roomescape/theme/ThemeResponse.java new file mode 100644 index 000000000..835612b2e --- /dev/null +++ b/src/main/java/roomescape/theme/ThemeResponse.java @@ -0,0 +1,5 @@ +package roomescape.theme; + +public record ThemeResponse(Long id, String name, String description) { + +} diff --git a/src/main/java/roomescape/time/ParticipationTime.java b/src/main/java/roomescape/time/ParticipationTime.java new file mode 100644 index 000000000..c57f52b07 --- /dev/null +++ b/src/main/java/roomescape/time/ParticipationTime.java @@ -0,0 +1,38 @@ +package roomescape.time; + +import jakarta.persistence.*; + +@Entity +public class ParticipationTime { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "time_id", nullable = false) + private Long id; + + @Column(nullable = false) + private String time; + + public ParticipationTime(Long id, String time) { + this.id = id; + this.time = time; + } + + public ParticipationTime(String time) { + this.time = time; + } + + public ParticipationTime() { + + } + + public Long getId() { + return id; + } + + public String getTime() { + return time; + } + + +} diff --git a/src/main/java/roomescape/time/ParticipationTimeController.java b/src/main/java/roomescape/time/ParticipationTimeController.java new file mode 100644 index 000000000..a22dc2278 --- /dev/null +++ b/src/main/java/roomescape/time/ParticipationTimeController.java @@ -0,0 +1,42 @@ +package roomescape.time; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; + +@RestController +public class ParticipationTimeController { + private ParticipationTimeService participationTimeService; + + public ParticipationTimeController(ParticipationTimeService participationTimeService) { + this.participationTimeService = participationTimeService; + } + + @GetMapping("/times") + public List list() { + return participationTimeService.findAll(); + } + + @PostMapping("/times") + public ResponseEntity create(@RequestBody ParticipationTime participationTime) { + if (participationTime.getTime() == null || participationTime.getTime().isEmpty()) { + throw new RuntimeException(); + } + + ParticipationTime newParticipationTime = participationTimeService.save(participationTime); + return ResponseEntity.created(URI.create("/times/" + newParticipationTime.getId())).body(newParticipationTime); + } + + @DeleteMapping("/times/{id}") + public ResponseEntity delete(@PathVariable Long id) { + participationTimeService.deleteById(id); + return ResponseEntity.noContent().build(); + } + + @GetMapping("/available-times") + public ResponseEntity> availableTimes(@RequestParam String date, @RequestParam Long themeId) { + return ResponseEntity.ok(participationTimeService.getAvailableTime(date, themeId)); + } +} diff --git a/src/main/java/roomescape/time/ParticipationTimeRepository.java b/src/main/java/roomescape/time/ParticipationTimeRepository.java new file mode 100644 index 000000000..99a12db46 --- /dev/null +++ b/src/main/java/roomescape/time/ParticipationTimeRepository.java @@ -0,0 +1,16 @@ +package roomescape.time; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface ParticipationTimeRepository extends CrudRepository { + Optional findById(Long id); + + List findAll(); + + +} diff --git a/src/main/java/roomescape/time/ParticipationTimeService.java b/src/main/java/roomescape/time/ParticipationTimeService.java new file mode 100644 index 000000000..695b906c8 --- /dev/null +++ b/src/main/java/roomescape/time/ParticipationTimeService.java @@ -0,0 +1,47 @@ +package roomescape.time; + +import org.springframework.stereotype.Service; +import roomescape.reservation.Reservation; +import roomescape.reservation.ReservationRepository; + +import java.util.List; + +@Service +public class ParticipationTimeService { + + private final ParticipationTimeRepository participationTimeRepository; + private final ReservationRepository reservationRepository; + + public ParticipationTimeService(final ParticipationTimeRepository participationTimeRepository, final ReservationRepository reservationRepository) { + this.participationTimeRepository = participationTimeRepository; + this.reservationRepository = reservationRepository; + } + + + public List getAvailableTime(String date, Long themeId) { + + List reservations = reservationRepository.findAllByDateAndThemeId(date, themeId); + List participationTimes = participationTimeRepository.findAll(); + + return participationTimes.stream() + .map(time -> new AvailableTime( + time.getId(), + time.getTime(), + reservations.stream() + .anyMatch(reservation -> reservation.getTime().getId().equals(time.getId())) + )) + .toList(); + } + + public List findAll() { + return participationTimeRepository.findAll(); + } + + public ParticipationTime save(ParticipationTime participationTime) { + return participationTimeRepository.save(participationTime); + } + + public void deleteById(Long id) { + participationTimeRepository.deleteById(id); + } +} diff --git a/src/main/java/roomescape/time/Time.java b/src/main/java/roomescape/time/Time.java deleted file mode 100644 index 008ed93cf..000000000 --- a/src/main/java/roomescape/time/Time.java +++ /dev/null @@ -1,27 +0,0 @@ -package roomescape.time; - -public class Time { - private Long id; - private String value; - - public Time(Long id, String value) { - this.id = id; - this.value = value; - } - - public Time(String value) { - this.value = value; - } - - public Time() { - - } - - public Long getId() { - return id; - } - - public String getValue() { - return value; - } -} diff --git a/src/main/java/roomescape/time/TimeController.java b/src/main/java/roomescape/time/TimeController.java deleted file mode 100644 index 2343114d1..000000000 --- a/src/main/java/roomescape/time/TimeController.java +++ /dev/null @@ -1,48 +0,0 @@ -package roomescape.time; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.net.URI; -import java.util.List; - -@RestController -public class TimeController { - private TimeService timeService; - - public TimeController(TimeService timeService) { - this.timeService = timeService; - } - - @GetMapping("/times") - public List