Skip to content

Commit

Permalink
동호회 탈퇴 API (#13)
Browse files Browse the repository at this point in the history
* fix: 멤버 강제 탈퇴 시 현재 멤버 수 감소

* fix: 가입 신청 수락 시 limitMemberNumber 확인을 더 먼저 하도록 수정

상태 변경 후 멤버 수 확인으로 인한 데이터 정합성 문제 해결

* style: 오류 타입명 변경

NOT_MANAGE_CLUB에서 NOT_CLUB_MANAGER로 변경

* feat: 동호회 탈퇴 API

동호회 회원이 동호회를 탈퇴하는 API 구현

* feat: RequestParam을 PathVariable로 변경
  • Loading branch information
kimahhh authored Oct 4, 2023
1 parent 7bb19db commit f8882ba
Show file tree
Hide file tree
Showing 7 changed files with 45 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import porori.backend.domain.club.model.entity.Club;
import porori.backend.domain.club.repository.ClubRepository;
import porori.backend.domain.member.model.entity.Role;
import porori.backend.domain.member.repository.MemberRepository;
import porori.backend.domain.member.service.MemberService;
import porori.backend.domain.user.service.UserService;

Expand Down Expand Up @@ -62,8 +61,8 @@ public ApplicationResponseDTO acceptApplication(String token, Long clubId, Long
Long managerId = userService.getUserId(token);
Club club = verifyClubManager(clubId, managerId);

Application application = changeApplicationStatus(club, userId, COMPLETED);
memberService.addMember(club, userId, Role.MEMBER);
Application application = changeApplicationStatus(club, userId, COMPLETED);
return ApplicationResponseDTO.from(application);
}

Expand All @@ -84,7 +83,7 @@ private Application changeApplicationStatus(Club club, Long userId, ApplicationS

private Club verifyClubManager(Long clubId, Long userId) {
if (!clubRepository.existsByClubIdAndUserId(clubId, userId))
throw new ClubException(NOT_MANAGE_CLUB);
throw new ClubException(NOT_CLUB_MANAGER);
return clubRepository.findById(clubId).orElseThrow(() -> new ClubException(INVALID_CLUB));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ public SuccessResponse<List<ClubGetResponseDTO>> getSubjectClubs(@PathVariable S
return new SuccessResponse<>(SUCCESS, clubService.getSubjectClubs(subjectTitle));
}

@GetMapping("/detail")
@GetMapping("/detail/{clubId}")
@Operation(summary = "동호회 정보 조회", description = "동호회 ID로 동호회를 조회한다.")
public SuccessResponse<ClubGetResponseDTO> getClub(@RequestParam Long clubId) {
public SuccessResponse<ClubGetResponseDTO> getClub(@PathVariable Long clubId) {
return new SuccessResponse<>(SUCCESS, clubService.getClub(clubId));
}

Expand All @@ -59,10 +59,10 @@ public SuccessResponse<ClubGetResponseDTO> updateClub(@RequestHeader("Authorizat
return new SuccessResponse<>(SUCCESS, clubService.updateClub(token, clubUpdateRequestDTO));
}

@DeleteMapping("/delete")
@DeleteMapping("/delete/{clubId}")
@Operation(summary = "동호회 삭제", description = "자신이 관리자인 동호회를 삭제한다.")
public SuccessResponse<ClubDeleteResponseDTO> deleteClub(@RequestHeader("Authorization") String token,
@RequestParam Long clubId) {
@PathVariable Long clubId) {
return new SuccessResponse<>(SUCCESS, clubService.deleteClub(token, clubId));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ public void increaseCurrentMemberNumber() {
this.currentMemberNumber = this.currentMemberNumber + 1;
}

public void decreaseCurrentMemberNumber() {
this.currentMemberNumber = this.currentMemberNumber - 1;
}

public void changeStatus(BaseStatus status) {
this.status = status;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,6 @@ public ClubDeleteResponseDTO deleteClub(String token, Long clubId) {

private void verifyClubManager(Long clubId, Long userId) {
if (!clubRepository.existsByClubIdAndUserId(clubId, userId))
throw new ClubException(NOT_MANAGE_CLUB);
throw new ClubException(NOT_CLUB_MANAGER);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,11 @@ public SuccessResponse<MemberStatusResponseDTO> kickOutMember(@RequestHeader("Au
return new SuccessResponse<>(SUCCESS, memberService.kickOutMember(token, clubId, userId));
}

@PostMapping("/quit/{clubId}")
@Operation(summary = "동호회 회원 탈퇴", description = "회원이 동호회를 탈퇴한다.")
public SuccessResponse<MemberStatusResponseDTO> quitMember(@RequestHeader("Authorization") String token,
@PathVariable Long clubId) {
return new SuccessResponse<>(SUCCESS, memberService.quitMember(token, clubId));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.stream.Collectors;

import static porori.backend.global.common.status.BaseStatus.ACTIVE;
import static porori.backend.global.common.status.BaseStatus.INACTIVE;
import static porori.backend.global.common.status.ErrorStatus.*;

@Service
Expand Down Expand Up @@ -60,7 +61,7 @@ public List<MemberResponseDTO> getMemberList(String token, Long clubId) {

private Club verifyClubManager(Long clubId, Long userId) {
if (!clubRepository.existsByClubIdAndUserId(clubId, userId))
throw new ClubException(NOT_MANAGE_CLUB);
throw new ClubException(NOT_CLUB_MANAGER);
return clubRepository.findById(clubId).orElseThrow(() -> new ClubException(INVALID_CLUB));
}

Expand All @@ -72,6 +73,29 @@ public MemberStatusResponseDTO kickOutMember(String token, Long clubId, Long use

member.changeStatus(BaseStatus.INACTIVE);
memberRepository.save(member);

club.decreaseCurrentMemberNumber();
clubRepository.save(club);
return MemberStatusResponseDTO.from(member);
}

public MemberStatusResponseDTO quitMember(String token, Long clubId) {
Long userId = userService.getUserId(token);
Club club = clubRepository.findById(clubId).orElseThrow(() -> new ClubException(INVALID_CLUB));

Member member = memberRepository.findByClubAndUserId(club, userId).orElseThrow(() -> new MemberException(NOT_EXIST_MEMBER));
verifyQuitManager(member);

member.changeStatus(INACTIVE);
memberRepository.save(member);

club.decreaseCurrentMemberNumber();
clubRepository.save(club);
return MemberStatusResponseDTO.from(member);
}

private void verifyQuitManager(Member member) {
if (member.getRole().equals(Role.MANAGER))
throw new ClubException(MANAGER_CANT_QUIT);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public enum ErrorStatus {

INVALID_JWT(401, "유효하지 않은 JWT입니다."),

NOT_MANAGE_CLUB(403, "현재 접속한 유저가 관리하는 동호회가 아닙니다."),
NOT_CLUB_MANAGER(403, "현재 접속한 유저가 관리하는 동호회가 아닙니다."),
MANAGER_CANT_QUIT(403, "동호회 관리자는 동호회를 탈퇴할 수 없습니다."),

NOT_EXIST_APPLICATION(404, "신청 내역이 존재하지 않습니다."),
NOT_EXIST_MEMBER(404, "동호회 회원이 아닙니다."),
Expand Down

0 comments on commit f8882ba

Please sign in to comment.