@@ -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 }
0 commit comments