Skip to content

Commit 40f3915

Browse files
committed
fix 공고 상세 조회하기에서 디자이너의 공고 수정/삭제 가능 여부 필드 반환
1 parent e7b0694 commit 40f3915

File tree

5 files changed

+78
-7
lines changed

5 files changed

+78
-7
lines changed

src/main/java/modelly/modelly_be/domain/recruitment/controller/swagger/GuestRecruitmentSwagger.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ public interface GuestRecruitmentSwagger {
2323
@Operation(summary = "공고 상세 조회하기", description = """
2424
공고 상세 조회 시 사용하는 API입니다. (로그인 필요X)
2525
\n
26-
`hasPendingReservation` : 확정 대기 중인 예약 존재 유무 (true: 유, false: 무)
26+
`modelHasPendingReservation` : 모델이 신청한 확정 대기 중인 예약 존재 유무 (true: 유, false: 무)\n
27+
`designerHasPendingReservation` : 해당 공고의 확정 대기 중인 예약 존재 유무 (true: 유, false: 무)\n
28+
`designerHasConfirmedReservation` : 해당 공고의 확정된 예약 중 아직 진행하지 않은 예약 존재 유무 (true: 유, false: 무)\n
29+
`canModify` : 디자이너의 해당 공고 수정/삭제 가능 여부 \n
2730
""")
2831
ApiResponse<GuestRecruitmentResponseDto> getRecruitment(@AuthenticationPrincipal AuthDetails authDetails, @PathVariable Long recruitmentId);
2932

src/main/java/modelly/modelly_be/domain/recruitment/dto/response/GuestRecruitmentResponseDto.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ public record GuestRecruitmentResponseDto(
2727
String etc,
2828
Long reviewCount,
2929
double averageRating,
30-
boolean hasPendingReservation
30+
boolean modelHasPendingReservation,
31+
boolean designerHasPendingReservation,
32+
boolean designerHasConfirmedReservation,
33+
boolean canModify
3134
) {
3235

33-
public static GuestRecruitmentResponseDto of(DesignerResponseDto designerProfile, Recruitment recruitment, AverageReview averageReview, boolean isLiked, boolean hasPendingReservation) {
36+
public static GuestRecruitmentResponseDto of(DesignerResponseDto designerProfile, Recruitment recruitment, AverageReview averageReview, boolean isLiked, boolean modelHasPendingReservation, boolean designerHasPendingReservation, boolean designerHasConfirmedReservation, boolean canModify) {
3437
List<RecruitmentSchedule> schedules = recruitment.getRecruitmentDates().stream()
3538
.map(date -> RecruitmentSchedule.of(date.getDate(),
3639
date.getRecruitmentTimes().stream()
@@ -66,7 +69,10 @@ public static GuestRecruitmentResponseDto of(DesignerResponseDto designerProfile
6669
recruitment.getEtc(),
6770
averageReview.totalCount(),
6871
averageReview.averageRating(),
69-
hasPendingReservation
72+
modelHasPendingReservation,
73+
designerHasPendingReservation,
74+
designerHasConfirmedReservation,
75+
canModify
7076
);
7177
}
7278
}

src/main/java/modelly/modelly_be/domain/recruitment/service/RecruitmentService.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ public GuestRecruitmentResponseDto getByIdWithDesigner(Long userId, Long recruit
8787
AverageReview averageReview = reviewService.calculateRating(recruitment.getDesigner());
8888

8989
boolean isLiked = false;
90-
boolean hasPendingReservation = false;
90+
boolean modelHasPendingReservation = false;
91+
boolean designerHasPendingReservation = false;
92+
boolean designerHasConfirmedReservation = false;
9193

9294
if (userId != null){
9395

@@ -99,22 +101,37 @@ public GuestRecruitmentResponseDto getByIdWithDesigner(Long userId, Long recruit
99101
isLiked = recruitmentLikeService.existsByModelAndRecruitment(model, recruitment);
100102

101103
// 이미 예약 신청(PENDING)을 했는지 확인
102-
hasPendingReservation =
104+
modelHasPendingReservation =
103105
reservationService.hasReservationByModelAndRecruitment(
104106
model.getId(),
105107
recruitment.getId(),
106108
List.of(ReservationStatus.RESERVATION_PENDING)
107109
);
110+
108111
}
112+
// DESIGNER 기준 (공고 전체)
113+
designerHasPendingReservation =
114+
reservationService.hasPendingReservationByRecruitment(
115+
recruitment.getId()
116+
);
117+
118+
designerHasConfirmedReservation =
119+
reservationService.hasOngoingConfirmedReservation(
120+
recruitment.getId()
121+
);
109122

110123
}
124+
boolean canModify = !designerHasConfirmedReservation && !designerHasPendingReservation;
111125

112126
return GuestRecruitmentResponseDto.of(
113127
DesignerResponseDto.from(recruitment.getDesigner()),
114128
recruitment,
115129
averageReview,
116130
isLiked,
117-
hasPendingReservation
131+
modelHasPendingReservation,
132+
designerHasPendingReservation,
133+
designerHasConfirmedReservation,
134+
canModify
118135
);
119136
}
120137

src/main/java/modelly/modelly_be/domain/reservation/repository/ReservationRepository.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,4 +166,27 @@ List<Long> findRecruitmentIdsWithOngoingConfirmed(
166166
@Param("today") LocalDate today,
167167
@Param("now") LocalTime now
168168
);
169+
170+
// 해당 공고의 status인 예약이 endtime 이후인지
171+
@Query("""
172+
select case when count(r) > 0 then true else false end
173+
from Reservation r
174+
where r.recruitment.id = :recruitmentId
175+
and r.status = :status
176+
and (
177+
r.date > :today
178+
or (r.date = :today and r.endTime > :now)
179+
)
180+
""")
181+
boolean existsOngoingConfirmedReservation(
182+
@Param("recruitmentId") Long recruitmentId,
183+
@Param("status") ReservationStatus status,
184+
@Param("today") LocalDate today,
185+
@Param("now") LocalTime now
186+
);
187+
188+
boolean existsByRecruitment_IdAndStatus(
189+
Long recruitmentId,
190+
ReservationStatus status
191+
);
169192
}

src/main/java/modelly/modelly_be/domain/reservation/service/ReservationService.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,4 +813,26 @@ public boolean hasReservationByModelAndRecruitment(
813813
statuses
814814
);
815815
}
816+
817+
// 확정된 예약 중 끝난 예약이 있는지
818+
@Transactional(readOnly = true)
819+
public boolean hasOngoingConfirmedReservation(Long recruitmentId) {
820+
LocalDate today = LocalDate.now();
821+
LocalTime now = LocalTime.now();
822+
823+
return reservationRepository.existsOngoingConfirmedReservation(
824+
recruitmentId,
825+
ReservationStatus.RESERVATION_CONFIRMED,
826+
today,
827+
now
828+
);
829+
}
830+
831+
@Transactional(readOnly = true)
832+
public boolean hasPendingReservationByRecruitment(Long recruitmentId) {
833+
return reservationRepository.existsByRecruitment_IdAndStatus(
834+
recruitmentId,
835+
ReservationStatus.RESERVATION_PENDING
836+
);
837+
}
816838
}

0 commit comments

Comments
 (0)