Skip to content

Commit 6c2cd87

Browse files
committed
feat[post]:게시글 투표 기능추가
1 parent 23ed98b commit 6c2cd87

File tree

2 files changed

+48
-8
lines changed

2 files changed

+48
-8
lines changed

backend/src/main/java/com/ai/lawyer/domain/poll/service/PollServiceImpl.java

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ public PollDto createPoll(PollCreateDto request, Long memberId) {
5959
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "회원 정보를 찾을 수 없습니다."));
6060
Post post = postRepository.findById(request.getPostId())
6161
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "게시글을 찾을 수 없습니다."));
62-
62+
// 이미 해당 게시글에 투표가 존재하는 경우 예외 처리
63+
if (post.getPoll() != null) {
64+
throw new ResponseStatusException(HttpStatus.CONFLICT, "이미 해당 게시글에 투표가 존재합니다.");
65+
}
6366
try {
6467
LocalDateTime now = java.time.LocalDateTime.now();
6568
LocalDateTime reservedCloseAt = request.getReservedCloseAt();
@@ -265,7 +268,7 @@ public PollDto updatePoll(Long pollId, PollUpdateDto pollUpdateDto) {
265268
pollOptionsRepository.deleteById(option.getPollItemsId());
266269
}
267270
}
268-
//추가/수정
271+
// 추가/수정
269272
for (var optionDto : pollUpdateDto.getPollOptions()) {
270273
if (optionDto.getPollItemsId() != null) {
271274
// update
@@ -288,6 +291,7 @@ public PollDto updatePoll(Long pollId, PollUpdateDto pollUpdateDto) {
288291
// 예약 종료 시간 수정
289292
LocalDateTime now = java.time.LocalDateTime.now();
290293
LocalDateTime reservedCloseAt = pollUpdateDto.getReservedCloseAt();
294+
System.out.println("DTO에서 받은 reservedCloseAt 값: " + reservedCloseAt);
291295
if (reservedCloseAt != null) {
292296
if (reservedCloseAt.isBefore(now.plusHours(1))) {
293297
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "예약 종료 시간은 현재로부터 최소 1시간 이후여야 합니다.");
@@ -296,6 +300,7 @@ public PollDto updatePoll(Long pollId, PollUpdateDto pollUpdateDto) {
296300
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "예약 종료 시간은 최대 7일 이내여야 합니다.");
297301
}
298302
poll.setReservedCloseAt(reservedCloseAt);
303+
System.out.println("poll에 저장된 reservedCloseAt 값: " + poll.getReservedCloseAt());
299304
}
300305
Poll updated = pollRepository.save(poll);
301306
return convertToDto(updated);
@@ -311,14 +316,49 @@ public void patchUpdatePoll(Long pollId, PollUpdateDto pollUpdateDto) {
311316
if (pollUpdateDto.getVoteTitle() != null) poll.setVoteTitle(pollUpdateDto.getVoteTitle());
312317
// 투표 항목 수정
313318
if (pollUpdateDto.getPollOptions() != null && pollUpdateDto.getPollOptions().size() == 2) {
314-
pollOptionsRepository.deleteAll(pollOptionsRepository.findByPoll_PollId(pollId));
315-
pollUpdateDto.getPollOptions().forEach(optionDto -> {
316-
PollOptions option = PollOptions.builder()
319+
List<PollOptions> existingOptions = pollOptionsRepository.findByPoll_PollId(pollId);
320+
List<Long> incomingIds = pollUpdateDto.getPollOptions().stream()
321+
.map(opt -> opt.getPollItemsId())
322+
.filter(id -> id != null)
323+
.toList();
324+
// 기존 옵션 중 전달받지 않은 id 삭제
325+
for (PollOptions option : existingOptions) {
326+
if (!incomingIds.contains(option.getPollItemsId())) {
327+
pollOptionsRepository.deleteById(option.getPollItemsId());
328+
}
329+
}
330+
// 추가/수정
331+
for (var optionDto : pollUpdateDto.getPollOptions()) {
332+
if (optionDto.getPollItemsId() != null) {
333+
PollOptions option = existingOptions.stream()
334+
.filter(o -> o.getPollItemsId().equals(optionDto.getPollItemsId()))
335+
.findFirst().orElse(null);
336+
if (option != null) {
337+
option.setOption(optionDto.getContent());
338+
pollOptionsRepository.save(option);
339+
}
340+
} else {
341+
PollOptions newOption = PollOptions.builder()
317342
.poll(poll)
318343
.option(optionDto.getContent())
319344
.build();
320-
pollOptionsRepository.save(option);
321-
});
345+
pollOptionsRepository.save(newOption);
346+
}
347+
}
348+
}
349+
// 예약 종료 시간 수정
350+
LocalDateTime now = java.time.LocalDateTime.now();
351+
LocalDateTime reservedCloseAt = pollUpdateDto.getReservedCloseAt();
352+
System.out.println("DTO에서 받은 reservedCloseAt 값: " + reservedCloseAt);
353+
if (reservedCloseAt != null) {
354+
if (reservedCloseAt.isBefore(now.plusHours(1))) {
355+
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "예약 종료 시간은 현재로부터 최소 1시간 이후여야 합니다.");
356+
}
357+
if (reservedCloseAt.isAfter(poll.getCreatedAt().plusDays(7))) {
358+
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "예약 종료 시간은 최대 7일 이내여야 합니다.");
359+
}
360+
poll.setReservedCloseAt(reservedCloseAt);
361+
System.out.println("poll에 저장된 reservedCloseAt 값: " + poll.getReservedCloseAt());
322362
}
323363
pollRepository.save(poll);
324364
}

backend/src/main/java/com/ai/lawyer/domain/post/controller/PostController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public ResponseEntity<ApiResponse<List<PostDetailDto>>> getPostsByMember(@PathVa
8787
@Operation(summary = "게시글 수정")
8888
@PutMapping("/{postId}")
8989
public ResponseEntity<ApiResponse<PostDetailDto>> updatePost(@PathVariable Long postId, @RequestBody PostUpdateDto postUpdateDto) {
90-
postService.patchUpdatePost(postId, postUpdateDto);
90+
postService.updatePost(postId, postUpdateDto);
9191
PostDetailDto updated = postService.getPostDetailById(postId);
9292
return ResponseEntity.ok(new ApiResponse<>(200, "게시글이 수정되었습니다.", updated));
9393
}

0 commit comments

Comments
 (0)