Skip to content

Commit 953a22d

Browse files
authored
Merge pull request #343 from prgrms-web-devcourse-final-project/feat/22-post
Fix[poll]:Long memberId
2 parents 6ad58fa + 2e04a63 commit 953a22d

File tree

7 files changed

+100
-22
lines changed

7 files changed

+100
-22
lines changed

backend/src/main/java/com/ai/lawyer/domain/poll/entity/PollVote.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@ public class PollVote {
2424
// Member와 OAuth2Member 모두 지원하기 위해 FK 제약 조건 제거
2525
// 애플리케이션 레벨에서 AuthUtil로 참조 무결성 보장
2626
// foreignKey 제약조건 비활성화 (ConstraintMode.NO_CONSTRAINT)
27-
@ManyToOne(fetch = FetchType.LAZY)
28-
@JoinColumn(name = "member_id", nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
29-
private Member member;
27+
@Column(name = "member_id", nullable = false)
28+
private Long memberId;
3029

3130
@ManyToOne(fetch = FetchType.LAZY)
3231
@JoinColumn(name = "poll_items_id", nullable = false, foreignKey = @ForeignKey(name = "FK_POLLVOTE_POLLOPTIONS"))

backend/src/main/java/com/ai/lawyer/domain/poll/repository/PollVoteRepository.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,20 @@
1212
import java.util.Optional;
1313

1414
public interface PollVoteRepository extends JpaRepository<PollVote, Long>, PollVoteRepositoryCustom {
15-
Optional<PollVote> findByMember_MemberIdAndPoll_PollId(Long memberId, Long pollId);
16-
void deleteByMember_MemberIdAndPoll_PollId(Long memberId, Long pollId);
17-
List<PollVote> findByMember_MemberIdAndPollOptions_PollItemsId(Long memberId, Long pollItemsId);
18-
List<PollVote> findByMember_MemberId(Long memberId);
15+
Optional<PollVote> findByMemberIdAndPoll_PollId(Long memberId, Long pollId);
16+
void deleteByMemberIdAndPoll_PollId(Long memberId, Long pollId);
17+
List<PollVote> findByMemberIdAndPollOptions_PollItemsId(Long memberId, Long pollItemsId);
18+
List<PollVote> findByMemberId(Long memberId);
1919

2020
/**
2121
* member_id로 투표 내역 삭제 (회원 탈퇴 시 사용)
2222
* Member와 OAuth2Member 모두 같은 member_id 공간을 사용하므로 Long 타입으로 삭제
2323
*/
2424
@Modifying
25-
@Query("DELETE FROM PollVote pv WHERE pv.member.memberId = :memberId")
25+
@Query("DELETE FROM PollVote pv WHERE pv.memberId = :memberId")
2626
void deleteByMemberIdValue(@Param("memberId") Long memberId);
2727

28-
boolean existsByPollAndMember(Poll poll, Member member);
29-
30-
@Query("SELECT v.member.memberId FROM PollVote v WHERE v.poll = :poll")
28+
boolean existsByPollAndMemberId(Poll poll, Long memberId);
29+
@Query("SELECT v.memberId FROM PollVote v WHERE v.poll = :poll")
3130
List<Long> findMemberIdsByPoll(@Param("poll") Poll poll);
3231
}

backend/src/main/java/com/ai/lawyer/domain/poll/repository/PollVoteRepositoryImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public List<PollStaticsDto> countStaticsByPollOptionIds(List<Long> pollOptionIds
9494
pollVote.count())
9595
.from(pollVote)
9696
.join(pollVote.getPollOptions(), pollOptions)
97-
.join(pollVote.getMember(), member)
97+
.join(member).on(pollVote.getMemberId().eq(member.getMemberId()))
9898
.where(pollOptions.getPollItemsId().in(pollOptionIds))
9999
.groupBy(pollOptions.getPollItemsId(), member.getGender(), member.getAge())
100100
.fetch();
@@ -147,7 +147,7 @@ public List<AgeGroupCountDto> getOptionAgeStatics(Long pollId) {
147147
pollVote.count())
148148
.from(pollVote)
149149
.join(pollVote.getPollOptions(), pollOptions)
150-
.join(pollVote.getMember(), member)
150+
.join(member).on(pollVote.getMemberId().eq(member.getMemberId()))
151151
.where(pollOptions.getPoll().getPollId().eq(pollId))
152152
.groupBy(pollOptions.getOption(),
153153
new com.querydsl.core.types.dsl.CaseBuilder()
@@ -177,7 +177,7 @@ public List<GenderCountDto> getOptionGenderStatics(Long pollId) {
177177
pollVote.count())
178178
.from(pollVote)
179179
.join(pollVote.getPollOptions(), pollOptions)
180-
.join(pollVote.getMember(), member)
180+
.join(member).on(pollVote.getMemberId().eq(member.getMemberId()))
181181
.where(pollOptions.getPoll().getPollId().eq(pollId))
182182
.groupBy(pollOptions.getOption(), member.getGender())
183183
.fetch();

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,17 @@ public PollVoteDto vote(Long pollId, Long pollItemsId, Long memberId) {
112112
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "투표 권한이 없습니다.");
113113
}
114114
// 기존 투표 내역 조회
115-
var existingVoteOpt = pollVoteRepository.findByMember_MemberIdAndPoll_PollId(memberId, pollId);
115+
var existingVoteOpt = pollVoteRepository.findByMemberIdAndPoll_PollId(memberId, pollId);
116116
if (existingVoteOpt.isPresent()) {
117117
PollVote existingVote = existingVoteOpt.get();
118118
if (existingVote.getPollOptions().getPollItemsId().equals(pollItemsId)) {
119119
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "이미 투표하셨습니다.");
120120
} else {
121-
pollVoteRepository.deleteByMember_MemberIdAndPoll_PollId(memberId, pollId);
121+
pollVoteRepository.deleteByMemberIdAndPoll_PollId(memberId, pollId);
122122
PollVote pollVote = PollVote.builder()
123123
.poll(poll)
124124
.pollOptions(pollOptions)
125-
.member(member)
125+
.memberId(memberId)
126126
.build();
127127
PollVote savedVote = pollVoteRepository.save(pollVote);
128128
Long voteCount = pollVoteRepository.countByPollOptionId(pollItemsId);
@@ -140,7 +140,7 @@ public PollVoteDto vote(Long pollId, Long pollItemsId, Long memberId) {
140140
PollVote pollVote = PollVote.builder()
141141
.poll(poll)
142142
.pollOptions(pollOptions)
143-
.member(member)
143+
.memberId(memberId)
144144
.build();
145145
PollVote savedVote = pollVoteRepository.save(pollVote);
146146
Long voteCount = pollVoteRepository.countByPollOptionId(pollItemsId);
@@ -441,7 +441,7 @@ private PollDto convertToDto(Poll poll, Long memberId, boolean withStatistics) {
441441
Long voteCount = pollVoteRepository.countByPollOptionId(option.getPollItemsId());
442442
boolean voted = false;
443443
if (memberId != null) {
444-
voted = !pollVoteRepository.findByMember_MemberIdAndPollOptions_PollItemsId(memberId, option.getPollItemsId()).isEmpty();
444+
voted = !pollVoteRepository.findByMemberIdAndPollOptions_PollItemsId(memberId, option.getPollItemsId()).isEmpty();
445445
}
446446
List<PollStaticsDto> statics = null;
447447
if (withStatistics && poll.getStatus() == Poll.PollStatus.CLOSED) {
@@ -539,7 +539,7 @@ public void validatePollCreate(PollCreateDto dto) {
539539

540540
@Override
541541
public void cancelVote(Long pollId, Long memberId) {
542-
pollVoteRepository.findByMember_MemberIdAndPoll_PollId(memberId, pollId)
542+
pollVoteRepository.findByMemberIdAndPoll_PollId(memberId, pollId)
543543
.ifPresent(pollVoteRepository::delete);
544544
}
545545
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,20 @@ public ResponseEntity<String> deleteDummyMembers() {
3838
int deleted = dummyService.deleteDummyMembers();
3939
return ResponseEntity.ok("더미 멤버 " + deleted + "명 삭제 완료");
4040
}
41+
42+
//모든 더미 유저가 1번 옵션에 투표
43+
@Operation(summary = "더미 멤버 1번 투표")
44+
@PostMapping("/vote1")
45+
public ResponseEntity<String> dummyVote1Option(@RequestParam Long postId) {
46+
int voteCount = dummyService.dummyVote1Option(postId);
47+
return ResponseEntity.ok("더미 멤버 " + voteCount + "명 투표 완료");
48+
}
49+
50+
//모든 더미 유저가 2번 옵션에 투표
51+
@Operation(summary = "더미 멤버 2번 투표")
52+
@PostMapping("/vote2")
53+
public ResponseEntity<String> dummyVote2Option(@RequestParam Long postId) {
54+
int voteCount = dummyService.dummyVote2Option(postId);
55+
return ResponseEntity.ok("더미 멤버 " + voteCount + "명 투표 완료");
56+
}
4157
}

backend/src/main/java/com/ai/lawyer/domain/post/service/PostDummyService.java

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public int dummyVote(Long postId) {
104104
PollOptions selectedOption = pollOptionsList.get(random.nextInt(pollOptionsList.size()));
105105
PollVote pollVote = PollVote.builder()
106106
.poll(post.getPoll())
107-
.member(member)
107+
.memberId(member.getMemberId())
108108
.pollOptions(selectedOption)
109109
.build();
110110
pollVoteRepository.save(pollVote);
@@ -114,6 +114,70 @@ public int dummyVote(Long postId) {
114114
return voteCount;
115115
}
116116

117+
/**
118+
* 모든 더미 유저가 1번 옵션에 투표
119+
*/
120+
@Transactional
121+
public int dummyVote1Option(Long postId) {
122+
Optional<Post> postOpt = postRepository.findById(postId);
123+
if (postOpt.isEmpty()) return 0;
124+
Post post = postOpt.get();
125+
if (post.getPoll() == null) return 0;
126+
List<PollOptions> pollOptionsList = pollOptionsRepository.findByPoll_PollId(post.getPoll().getPollId());
127+
if (pollOptionsList.size() < 1) return 0;
128+
PollOptions firstOption = pollOptionsList.get(0);
129+
List<Member> dummyMembers = memberRepository.findAll().stream()
130+
.filter(m -> m.getLoginId().startsWith("dummy") && m.getLoginId().endsWith("@test.com"))
131+
.toList();
132+
List<Long> votedMemberIds = pollVoteRepository.findMemberIdsByPoll(post.getPoll());
133+
Set<Long> votedMemberIdSet = new HashSet<>(votedMemberIds);
134+
int voteCount = 0;
135+
for (Member member : dummyMembers) {
136+
if (!votedMemberIdSet.contains(member.getMemberId())) {
137+
PollVote pollVote = PollVote.builder()
138+
.poll(post.getPoll())
139+
.memberId(member.getMemberId())
140+
.pollOptions(firstOption)
141+
.build();
142+
pollVoteRepository.save(pollVote);
143+
voteCount++;
144+
}
145+
}
146+
return voteCount;
147+
}
148+
149+
/**
150+
* 모든 더미 유저가 2번 옵션에 투표
151+
*/
152+
@Transactional
153+
public int dummyVote2Option(Long postId) {
154+
Optional<Post> postOpt = postRepository.findById(postId);
155+
if (postOpt.isEmpty()) return 0;
156+
Post post = postOpt.get();
157+
if (post.getPoll() == null) return 0;
158+
List<PollOptions> pollOptionsList = pollOptionsRepository.findByPoll_PollId(post.getPoll().getPollId());
159+
if (pollOptionsList.size() < 2) return 0;
160+
PollOptions secondOption = pollOptionsList.get(1);
161+
List<Member> dummyMembers = memberRepository.findAll().stream()
162+
.filter(m -> m.getLoginId().startsWith("dummy") && m.getLoginId().endsWith("@test.com"))
163+
.toList();
164+
List<Long> votedMemberIds = pollVoteRepository.findMemberIdsByPoll(post.getPoll());
165+
Set<Long> votedMemberIdSet = new HashSet<>(votedMemberIds);
166+
int voteCount = 0;
167+
for (Member member : dummyMembers) {
168+
if (!votedMemberIdSet.contains(member.getMemberId())) {
169+
PollVote pollVote = PollVote.builder()
170+
.poll(post.getPoll())
171+
.memberId(member.getMemberId())
172+
.pollOptions(secondOption)
173+
.build();
174+
pollVoteRepository.save(pollVote);
175+
voteCount++;
176+
}
177+
}
178+
return voteCount;
179+
}
180+
117181
@Transactional
118182
public int deleteDummyMembers() {
119183
List<Member> dummyMembers = memberRepository.findAll().stream()

backend/src/main/java/com/ai/lawyer/domain/post/service/PostServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ public Page<PostDto> getClosedPostsPaged(Pageable pageable, Long memberId) {
300300
}
301301

302302
private Page<PostDto> getMyVotedPostsPagedByStatus(Pageable pageable, Long memberId, Poll.PollStatus status) {
303-
List<PollVote> votes = pollVoteRepository.findByMember_MemberId(memberId);
303+
List<PollVote> votes = pollVoteRepository.findByMemberId(memberId);
304304
List<Long> pollIds = votes.stream().map(v -> v.getPoll().getPollId()).distinct().toList();
305305
Page<Post> posts = (status == null)
306306
? postRepository.findByPoll_PollIdIn(pollIds, pageable)

0 commit comments

Comments
 (0)