Skip to content

Commit

Permalink
Merge pull request #182 from urinaner/refactor/179
Browse files Browse the repository at this point in the history
[BE] [REFACTOR] 예약 구현 리펙토링
  • Loading branch information
2Jin1031 authored Dec 4, 2024
2 parents dbd933e + b0f2da4 commit 4990bb6
Show file tree
Hide file tree
Showing 37 changed files with 621 additions and 1,303 deletions.
351 changes: 107 additions & 244 deletions backend/backup.sql

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.example.backend.common.utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class TimeParsingUtils {

public static LocalDateTime formatterLocalDateTime(String time) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
return LocalDateTime.parse(time, formatter);
}

public static String formatterString(LocalDateTime time) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
return time.format(formatter);
}
}
Original file line number Diff line number Diff line change
@@ -1,50 +1,87 @@
package org.example.backend.reservation.controller;

import java.util.List;
import lombok.RequiredArgsConstructor;
import org.example.backend.reservation.domain.ReservationStatus;
import lombok.extern.slf4j.Slf4j;
import org.example.backend.reservation.domain.dto.ReservationReqDto;
import org.example.backend.reservation.domain.dto.ReservationResDto;
import org.example.backend.reservation.service.ReservationService;
import org.example.backend.user.domain.entity.User;
import org.example.backend.user.exception.UserException;
import org.example.backend.user.exception.UserExceptionType;
import org.example.backend.user.repository.UserRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/reservations")
@RequestMapping("/api/room")
public class ReservationController {
private final ReservationService reservationService;
private final UserRepository userRepository;

@PostMapping
public ResponseEntity<ReservationResDto> createReservation(@RequestBody ReservationReqDto reqDto) {
ReservationResDto resDto = reservationService.createReservation(reqDto);
return ResponseEntity.ok(resDto);
@PostMapping("/{roomId}/reservation")
public ResponseEntity<List<ReservationResDto>> createReservation(
@PathVariable(value = "roomId") Long roomId,
@RequestBody ReservationReqDto reqDto) {
User user = userRepository.findById(1L)
.orElseThrow(() -> new UserException(UserExceptionType.NOT_FOUND_USER));
log.debug("Reservation creation request received: {}", reqDto);
try {
List<ReservationResDto> resDtos = reservationService.createReservation(roomId, reqDto, user);
log.debug("Reservation created successfully: {}", resDtos);
return ResponseEntity.ok(resDtos);
} catch (Exception e) {
log.error("Error during reservation creation", e);
throw e;
}
}

@GetMapping
public ResponseEntity<List<ReservationResDto>> getAllReservations() {
List<ReservationResDto> reservations = reservationService.getAllReservations();

@GetMapping("/{roomId}/reservation")
public ResponseEntity<List<ReservationResDto>> getReservationsByRoomAndDate(
@PathVariable(name = "roomId") Long roomId,
@RequestParam(value = "date") String date
) {
List<ReservationResDto> reservations = reservationService.getReservationsByRoomAndDate(roomId, date);
return ResponseEntity.ok(reservations);
}

@GetMapping("/{reservationId}")
public ResponseEntity<ReservationResDto> getReservation(@PathVariable(value = "reservationId") Long id) {
ReservationResDto resDto = reservationService.getReservation(id);
return ResponseEntity.ok(resDto);
@GetMapping("/{roomId}/reservation/month")
public ResponseEntity<List<ReservationResDto>> getReservationsByRoomAndMonth(
@PathVariable(value = "roomId") Long roomId,
@RequestParam(required = false) String yearMonth) {
List<ReservationResDto> reservations;
if (yearMonth == null) {
reservations = reservationService.getCurrentMonthReservations(roomId);
} else {
reservations = reservationService.getMonthReservations(roomId, yearMonth);
}
return ResponseEntity.ok(reservations);
}

@PatchMapping("/{reservationId}/status")
public ResponseEntity<ReservationResDto> updateReservationStatus(
@PathVariable(value = "reservationId") Long id,
@RequestParam(value = "status") ReservationStatus status) {
ReservationResDto resDto = reservationService.updateReservationStatus(id, status);

@GetMapping("/{roomId}/reservation/{reservationId}")
public ResponseEntity<ReservationResDto> getReservation(
@PathVariable(value = "roomId") Long roomId,
@PathVariable(value = "reservationId") Long reservationId) {
ReservationResDto resDto = reservationService.getReservation(reservationId);
return ResponseEntity.ok(resDto);
}

@DeleteMapping("/{reservationId}")
public ResponseEntity<Void> deleteReservation(@PathVariable(value = "reservationId") Long id) {
reservationService.deleteReservation(id);
@DeleteMapping("/{roomId}/reservation/{reservationId}")
public ResponseEntity<Void> deleteReservation(
@PathVariable(value = "roomId") Long roomId,
@PathVariable(value = "reservationId") Long reservationId) {
reservationService.deleteReservation(reservationId);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.example.backend.reservation.domain;

public enum RepetitionType {
DAILY("단일 일정"),
WEEKLY("주간 반복")
;

private final String description;

RepetitionType(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.backend.common.domain.BaseEntity;
import org.example.backend.common.utils.TimeParsingUtils;
import org.example.backend.reservation.domain.dto.ReservationReqDto;
import org.example.backend.seminarRoom.domain.SeminarRoom;
import org.example.backend.room.domain.Room;
import org.example.backend.user.domain.entity.User;

@Entity
@Getter
Expand All @@ -44,49 +46,39 @@ public class Reservation extends BaseEntity {
private String etc;

@Enumerated(EnumType.STRING)
@Column(name = "status")
private ReservationStatus status;
@Column(name = "repetition_type")
private RepetitionType repetitionType;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "seminar_room_id")
private SeminarRoom seminarRoom;
@JoinColumn(name = "room_id")
private Room room;

@Column(name = "user_id")
private Long userId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

@Builder
private Reservation(LocalDateTime startTime, LocalDateTime endTime, ReservationPurpose purpose,
String etc, ReservationStatus status, SeminarRoom seminarRoom, Long userId) {
String etc, RepetitionType repetitionType, Room room, User user) {
this.startTime = startTime;
this.endTime = endTime;
this.purpose = purpose;
this.etc = etc;
this.status = status;
this.seminarRoom = seminarRoom;
this.userId = userId;
this.repetitionType = repetitionType;
this.room = room;
this.user = user;
}

public static Reservation of(ReservationReqDto dto, SeminarRoom seminarRoom) {
public static Reservation of(ReservationReqDto dto, Room room, User user) {
return Reservation.builder()
.startTime(dto.getStartTime())
.endTime(dto.getEndTime())
.purpose(dto.getPurpose())
.startTime(TimeParsingUtils.formatterLocalDateTime(dto.getStartTime()))
.endTime(TimeParsingUtils.formatterLocalDateTime(dto.getEndTime()))
.purpose(ReservationPurpose.valueOf(dto.getDefaultPurpose()))
.etc(dto.getEtc())
.status(ReservationStatus.APPROVED)
.seminarRoom(seminarRoom)
.userId(dto.getUserId())
.repetitionType(RepetitionType.valueOf(dto.getRepetitionType()))
.room(room)
.user(user)
.build();
}

public void update(ReservationReqDto dto, SeminarRoom seminarRoom) {
this.startTime = dto.getStartTime();
this.endTime = dto.getEndTime();
this.purpose = dto.getPurpose();
this.etc = dto.getEtc();
this.seminarRoom = seminarRoom;
}

public void updateStatus(ReservationStatus status) {
this.status = status;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,43 +1,50 @@
package org.example.backend.reservation.domain.dto;


import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.backend.reservation.domain.ReservationPurpose;
import org.example.backend.common.utils.TimeParsingUtils;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class ReservationReqDto {
private LocalDateTime startTime;
private LocalDateTime endTime;
private ReservationPurpose purpose;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private String startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private String endTime;
private String purpose;
private String etc;
private Long seminarRoomId;
private Long userId;
private String repetitionType;

@Builder
private ReservationReqDto(LocalDateTime startTime, LocalDateTime endTime,
ReservationPurpose purpose, String etc, Long seminarRoomId, Long userId) {
private ReservationReqDto(String startTime, String endTime,
String purpose, String etc, String repetitionType) {
this.startTime = startTime;
this.endTime = endTime;
this.purpose = purpose;
this.etc = etc;
this.seminarRoomId = seminarRoomId;
this.userId = userId;
this.repetitionType = repetitionType;
}

public static ReservationReqDto of(LocalDateTime startTime, LocalDateTime endTime,
ReservationPurpose purpose, String etc, Long seminarRoomId, Long userId) {
String purpose, String repetitionType, String etc) {
return ReservationReqDto.builder()
.startTime(startTime)
.endTime(endTime)
.startTime(TimeParsingUtils.formatterString(startTime))
.endTime(TimeParsingUtils.formatterString(endTime))
.purpose(purpose)
.etc(etc)
.seminarRoomId(seminarRoomId)
.userId(userId)
.repetitionType(repetitionType)
.build();
}

public boolean isWeeklyReservation() {
return !startTime.equals(endTime);
}

public String getDefaultPurpose() {
return (purpose == null || purpose.isBlank()) ? "CLASS" : purpose;
}
}
Original file line number Diff line number Diff line change
@@ -1,50 +1,52 @@
package org.example.backend.reservation.domain.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.backend.common.utils.TimeParsingUtils;
import org.example.backend.reservation.domain.Reservation;
import org.example.backend.reservation.domain.ReservationPurpose;
import org.example.backend.reservation.domain.ReservationStatus;
import java.time.LocalDateTime;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class ReservationResDto {
private Long id;
private LocalDateTime startTime;
private LocalDateTime endTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private String startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private String endTime;
private ReservationPurpose purpose;
private String etc;
private ReservationStatus status;
private String seminarRoomName;
private String repetitionType;
private Long roomId;
private Long userId;

@Builder
private ReservationResDto(Long id, LocalDateTime startTime, LocalDateTime endTime,
ReservationPurpose purpose, String etc, ReservationStatus status,
String seminarRoomName, Long userId) {
private ReservationResDto(Long id, String startTime, String endTime,
ReservationPurpose purpose, String etc, String repetitionType,
Long roomId, Long userId) {
this.id = id;
this.startTime = startTime;
this.endTime = endTime;
this.purpose = purpose;
this.etc = etc;
this.status = status;
this.seminarRoomName = seminarRoomName;
this.repetitionType = repetitionType;
this.roomId = roomId;
this.userId = userId;
}

public static ReservationResDto of(Reservation reservation) {
return ReservationResDto.builder()
.id(reservation.getId())
.startTime(reservation.getStartTime())
.endTime(reservation.getEndTime())
.startTime(TimeParsingUtils.formatterString(reservation.getStartTime()))
.endTime(TimeParsingUtils.formatterString(reservation.getEndTime()))
.purpose(reservation.getPurpose())
.etc(reservation.getEtc())
.status(reservation.getStatus())
.seminarRoomName(reservation.getSeminarRoom().getName())
.userId(reservation.getUserId())
.repetitionType(reservation.getRepetitionType().name())
.roomId(reservation.getRoom().getId())
.userId(reservation.getUser().getId())
.build();
}
}
Loading

0 comments on commit 4990bb6

Please sign in to comment.