2121import com .ai .lawyer .domain .poll .dto .PollOptionDto ;
2222import com .ai .lawyer .domain .poll .dto .PollVoteDto ;
2323import com .ai .lawyer .domain .poll .dto .PollUpdateDto ;
24+ import org .springframework .data .domain .Pageable ;
2425
2526@ Service
2627@ Transactional
@@ -46,9 +47,7 @@ public PollDto getPoll(Long pollId) {
4647
4748 @ Override
4849 public List <PollOptions > getPollOptions (Long pollId ) {
49- return pollOptionsRepository .findAll ().stream ()
50- .filter (opt -> opt .getPoll ().getPollId ().equals (pollId ))
51- .toList ();
50+ return pollOptionsRepository .findByPoll_PollId (pollId );
5251 }
5352
5453 @ Override
@@ -91,9 +90,7 @@ public List<PollStatics> getPollStatics(Long pollId) {
9190 if (!pollRepository .existsById (pollId )) {
9291 throw new ResponseStatusException (HttpStatus .NOT_FOUND , "해당 투표가 존재하지 않습니다." );
9392 }
94- return pollStaticsRepository .findAll ().stream ()
95- .filter (stat -> stat .getPoll ().getPollId ().equals (pollId ))
96- .toList ();
93+ return pollStaticsRepository .findByPoll_PollId (pollId );
9794 }
9895
9996 @ Override
@@ -128,7 +125,17 @@ public void deletePoll(Long pollId) {
128125 public PollDto getTopPollByStatus (PollDto .PollStatus status ) {
129126 List <Object []> result = pollVoteRepository .findTopPollByStatus (Poll .PollStatus .valueOf (status .name ()));
130127 if (result .isEmpty ()) {
131- throw new ResponseStatusException (HttpStatus .NOT_FOUND , "해당 상태의 투표가 없습니다." );
128+ // 종료된 투표가 없으면 빈 PollDto 반환
129+ return PollDto .builder ()
130+ .pollId (null )
131+ .postId (null )
132+ .voteTitle (null )
133+ .status (status )
134+ .createdAt (null )
135+ .closedAt (null )
136+ .pollOptions (java .util .Collections .emptyList ())
137+ .totalVoteCount (0L )
138+ .build ();
132139 }
133140 Long pollId = (Long ) result .get (0 )[0 ];
134141 return getPoll (pollId );
@@ -157,16 +164,39 @@ public PollDto updatePoll(Long pollId, PollUpdateDto pollUpdateDto) {
157164 throw new ResponseStatusException (HttpStatus .FORBIDDEN , "투표가 진행된 투표는 수정할 수 없습니다." );
158165 }
159166 if (pollUpdateDto .getVoteTitle () != null ) poll .setVoteTitle (pollUpdateDto .getVoteTitle ());
160- // 투표 항목 수정: 기존 항목 삭제 후 새로 저장
161- if (pollUpdateDto .getPollOptions () != null && pollUpdateDto .getPollOptions ().size () == 2 ) {
162- pollOptionsRepository .deleteAll (pollOptionsRepository .findByPoll_PollId (pollId ));
163- pollUpdateDto .getPollOptions ().forEach (optionDto -> {
164- PollOptions option = PollOptions .builder ()
167+ // 투표 항목 수정
168+ if (pollUpdateDto .getPollOptions () != null ) {
169+ List <PollOptions > existingOptions = pollOptionsRepository .findByPoll_PollId (pollId );
170+ // 전달받은 id 목록
171+ List <Long > incomingIds = pollUpdateDto .getPollOptions ().stream ()
172+ .map (opt -> opt .getPollItemsId ())
173+ .filter (id -> id != null )
174+ .toList ();
175+ // 기존 옵션 중 전달받지 않은 id 삭제
176+ for (PollOptions option : existingOptions ) {
177+ if (!incomingIds .contains (option .getPollItemsId ())) {
178+ pollOptionsRepository .deleteById (option .getPollItemsId ());
179+ }
180+ }
181+ //추가/수정
182+ for (var optionDto : pollUpdateDto .getPollOptions ()) {
183+ if (optionDto .getPollItemsId () != null ) {
184+ // update
185+ PollOptions option = existingOptions .stream ()
186+ .filter (o -> o .getPollItemsId ().equals (optionDto .getPollItemsId ()))
187+ .findFirst ().orElse (null );
188+ if (option != null ) {
189+ option .setOption (optionDto .getContent ());
190+ pollOptionsRepository .save (option );
191+ }
192+ } else {
193+ PollOptions newOption = PollOptions .builder ()
165194 .poll (poll )
166195 .option (optionDto .getContent ())
167196 .build ();
168- pollOptionsRepository .save (option );
169- });
197+ pollOptionsRepository .save (newOption );
198+ }
199+ }
170200 }
171201 Poll updated = pollRepository .save (poll );
172202 return convertToDto (updated );
@@ -180,7 +210,7 @@ public void patchUpdatePoll(Long pollId, PollUpdateDto pollUpdateDto) {
180210 throw new ResponseStatusException (HttpStatus .FORBIDDEN , "투표가 이미 진행된 투표는 수정할 수 없습니다." );
181211 }
182212 if (pollUpdateDto .getVoteTitle () != null ) poll .setVoteTitle (pollUpdateDto .getVoteTitle ());
183- // 투표 항목 수정: 기존 항목 삭제 후 새로 저장
213+ // 투표 항목 수정
184214 if (pollUpdateDto .getPollOptions () != null && pollUpdateDto .getPollOptions ().size () == 2 ) {
185215 pollOptionsRepository .deleteAll (pollOptionsRepository .findByPoll_PollId (pollId ));
186216 pollUpdateDto .getPollOptions ().forEach (optionDto -> {
@@ -301,6 +331,31 @@ public PollDto createPoll(PollCreateDto request, Long memberId) {
301331 }
302332 }
303333
334+ @ Override
335+ public List <PollDto > getPollsByStatus (PollDto .PollStatus status ) {
336+ List <Poll > polls = pollRepository .findAll ().stream ()
337+ .filter (p -> p .getStatus ().name ().equals (status .name ()))
338+ .toList ();
339+ List <PollDto > pollDtos = new java .util .ArrayList <>();
340+ for (Poll poll : polls ) {
341+ pollDtos .add (convertToDto (poll ));
342+ }
343+ return pollDtos ;
344+ }
345+
346+ @ Override
347+ public List <PollDto > getTopNPollsByStatus (PollDto .PollStatus status , int n ) {
348+ Pageable pageable = org .springframework .data .domain .PageRequest .of (0 , n );
349+ List <Object []> result = pollVoteRepository .findTopNPollByStatus (
350+ com .ai .lawyer .domain .poll .entity .Poll .PollStatus .valueOf (status .name ()), pageable );
351+ List <PollDto > pollDtos = new java .util .ArrayList <>();
352+ for (Object [] row : result ) {
353+ Long pollId = (Long ) row [0 ];
354+ pollDtos .add (getPoll (pollId ));
355+ }
356+ return pollDtos ;
357+ }
358+
304359 private PollDto convertToDto (Poll poll ) {
305360 List <PollOptions > options = pollOptionsRepository .findByPoll_PollId (poll .getPollId ());
306361 List <PollOptionDto > optionDtos = new ArrayList <>();
0 commit comments