Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.time.LocalTime;

@Getter
@NoArgsConstructor
Expand All @@ -25,8 +25,8 @@ public class ScheduleAddRequest {
@Size(max = 100, message = "제목은 100자 이하여야 합니다.")
private String title;

@NotNull(message = "시작 일시는 필수입니다.")
private LocalDateTime startAt;
@NotNull(message = "시작 시간은 필수입니다.")
private LocalTime startAt;

@NotNull(message = "소요 시간(분)은 필수입니다.")
@Positive(message = "소요 시간은 양수여야 합니다.")
Expand All @@ -52,10 +52,6 @@ public class ScheduleAddRequest {
@NotBlank(message = "상세 정보는 필수입니다.")
private String details;

// 정렬 순서 (미지정 시 자동 계산)
@Positive(message = "정렬 순서는 양수여야 합니다.")
private Integer sequenceOrder;

// 교통 수단인 경우 사용
@Min(value = -90, message = "출발지 위도는 -90 이상이어야 합니다.")
@Max(value = 90, message = "출발지 위도는 90 이하여야 합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.time.LocalTime;

@Getter
@NoArgsConstructor
Expand All @@ -22,7 +22,7 @@ public class ScheduleUpdateRequest {
@Size(max = 100, message = "제목은 100자 이하여야 합니다.")
private String title;

private LocalDateTime startAt;
private LocalTime startAt;

@Positive(message = "소요 시간은 양수여야 합니다.")
private Integer duration;
Expand All @@ -43,10 +43,6 @@ public class ScheduleUpdateRequest {

private String details;

// 정렬 순서 (미지정 시 기존 값 유지)
@Positive(message = "정렬 순서는 양수여야 합니다.")
private Integer sequenceOrder;

// 교통 수단인 경우 사용
@Min(value = -90, message = "출발지 위도는 -90 이상이어야 합니다.")
@Max(value = 90, message = "출발지 위도는 90 이하여야 합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import lombok.Getter;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;


Expand Down Expand Up @@ -38,14 +39,13 @@ public static class ScheduleInfo {
private Long id;
private Schedule.ScheduleType scheduleType;
private String title;
private java.time.LocalDateTime startAt;
private LocalTime startAt;
private Integer duration;
private String location;
private Double locationLat;
private Double locationLon;
private Integer estimatedCost;
private String details;
private Integer sequenceOrder;
private Double startPlaceLat;
private Double startPlaceLon;
private Double endPlaceLat;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@
import lombok.Getter;

import java.time.LocalDateTime;
import java.time.LocalTime;

@Getter
@Builder
public class ScheduleResponse {
private Long id;
private Schedule.ScheduleType scheduleType;
private String title;
private LocalDateTime startAt;
private LocalTime startAt;
private Integer duration;
private String location;
private Double locationLat;
private Double locationLon;
private Integer estimatedCost;
private String details;
private Integer sequenceOrder;
// 교통 수단 정보
private Double startPlaceLat;
private Double startPlaceLon;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;
import java.time.LocalTime;


@Entity
Expand All @@ -32,7 +33,7 @@ public class Schedule {
private String title;

@Column(name = "start_at", nullable = false)
private LocalDateTime startAt;
private LocalTime startAt;

@Column(name = "duration", nullable = false)
private Integer duration;
Expand All @@ -53,9 +54,6 @@ public class Schedule {
@Column(name = "details", columnDefinition = "TEXT", nullable = false)
private String details;

@Column(name = "sequence_order", nullable = false)
private Integer sequenceOrder;

// 교통 수단 정보 (schedule_type = 'TRANSPORT'인 경우 사용)
@Column(name = "start_place_lat")
private Double startPlaceLat;
Expand Down Expand Up @@ -87,10 +85,9 @@ public class Schedule {

@Builder
public Schedule(Plan plan, ScheduleType scheduleType, String title,
LocalDateTime startAt, Integer duration,
LocalTime startAt, Integer duration,
String location, Double locationLat, Double locationLon,
Integer estimatedCost, String details,
Integer sequenceOrder,
Double startPlaceLat, Double startPlaceLon,
Double endPlaceLat, Double endPlaceLon,
Integer distance, TransportType transportType) {
Expand All @@ -104,7 +101,6 @@ public Schedule(Plan plan, ScheduleType scheduleType, String title,
this.locationLon = locationLon;
this.estimatedCost = estimatedCost;
this.details = details;
this.sequenceOrder = sequenceOrder;
this.startPlaceLat = startPlaceLat;
this.startPlaceLon = startPlaceLon;
this.endPlaceLat = endPlaceLat;
Expand All @@ -114,10 +110,9 @@ public Schedule(Plan plan, ScheduleType scheduleType, String title,
}

public void update(ScheduleType scheduleType, String title,
LocalDateTime startAt, Integer duration,
LocalTime startAt, Integer duration,
String location, Double locationLat, Double locationLon,
Integer estimatedCost, String details,
Integer sequenceOrder,
Double startPlaceLat, Double startPlaceLon,
Double endPlaceLat, Double endPlaceLon,
Integer distance, TransportType transportType) {
Expand All @@ -130,7 +125,6 @@ public void update(ScheduleType scheduleType, String title,
this.locationLon = locationLon;
this.estimatedCost = estimatedCost;
this.details = details;
this.sequenceOrder = sequenceOrder;
this.startPlaceLat = startPlaceLat;
this.startPlaceLon = startPlaceLon;
this.endPlaceLat = endPlaceLat;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
public interface ScheduleRepository extends JpaRepository<Schedule, Long> {

/**
* 특정 Plan의 모든 일정을 순서대로 조회
* 특정 Plan의 모든 일정을 시작 시간 순서대로 조회
*/
List<Schedule> findByPlan_PlanIdOrderBySequenceOrderAsc(Long planId);
List<Schedule> findByPlan_PlanIdOrderByStartAtAsc(Long planId);

/**
* 특정 Plan에 속한 Schedule의 개수 조회 (다음 순서 계산용)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,9 @@ public PlanDetailResponse getPlanDetail(Long planId, User user) {
.build())
.collect(Collectors.toList());

// 타임라인 형태로 일정 정렬 (sequenceOrder 기준) - Repository 메서드 사용으로 일관성 향상
// 타임라인 형태로 일정 정렬 (startAt 기준)
List<Schedule> sortedSchedules = scheduleRepository
.findByPlan_PlanIdOrderBySequenceOrderAsc(planId);
.findByPlan_PlanIdOrderByStartAtAsc(planId);

List<PlanDetailResponse.ScheduleInfo> schedules = sortedSchedules.stream()
.map(item -> PlanDetailResponse.ScheduleInfo.builder()
Expand All @@ -144,7 +144,6 @@ public PlanDetailResponse getPlanDetail(Long planId, User user) {
.locationLon(item.getLocationLon())
.estimatedCost(item.getEstimatedCost())
.details(item.getDetails())
.sequenceOrder(item.getSequenceOrder())
.startPlaceLat(item.getStartPlaceLat())
.startPlaceLon(item.getStartPlaceLon())
.endPlaceLat(item.getEndPlaceLat())
Expand Down Expand Up @@ -256,13 +255,6 @@ public ScheduleResponse addSchedule(Long planId, User user, ScheduleAddRequest r
}
}

// 순서가 지정되지 않은 경우, 마지막 순서 + 1로 설정
Integer sequenceOrder = request.getSequenceOrder();
if (sequenceOrder == null) {
long count = scheduleRepository.countByPlan_PlanId(planId);
sequenceOrder = (int) count + 1;
}

Schedule schedule = Schedule.builder()
.plan(plan)
.scheduleType(request.getScheduleType())
Expand All @@ -274,7 +266,6 @@ public ScheduleResponse addSchedule(Long planId, User user, ScheduleAddRequest r
.locationLon(request.getLocationLon())
.estimatedCost(request.getEstimatedCost())
.details(request.getDetails())
.sequenceOrder(sequenceOrder)
.startPlaceLat(request.getStartPlaceLat())
.startPlaceLon(request.getStartPlaceLon())
.endPlaceLat(request.getEndPlaceLat())
Expand Down Expand Up @@ -302,7 +293,7 @@ public ScheduleListResponse getSchedules(Long planId, User user) {
findPlanWithParticipantCheck(planId, user);

List<Schedule> schedules = scheduleRepository
.findByPlan_PlanIdOrderBySequenceOrderAsc(planId);
.findByPlan_PlanIdOrderByStartAtAsc(planId);

List<ScheduleResponse> scheduleResponses = schedules.stream()
.map(this::toScheduleResponse)
Expand Down Expand Up @@ -420,7 +411,6 @@ public ScheduleResponse updateSchedule(Long planId, Long scheduleId, User user,
request.getLocationLon() != null ? request.getLocationLon() : schedule.getLocationLon(),
request.getEstimatedCost() != null ? request.getEstimatedCost() : schedule.getEstimatedCost(),
request.getDetails() != null ? request.getDetails() : schedule.getDetails(),
request.getSequenceOrder() != null ? request.getSequenceOrder() : schedule.getSequenceOrder(),
request.getStartPlaceLat() != null ? request.getStartPlaceLat() : schedule.getStartPlaceLat(),
request.getStartPlaceLon() != null ? request.getStartPlaceLon() : schedule.getStartPlaceLon(),
request.getEndPlaceLat() != null ? request.getEndPlaceLat() : schedule.getEndPlaceLat(),
Expand Down Expand Up @@ -450,39 +440,8 @@ public ScheduleDeleteResponse deleteSchedule(Long planId, Long scheduleId, User
.findByScheduleIdAndPlan_PlanId(scheduleId, planId)
.orElseThrow(() -> new BusinessException(PlanErrorCode.SCHEDULE_NOT_FOUND));

Integer deletedSequenceOrder = schedule.getSequenceOrder();
scheduleRepository.delete(schedule);

// 삭제된 일정 이후의 일정들의 sequenceOrder를 1씩 감소시켜 재정렬
if (deletedSequenceOrder != null) {
List<Schedule> remainingSchedules = scheduleRepository
.findByPlan_PlanIdOrderBySequenceOrderAsc(planId);

// 삭제된 순서보다 큰 일정들만 업데이트
remainingSchedules.stream()
.filter(s -> s.getSequenceOrder() != null && s.getSequenceOrder() > deletedSequenceOrder)
.forEach(remainingSchedule -> {
remainingSchedule.update(
remainingSchedule.getScheduleType(),
remainingSchedule.getTitle(),
remainingSchedule.getStartAt(),
remainingSchedule.getDuration(),
remainingSchedule.getLocation(),
remainingSchedule.getLocationLat(),
remainingSchedule.getLocationLon(),
remainingSchedule.getEstimatedCost(),
remainingSchedule.getDetails(),
remainingSchedule.getSequenceOrder() - 1,
remainingSchedule.getStartPlaceLat(),
remainingSchedule.getStartPlaceLon(),
remainingSchedule.getEndPlaceLat(),
remainingSchedule.getEndPlaceLon(),
remainingSchedule.getDistance(),
remainingSchedule.getTransportType()
);
});
}

return ScheduleDeleteResponse.builder()
.scheduleId(scheduleId)
.build();
Expand Down Expand Up @@ -566,7 +525,6 @@ private ScheduleResponse toScheduleResponse(Schedule schedule) {
.locationLon(schedule.getLocationLon())
.estimatedCost(schedule.getEstimatedCost())
.details(schedule.getDetails())
.sequenceOrder(schedule.getSequenceOrder())
.startPlaceLat(schedule.getStartPlaceLat())
.startPlaceLon(schedule.getStartPlaceLon())
.endPlaceLat(schedule.getEndPlaceLat())
Expand Down