Skip to content

Commit

Permalink
[WHD-255] Fix: Prevent duplicate group join
Browse files Browse the repository at this point in the history
  • Loading branch information
jjunhub committed Dec 2, 2024
1 parent 55d4ac5 commit ecb8e7f
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@
import java.time.LocalDate;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import woohakdong.server.common.exception.CustomErrorInfo;
import woohakdong.server.common.exception.CustomException;
import woohakdong.server.common.util.date.DateUtil;
import woohakdong.server.common.util.security.SecurityUtil;
import woohakdong.server.domain.club.Club;
import woohakdong.server.domain.clubmember.ClubMember;
import woohakdong.server.domain.clubmember.ClubMemberRepository;
import woohakdong.server.domain.group.Group;
import woohakdong.server.domain.group.GroupRepository;
import woohakdong.server.domain.groupmember.GroupMemberRepository;
import woohakdong.server.domain.member.Member;

@Service
Expand All @@ -22,6 +25,7 @@ public class GroupServiceTrans {

private final ClubMemberRepository clubMemberRepository;
private final GroupRepository groupRepository;
private final GroupMemberRepository groupMemberRepository;

@Transactional
public void processJoinGroup(Long groupId, LocalDate date) {
Expand All @@ -33,6 +37,11 @@ public void processJoinGroup(Long groupId, LocalDate date) {
ClubMember clubMember = clubMemberRepository.getByClubAndMemberAndAssignedTerm(club, member,
dateUtil.getAssignedTerm(date));

// 그룹에 속한 멤버인지 확인
if (groupMemberRepository.checkAlreadyJoined(group, clubMember)) {
throw new CustomException(CustomErrorInfo.CLUB_GROUP_ALREADY_JOINED);
}

group.joinNewMember(clubMember);
groupRepository.save(group);
groupRepository.flush();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import woohakdong.server.domain.clubmember.ClubMember;
import woohakdong.server.domain.group.Group;
import woohakdong.server.domain.member.Member;

public interface GroupMemberJpaRepository extends JpaRepository<GroupMember, Long> {
List<GroupMember> findAllByGroup(Group group);

boolean existsByGroupAndClubMember(Group group, ClubMember clubMember);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package woohakdong.server.domain.groupmember;

import java.util.List;
import woohakdong.server.domain.clubmember.ClubMember;
import woohakdong.server.domain.group.Group;
import woohakdong.server.domain.member.Member;

public interface GroupMemberRepository {
GroupMember save(GroupMember groupMember);

List<GroupMember> getByGroup(Group group);

boolean checkAlreadyJoined(Group group, ClubMember clubMember);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,28 @@
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import woohakdong.server.domain.clubmember.ClubMember;
import woohakdong.server.domain.group.Group;
import woohakdong.server.domain.member.Member;

@RequiredArgsConstructor
@Repository
public class GroupMemberRepositoryImpl implements GroupMemberRepository {

private final GroupMemberJpaRepository groupMemberJpaRepository;

@Override
public GroupMember save(GroupMember groupMember) {
return groupMemberJpaRepository.save(groupMember);
}

@Override
public List<GroupMember> getByGroup(Group group) {
return groupMemberJpaRepository.findAllByGroup(group);
}

@Override
public boolean checkAlreadyJoined(Group group, ClubMember clubMember) {
return groupMemberJpaRepository.existsByGroupAndClubMember(group, clubMember);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package woohakdong.server.api.service.group;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static woohakdong.server.common.exception.CustomErrorInfo.CLUB_GROUP_ALREADY_JOINED;
import static woohakdong.server.domain.clubmember.ClubMemberRole.PRESIDENT;
import static woohakdong.server.domain.group.GroupType.EVENT;

Expand All @@ -10,6 +12,7 @@
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import woohakdong.server.SecurityContextSetup;
import woohakdong.server.common.exception.CustomException;
import woohakdong.server.common.util.date.DateUtil;
import woohakdong.server.domain.club.Club;
import woohakdong.server.domain.club.ClubRepository;
Expand All @@ -19,6 +22,8 @@
import woohakdong.server.domain.group.Group;
import woohakdong.server.domain.group.GroupRepository;
import woohakdong.server.domain.group.GroupType;
import woohakdong.server.domain.groupmember.GroupMember;
import woohakdong.server.domain.groupmember.GroupMemberRepository;
import woohakdong.server.domain.member.Member;

class GroupServiceTransTest extends SecurityContextSetup {
Expand All @@ -36,18 +41,21 @@ class GroupServiceTransTest extends SecurityContextSetup {
private ClubMemberRepository clubMemberRepository;

@Autowired
private DateUtil dateUtil;
private GroupMemberRepository groupMemberRepository;

@Autowired
private DateUtil dateUtil;

@BeforeEach
void setUp() {
club = createClub();
member = createExampleMember();
createClubMember(club, member, PRESIDENT);
clubMember = createClubMember(club, member, PRESIDENT);
}

private Club club;
private Member member;
private ClubMember clubMember;

@DisplayName("그룹에 참가할 수 있다.")
@Test
Expand All @@ -64,6 +72,28 @@ void processJoinGroup() {
assertThat(updatedGroup.getGroupMemberCount()).isEqualTo(1);
}

@DisplayName("하나의 그룹에 대해서 여러번 참가할 수 없다.")
@Test
void processJoinGroupDuplicate() {
// Given
Group group = createNewGroup("동아리 MT", 0, EVENT, true, 0, 999);
LocalDate date = LocalDate.of(2024, 11, 19);
setGroupMember(group, clubMember);

// When & Then
assertThatThrownBy(() -> groupServiceTrans.processJoinGroup(group.getGroupId(), date))
.isInstanceOf(CustomException.class)
.hasMessage(CLUB_GROUP_ALREADY_JOINED.getMessage());
}

private void setGroupMember(Group group, ClubMember clubMember) {
GroupMember groupMember = GroupMember.builder()
.group(group)
.clubMember(clubMember)
.build();
groupMemberRepository.save(groupMember);
}

private Club createClub() {
Club club = Club.builder()
.clubName("테스트 동아리")
Expand All @@ -88,13 +118,13 @@ private Group createNewGroup(String groupName, int groupAmount, GroupType groupT
return groupRepository.save(group);
}

private void createClubMember(Club club, Member member, ClubMemberRole role) {
private ClubMember createClubMember(Club club, Member member, ClubMemberRole role) {
ClubMember clubMember = ClubMember.builder()
.club(club)
.member(member)
.clubMemberRole(role)
.clubMemberAssignedTerm(dateUtil.getAssignedTerm(LocalDate.of(2024, 11, 19)))
.build();
clubMemberRepository.save(clubMember);
return clubMemberRepository.save(clubMember);
}
}

0 comments on commit ecb8e7f

Please sign in to comment.