From 5ad96f381228627d568166d2ff044745b2835142 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Sun, 18 Jan 2026 19:31:31 +0900 Subject: [PATCH 01/17] =?UTF-8?q?=EC=83=88=20=EB=B8=8C=EB=9E=9C=EC=B9=98?= =?UTF-8?q?=20=EC=BB=A4=EB=B0=8B=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/gg/agit/konect/domain/club/service/ClubService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java index 69e2c167..474f3e45 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java @@ -84,6 +84,7 @@ public ClubsResponse getClubs(ClubCondition condition, Integer userId) { Page clubSummaryInfoPage = clubQueryRepository.findAllByFilter( pageable, condition.query(), condition.isRecruiting(), user.getUniversity().getId() ); + return ClubsResponse.of(clubSummaryInfoPage); } From 1e95ca40f1db47f0e22959bef868d50e9e667014 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Mon, 19 Jan 2026 17:07:29 +0900 Subject: [PATCH 02/17] =?UTF-8?q?feat:=20=EB=8F=99=EC=95=84=EB=A6=AC=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/club/controller/ClubApi.java | 164 +++++++++++++- .../club/controller/ClubController.java | 97 ++++++++- .../domain/club/dto/ClubMemberCondition.java | 13 ++ .../club/dto/ClubPositionCreateRequest.java | 22 ++ .../club/dto/ClubPositionUpdateRequest.java | 16 ++ .../club/dto/ClubPositionsResponse.java | 56 +++++ .../club/dto/MemberPositionChangeRequest.java | 14 ++ .../club/dto/PresidentTransferRequest.java | 14 ++ .../club/dto/VicePresidentChangeRequest.java | 12 ++ .../domain/club/enums/ClubPositionGroup.java | 39 +++- .../konect/domain/club/model/ClubMember.java | 25 +++ .../domain/club/model/ClubPosition.java | 30 +++ .../club/repository/ClubMemberRepository.java | 36 ++++ .../repository/ClubPositionRepository.java | 110 ++++++++++ .../service/ClubMemberManagementService.java | 201 ++++++++++++++++++ .../club/service/ClubPositionService.java | 152 +++++++++++++ .../domain/club/service/ClubService.java | 14 +- .../konect/global/code/ApiResponseCode.java | 16 +- 18 files changed, 1021 insertions(+), 10 deletions(-) create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubMemberCondition.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubPositionCreateRequest.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubPositionUpdateRequest.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubPositionsResponse.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/MemberPositionChangeRequest.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/PresidentTransferRequest.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/VicePresidentChangeRequest.java create mode 100644 src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java create mode 100644 src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java create mode 100644 src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java index 7094f1cb..5bc66c5a 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java @@ -2,8 +2,10 @@ import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -19,12 +21,19 @@ import gg.agit.konect.domain.club.dto.ClubDetailResponse; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; +import gg.agit.konect.domain.club.dto.ClubMemberCondition; import gg.agit.konect.domain.club.dto.ClubMembersResponse; import gg.agit.konect.domain.club.dto.ClubMembershipsResponse; +import gg.agit.konect.domain.club.dto.ClubPositionCreateRequest; +import gg.agit.konect.domain.club.dto.ClubPositionUpdateRequest; +import gg.agit.konect.domain.club.dto.ClubPositionsResponse; import gg.agit.konect.domain.club.dto.ClubRecruitmentCreateRequest; import gg.agit.konect.domain.club.dto.ClubRecruitmentResponse; import gg.agit.konect.domain.club.dto.ClubRecruitmentUpdateRequest; import gg.agit.konect.domain.club.dto.ClubsResponse; +import gg.agit.konect.domain.club.dto.MemberPositionChangeRequest; +import gg.agit.konect.domain.club.dto.PresidentTransferRequest; +import gg.agit.konect.domain.club.dto.VicePresidentChangeRequest; import gg.agit.konect.global.auth.annotation.UserId; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -98,10 +107,17 @@ ResponseEntity getClubApplicationAnswers( @UserId Integer userId ); - @Operation(summary = "동아리 멤버 리스트를 조회한다.") + @Operation(summary = "동아리 멤버 리스트를 조회한다.", description = """ + 동아리 회원만 멤버 리스트를 조회할 수 있습니다. + positionGroup 파라미터로 특정 직책 그룹의 회원만 필터링할 수 있습니다. + + ## 에러 + - FORBIDDEN_CLUB_MEMBER_ACCESS (403): 동아리 멤버 조회 권한이 없습니다. + """) @GetMapping("/{clubId}/members") ResponseEntity getClubMembers( @PathVariable(name = "clubId") Integer clubId, + @Valid @ParameterObject @ModelAttribute ClubMemberCondition condition, @UserId Integer userId ); @@ -231,4 +247,150 @@ ResponseEntity updateRecruitment( @PathVariable(name = "clubId") Integer clubId, @UserId Integer userId ); + + @Operation(summary = "동아리 직책 목록을 조회한다.", description = """ + 동아리의 모든 직책을 우선순위 순으로 조회합니다. + 각 직책의 회원 수, 수정/삭제 가능 여부도 함께 반환됩니다. + + ## 에러 + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + """) + @GetMapping("/{clubId}/positions") + ResponseEntity getClubPositions( + @PathVariable(name = "clubId") Integer clubId, + @UserId Integer userId + ); + + @Operation(summary = "동아리 직책을 생성한다.", description = """ + 동아리 회장 또는 매니저만 직책을 생성할 수 있습니다. + PRESIDENT와 VICE_PRESIDENT 직책은 생성할 수 없으며, MANAGER 또는 MEMBER 그룹의 직책만 생성 가능합니다. + + ## 에러 + - POSITION_NAME_DUPLICATED (400): 동일한 직책 이름이 이미 존재합니다. + - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 매니저 권한이 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + """) + @PostMapping("/{clubId}/positions") + ResponseEntity createClubPosition( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody ClubPositionCreateRequest request, + @UserId Integer userId + ); + + @Operation(summary = "동아리 직책의 이름을 수정한다.", description = """ + 동아리 회장 또는 매니저만 직책 이름을 수정할 수 있습니다. + PRESIDENT와 VICE_PRESIDENT 직책의 이름은 변경할 수 없습니다. + + ## 에러 + - POSITION_NAME_DUPLICATED (400): 동일한 직책 이름이 이미 존재합니다. + - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 매니저 권한이 없습니다. + - FORBIDDEN_POSITION_NAME_CHANGE (403): 해당 직책의 이름은 변경할 수 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + - NOT_FOUND_CLUB_POSITION (404): 동아리 직책을 찾을 수 없습니다. + """) + @PatchMapping("/{clubId}/positions/{positionId}") + ResponseEntity updateClubPositionName( + @PathVariable(name = "clubId") Integer clubId, + @PathVariable(name = "positionId") Integer positionId, + @Valid @RequestBody ClubPositionUpdateRequest request, + @UserId Integer userId + ); + + @Operation(summary = "동아리 직책을 삭제한다.", description = """ + 동아리 회장 또는 매니저만 직책을 삭제할 수 있습니다. + PRESIDENT와 VICE_PRESIDENT 직책은 삭제할 수 없습니다. + 해당 직책을 사용 중인 회원이 없어야 하며, 해당 그룹에 최소 2개의 직책이 있어야 삭제 가능합니다. + + ## 에러 + - CANNOT_DELETE_ESSENTIAL_POSITION (400): 필수 직책은 삭제할 수 없습니다. + - POSITION_IN_USE (400): 해당 직책을 사용 중인 회원이 있어 삭제할 수 없습니다. + - INSUFFICIENT_POSITION_COUNT (400): 해당 그룹에 최소 2개의 직책이 있어야 삭제 가능합니다. + - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 매니저 권한이 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + - NOT_FOUND_CLUB_POSITION (404): 동아리 직책을 찾을 수 없습니다. + """) + @DeleteMapping("/{clubId}/positions/{positionId}") + ResponseEntity deleteClubPosition( + @PathVariable(name = "clubId") Integer clubId, + @PathVariable(name = "positionId") Integer positionId, + @UserId Integer userId + ); + + @Operation(summary = "동아리 회원의 직책을 변경한다.", description = """ + 동아리 회장 또는 매니저만 회원의 직책을 변경할 수 있습니다. + 자기 자신의 직책은 변경할 수 없으며, 상위 직급만 하위 직급의 회원을 관리할 수 있습니다. + + ## 에러 + - CANNOT_CHANGE_OWN_POSITION (400): 자기 자신의 직책은 변경할 수 없습니다. + - CANNOT_MANAGE_HIGHER_POSITION (400): 자신보다 높은 직급의 회원은 관리할 수 없습니다. + - VICE_PRESIDENT_ALREADY_EXISTS (409): 부회장은 이미 존재합니다. + - MANAGER_LIMIT_EXCEEDED (400): 운영진은 최대 20명까지 임명 가능합니다. + - FORBIDDEN_MEMBER_POSITION_CHANGE (403): 회원 직책 변경 권한이 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + - NOT_FOUND_CLUB_MEMBER (404): 동아리 회원을 찾을 수 없습니다. + - NOT_FOUND_CLUB_POSITION (404): 동아리 직책을 찾을 수 없습니다. + """) + @PatchMapping("/{clubId}/members/{memberId}/position") + ResponseEntity changeMemberPosition( + @PathVariable(name = "clubId") Integer clubId, + @PathVariable(name = "memberId") Integer memberId, + @Valid @RequestBody MemberPositionChangeRequest request, + @UserId Integer userId + ); + + @Operation(summary = "동아리 회장 권한을 위임한다.", description = """ + 현재 회장만 회장 권한을 다른 회원에게 위임할 수 있습니다. + 회장 위임 시 현재 회장은 일반회원으로 강등됩니다. + + ## 에러 + - ILLEGAL_ARGUMENT (400): 자기 자신에게는 위임할 수 없습니다. + - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 회장 권한이 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + - NOT_FOUND_CLUB_MEMBER (404): 동아리 회원을 찾을 수 없습니다. + - NOT_FOUND_CLUB_PRESIDENT (404): 동아리 회장을 찾을 수 없습니다. + - NOT_FOUND_CLUB_POSITION (404): 동아리 직책을 찾을 수 없습니다. + """) + @PostMapping("/{clubId}/president/transfer") + ResponseEntity transferPresident( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody PresidentTransferRequest request, + @UserId Integer userId + ); + + @Operation(summary = "동아리 부회장을 변경한다.", description = """ + 동아리 회장만 부회장을 임명하거나 해제할 수 있습니다. + vicePresidentUserId가 null이면 부회장을 해제하고, 값이 있으면 해당 회원을 부회장으로 임명합니다. + + ## 에러 + - CANNOT_CHANGE_OWN_POSITION (400): 자기 자신을 부회장으로 임명할 수 없습니다. + - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 회장 권한이 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + - NOT_FOUND_CLUB_MEMBER (404): 동아리 회원을 찾을 수 없습니다. + - NOT_FOUND_CLUB_POSITION (404): 동아리 직책을 찾을 수 없습니다. + """) + @PatchMapping("/{clubId}/vice-president") + ResponseEntity changeVicePresident( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody VicePresidentChangeRequest request, + @UserId Integer userId + ); + + @Operation(summary = "동아리 회원을 강제 탈퇴시킨다.", description = """ + 동아리 회장 또는 매니저만 회원을 강제 탈퇴시킬 수 있습니다. + 자기 자신은 강제 탈퇴시킬 수 없으며, 회장은 강제 탈퇴시킬 수 없습니다. + 상위 직급만 하위 직급의 회원을 강제 탈퇴시킬 수 있습니다. + + ## 에러 + - CANNOT_REMOVE_SELF (400): 자기 자신을 강제 탈퇴시킬 수 없습니다. + - CANNOT_DELETE_CLUB_PRESIDENT (400): 회장은 강제 탈퇴시킬 수 없습니다. + - CANNOT_MANAGE_HIGHER_POSITION (400): 자신보다 높은 직급의 회원은 관리할 수 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + - NOT_FOUND_CLUB_MEMBER (404): 동아리 회원을 찾을 수 없습니다. + """) + @DeleteMapping("/{clubId}/members/{memberId}") + ResponseEntity removeMember( + @PathVariable(name = "clubId") Integer clubId, + @PathVariable(name = "memberId") Integer memberId, + @UserId Integer userId + ); } diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java index 4c22b0de..62fc2001 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java @@ -17,12 +17,21 @@ import gg.agit.konect.domain.club.dto.ClubDetailResponse; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; +import gg.agit.konect.domain.club.dto.ClubMemberCondition; import gg.agit.konect.domain.club.dto.ClubMembersResponse; import gg.agit.konect.domain.club.dto.ClubMembershipsResponse; +import gg.agit.konect.domain.club.dto.ClubPositionCreateRequest; +import gg.agit.konect.domain.club.dto.ClubPositionUpdateRequest; +import gg.agit.konect.domain.club.dto.ClubPositionsResponse; import gg.agit.konect.domain.club.dto.ClubRecruitmentCreateRequest; import gg.agit.konect.domain.club.dto.ClubRecruitmentResponse; import gg.agit.konect.domain.club.dto.ClubRecruitmentUpdateRequest; import gg.agit.konect.domain.club.dto.ClubsResponse; +import gg.agit.konect.domain.club.dto.MemberPositionChangeRequest; +import gg.agit.konect.domain.club.dto.PresidentTransferRequest; +import gg.agit.konect.domain.club.dto.VicePresidentChangeRequest; +import gg.agit.konect.domain.club.service.ClubMemberManagementService; +import gg.agit.konect.domain.club.service.ClubPositionService; import gg.agit.konect.domain.club.service.ClubService; import gg.agit.konect.global.auth.annotation.UserId; import jakarta.validation.Valid; @@ -34,6 +43,8 @@ public class ClubController implements ClubApi { private final ClubService clubService; + private final ClubPositionService clubPositionService; + private final ClubMemberManagementService clubMemberManagementService; @Override public ResponseEntity getClubs( @@ -94,9 +105,10 @@ public ResponseEntity getClubApplicationAnswers( @Override public ResponseEntity getClubMembers( @PathVariable(name = "clubId") Integer clubId, + @Valid @ParameterObject @ModelAttribute ClubMemberCondition condition, @UserId Integer userId ) { - ClubMembersResponse response = clubService.getClubMembers(clubId, userId); + ClubMembersResponse response = clubService.getClubMembers(clubId, userId, condition); return ResponseEntity.ok(response); } @@ -176,4 +188,87 @@ public ResponseEntity updateRecruitment( clubService.updateRecruitment(clubId, userId, request); return ResponseEntity.noContent().build(); } + + @Override + public ResponseEntity getClubPositions( + @PathVariable(name = "clubId") Integer clubId, + @UserId Integer userId + ) { + ClubPositionsResponse response = clubPositionService.getClubPositions(clubId, userId); + return ResponseEntity.ok(response); + } + + @Override + public ResponseEntity createClubPosition( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody ClubPositionCreateRequest request, + @UserId Integer userId + ) { + ClubPositionsResponse response = clubPositionService.createClubPosition(clubId, userId, request); + return ResponseEntity.ok(response); + } + + @Override + public ResponseEntity updateClubPositionName( + @PathVariable(name = "clubId") Integer clubId, + @PathVariable(name = "positionId") Integer positionId, + @Valid @RequestBody ClubPositionUpdateRequest request, + @UserId Integer userId + ) { + ClubPositionsResponse response = clubPositionService.updateClubPositionName( + clubId, positionId, userId, request + ); + return ResponseEntity.ok(response); + } + + @Override + public ResponseEntity deleteClubPosition( + @PathVariable(name = "clubId") Integer clubId, + @PathVariable(name = "positionId") Integer positionId, + @UserId Integer userId + ) { + clubPositionService.deleteClubPosition(clubId, positionId, userId); + return ResponseEntity.noContent().build(); + } + + @Override + public ResponseEntity changeMemberPosition( + @PathVariable(name = "clubId") Integer clubId, + @PathVariable(name = "memberId") Integer memberId, + @Valid @RequestBody MemberPositionChangeRequest request, + @UserId Integer userId + ) { + clubMemberManagementService.changeMemberPosition(clubId, memberId, userId, request); + return ResponseEntity.noContent().build(); + } + + @Override + public ResponseEntity transferPresident( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody PresidentTransferRequest request, + @UserId Integer userId + ) { + clubMemberManagementService.transferPresident(clubId, userId, request); + return ResponseEntity.noContent().build(); + } + + @Override + public ResponseEntity changeVicePresident( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody VicePresidentChangeRequest request, + @UserId Integer userId + ) { + clubMemberManagementService.changeVicePresident(clubId, userId, request); + return ResponseEntity.noContent().build(); + } + + @Override + public ResponseEntity removeMember( + @PathVariable(name = "clubId") Integer clubId, + @PathVariable(name = "memberId") Integer memberId, + @UserId Integer userId + ) { + clubMemberManagementService.removeMember(clubId, memberId, userId); + return ResponseEntity.noContent().build(); + } } diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubMemberCondition.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubMemberCondition.java new file mode 100644 index 00000000..53c16cd4 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubMemberCondition.java @@ -0,0 +1,13 @@ +package gg.agit.konect.domain.club.dto; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; + +import gg.agit.konect.domain.club.enums.ClubPositionGroup; +import io.swagger.v3.oas.annotations.media.Schema; + +public record ClubMemberCondition( + @Schema(description = "직책 그룹으로 필터링 (null이면 전체 조회)", example = "PRESIDENT", requiredMode = NOT_REQUIRED) + ClubPositionGroup positionGroup +) { + +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionCreateRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionCreateRequest.java new file mode 100644 index 00000000..2c837d68 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionCreateRequest.java @@ -0,0 +1,22 @@ +package gg.agit.konect.domain.club.dto; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import gg.agit.konect.domain.club.enums.ClubPositionGroup; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +public record ClubPositionCreateRequest( + @NotBlank(message = "직책 이름은 필수 입력입니다.") + @Size(max = 50, message = "직책 이름은 최대 50자까지 입력 가능합니다.") + @Schema(description = "직책 이름", example = "부운영진", requiredMode = REQUIRED) + String name, + + @NotNull(message = "직책 그룹은 필수 입력입니다.") + @Schema(description = "직책 그룹 (MANAGER 또는 MEMBER만 가능)", example = "MANAGER", requiredMode = REQUIRED) + ClubPositionGroup positionGroup +) { + +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionUpdateRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionUpdateRequest.java new file mode 100644 index 00000000..759f20cc --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionUpdateRequest.java @@ -0,0 +1,16 @@ +package gg.agit.konect.domain.club.dto; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +public record ClubPositionUpdateRequest( + @NotBlank(message = "직책 이름은 필수 입력입니다.") + @Size(max = 50, message = "직책 이름은 최대 50자까지 입력 가능합니다.") + @Schema(description = "직책 이름", example = "총무", requiredMode = REQUIRED) + String name +) { + +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionsResponse.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionsResponse.java new file mode 100644 index 00000000..59498c9e --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionsResponse.java @@ -0,0 +1,56 @@ +package gg.agit.konect.domain.club.dto; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import java.util.List; + +import gg.agit.konect.domain.club.enums.ClubPositionGroup; +import gg.agit.konect.domain.club.model.ClubPosition; +import io.swagger.v3.oas.annotations.media.Schema; + +public record ClubPositionsResponse( + @Schema(description = "직책 리스트", requiredMode = REQUIRED) + List positions +) { + public record InnerClubPosition( + @Schema(description = "직책 ID", example = "1", requiredMode = REQUIRED) + Integer positionId, + + @Schema(description = "직책 이름", example = "회장", requiredMode = REQUIRED) + String name, + + @Schema(description = "직책 그룹", example = "PRESIDENT", requiredMode = REQUIRED) + ClubPositionGroup positionGroup, + + @Schema(description = "우선순위 (낮을수록 높은 직급)", example = "0", requiredMode = REQUIRED) + Integer priority, + + @Schema(description = "해당 직책의 회원 수", example = "1", requiredMode = REQUIRED) + Long memberCount, + + @Schema(description = "이름 변경 가능 여부", example = "false", requiredMode = REQUIRED) + Boolean canRename, + + @Schema(description = "삭제 가능 여부", example = "false", requiredMode = REQUIRED) + Boolean canDelete + ) { + public static InnerClubPosition of( + ClubPosition position, + Long memberCount + ) { + return new InnerClubPosition( + position.getId(), + position.getName(), + position.getClubPositionGroup(), + position.getPriority(), + memberCount, + position.canRename(), + position.canDelete() + ); + } + } + + public static ClubPositionsResponse of(List positions) { + return new ClubPositionsResponse(positions); + } +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/MemberPositionChangeRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/MemberPositionChangeRequest.java new file mode 100644 index 00000000..7d0c71a6 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/MemberPositionChangeRequest.java @@ -0,0 +1,14 @@ +package gg.agit.konect.domain.club.dto; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +public record MemberPositionChangeRequest( + @NotNull(message = "직책 ID는 필수 입력입니다.") + @Schema(description = "변경할 직책 ID", example = "3", requiredMode = REQUIRED) + Integer positionId +) { + +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/PresidentTransferRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/PresidentTransferRequest.java new file mode 100644 index 00000000..2e4cb344 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/PresidentTransferRequest.java @@ -0,0 +1,14 @@ +package gg.agit.konect.domain.club.dto; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +public record PresidentTransferRequest( + @NotNull(message = "새 회장의 사용자 ID는 필수 입력입니다.") + @Schema(description = "새 회장으로 임명할 사용자 ID", example = "2", requiredMode = REQUIRED) + Integer newPresidentUserId +) { + +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/VicePresidentChangeRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/VicePresidentChangeRequest.java new file mode 100644 index 00000000..a65ec1fd --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/VicePresidentChangeRequest.java @@ -0,0 +1,12 @@ +package gg.agit.konect.domain.club.dto; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; + +import io.swagger.v3.oas.annotations.media.Schema; + +public record VicePresidentChangeRequest( + @Schema(description = "부회장으로 임명할 사용자 ID (null이면 부회장 해제)", example = "3", requiredMode = NOT_REQUIRED) + Integer vicePresidentUserId +) { + +} diff --git a/src/main/java/gg/agit/konect/domain/club/enums/ClubPositionGroup.java b/src/main/java/gg/agit/konect/domain/club/enums/ClubPositionGroup.java index 7892a954..376c13bb 100644 --- a/src/main/java/gg/agit/konect/domain/club/enums/ClubPositionGroup.java +++ b/src/main/java/gg/agit/konect/domain/club/enums/ClubPositionGroup.java @@ -4,14 +4,45 @@ @Getter public enum ClubPositionGroup { - PRESIDENT("회장"), - MANAGER("운영진"), - MEMBER("일반회원"), + PRESIDENT("회장", 0, 1, 1), + VICE_PRESIDENT("부회장", 1, 0, 1), + MANAGER("운영진", 2, 0, 20), + MEMBER("일반회원", 3, 0, Integer.MAX_VALUE), ; private final String description; + private final int priority; + private final int minCount; + private final int maxCount; - ClubPositionGroup(String description) { + ClubPositionGroup(String description, int priority, int minCount, int maxCount) { this.description = description; + this.priority = priority; + this.minCount = minCount; + this.maxCount = maxCount; + } + + public boolean canManage(ClubPositionGroup target) { + return this.priority < target.priority; + } + + public boolean isHigherThan(ClubPositionGroup target) { + return this.priority < target.priority; + } + + public boolean isPresident() { + return this == PRESIDENT; + } + + public boolean isVicePresident() { + return this == VICE_PRESIDENT; + } + + public boolean isManager() { + return this == MANAGER; + } + + public boolean isMember() { + return this == MEMBER; } } diff --git a/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java b/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java index 22e1321d..d3825eb6 100644 --- a/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java +++ b/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java @@ -3,6 +3,7 @@ import static jakarta.persistence.FetchType.LAZY; import static lombok.AccessLevel.PROTECTED; +import gg.agit.konect.domain.club.enums.ClubPositionGroup; import gg.agit.konect.domain.user.model.User; import gg.agit.konect.global.model.BaseEntity; import jakarta.persistence.Column; @@ -58,4 +59,28 @@ public boolean isPresident() { public boolean isSameUser(Integer userId) { return this.user.getId().equals(userId); } + + public ClubPositionGroup getPositionGroup() { + return clubPosition.getClubPositionGroup(); + } + + public void changePosition(ClubPosition newPosition) { + this.clubPosition = newPosition; + } + + public boolean canManage(ClubMember target) { + return this.getPositionGroup().canManage(target.getPositionGroup()); + } + + public boolean isVicePresident() { + return clubPosition.isVicePresident(); + } + + public boolean isManager() { + return clubPosition.isManager(); + } + + public boolean isMember() { + return clubPosition.isMember(); + } } diff --git a/src/main/java/gg/agit/konect/domain/club/model/ClubPosition.java b/src/main/java/gg/agit/konect/domain/club/model/ClubPosition.java index 8e167db0..2a3928ce 100644 --- a/src/main/java/gg/agit/konect/domain/club/model/ClubPosition.java +++ b/src/main/java/gg/agit/konect/domain/club/model/ClubPosition.java @@ -64,4 +64,34 @@ private ClubPosition(Integer id, String name, ClubPositionGroup clubPositionGrou public boolean isPresident() { return clubPositionGroup == ClubPositionGroup.PRESIDENT; } + + public boolean isVicePresident() { + return clubPositionGroup == ClubPositionGroup.VICE_PRESIDENT; + } + + public boolean isManager() { + return clubPositionGroup == ClubPositionGroup.MANAGER; + } + + public boolean isMember() { + return clubPositionGroup == ClubPositionGroup.MEMBER; + } + + public boolean canRename() { + return clubPositionGroup == ClubPositionGroup.MANAGER + || clubPositionGroup == ClubPositionGroup.MEMBER; + } + + public boolean canDelete() { + return clubPositionGroup == ClubPositionGroup.MANAGER + || clubPositionGroup == ClubPositionGroup.MEMBER; + } + + public void updateName(String newName) { + this.name = newName; + } + + public int getPriority() { + return clubPositionGroup.getPriority(); + } } diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java index 46eff01b..47c3d3d9 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java @@ -23,6 +23,19 @@ public interface ClubMemberRepository extends Repository findAllByClubId(@Param("clubId") Integer clubId); + @Query(""" + SELECT cm + FROM ClubMember cm + JOIN FETCH cm.user + JOIN FETCH cm.clubPosition cp + WHERE cm.club.id = :clubId + AND cp.clubPositionGroup = :positionGroup + """) + List findAllByClubIdAndPositionGroup( + @Param("clubId") Integer clubId, + @Param("positionGroup") ClubPositionGroup positionGroup + ); + @Query(""" SELECT cm FROM ClubMember cm @@ -99,5 +112,28 @@ boolean existsByClubIdAndUserIdAndPositionGroupIn( """) List findByUserIdIn(@Param("userIds") List userIds); + @Query(""" + SELECT COUNT(cm) + FROM ClubMember cm + WHERE cm.clubPosition.id = :positionId + """) + long countByPositionId(@Param("positionId") Integer positionId); + + @Query(""" + SELECT COUNT(cm) + FROM ClubMember cm + JOIN cm.clubPosition cp + WHERE cm.club.id = :clubId + AND cp.clubPositionGroup = :positionGroup + """) + long countByClubIdAndPositionGroup( + @Param("clubId") Integer clubId, + @Param("positionGroup") ClubPositionGroup positionGroup + ); + + void delete(ClubMember clubMember); + void deleteByUserId(Integer userId); + + ClubMember save(ClubMember clubMember); } diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java new file mode 100644 index 00000000..00b45bbc --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java @@ -0,0 +1,110 @@ +package gg.agit.konect.domain.club.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.query.Param; + +import gg.agit.konect.domain.club.enums.ClubPositionGroup; +import gg.agit.konect.domain.club.model.ClubPosition; +import gg.agit.konect.global.code.ApiResponseCode; +import gg.agit.konect.global.exception.CustomException; + +public interface ClubPositionRepository extends Repository { + + @Query(value = """ + SELECT cp + FROM ClubPosition cp + WHERE cp.id = :id + """) + Optional findById(@Param(value = "id") Integer id); + + default ClubPosition getById(Integer id) { + return findById(id).orElseThrow(() -> + CustomException.of(ApiResponseCode.NOT_FOUND_CLUB_POSITION)); + } + + @Query(value = """ + SELECT cp + FROM ClubPosition cp + WHERE cp.club.id = :clubId + ORDER BY cp.clubPositionGroup + """) + List findAllByClubId(@Param(value = "clubId") Integer clubId); + + @Query(value = """ + SELECT cp + FROM ClubPosition cp + WHERE cp.club.id = :clubId + AND cp.clubPositionGroup = :positionGroup + """) + List findAllByClubIdAndPositionGroup( + @Param(value = "clubId") Integer clubId, + @Param(value = "positionGroup") ClubPositionGroup positionGroup + ); + + @Query(value = """ + SELECT cp + FROM ClubPosition cp + WHERE cp.club.id = :clubId + AND cp.name = :name + """) + Optional findByClubIdAndName( + @Param(value = "clubId") Integer clubId, + @Param(value = "name") String name + ); + + @Query(value = """ + SELECT cp + FROM ClubPosition cp + WHERE cp.club.id = :clubId + AND cp.clubPositionGroup = :positionGroup + ORDER BY cp.id + LIMIT 1 + """) + Optional findFirstByClubIdAndPositionGroup( + @Param(value = "clubId") Integer clubId, + @Param(value = "positionGroup") ClubPositionGroup positionGroup + ); + + @Query(value = """ + SELECT COUNT(cp) + FROM ClubPosition cp + WHERE cp.club.id = :clubId + AND cp.clubPositionGroup = :positionGroup + """) + long countByClubIdAndPositionGroup( + @Param(value = "clubId") Integer clubId, + @Param(value = "positionGroup") ClubPositionGroup positionGroup + ); + + @Query(value = """ + SELECT CASE WHEN COUNT(cp) > 0 THEN true ELSE false END + FROM ClubPosition cp + WHERE cp.club.id = :clubId + AND cp.name = :name + """) + boolean existsByClubIdAndName( + @Param(value = "clubId") Integer clubId, + @Param(value = "name") String name + ); + + @Query(value = """ + SELECT CASE WHEN COUNT(cp) > 0 THEN true ELSE false END + FROM ClubPosition cp + WHERE cp.club.id = :clubId + AND cp.name = :name + AND cp.id <> :id + """) + boolean existsByClubIdAndNameAndIdNot( + @Param(value = "clubId") Integer clubId, + @Param(value = "name") String name, + @Param(value = "id") Integer id + ); + + ClubPosition save(ClubPosition clubPosition); + + void delete(ClubPosition clubPosition); +} diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java new file mode 100644 index 00000000..579ccc97 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java @@ -0,0 +1,201 @@ +package gg.agit.konect.domain.club.service; + +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.MANAGER; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.PRESIDENT; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.VICE_PRESIDENT; +import static gg.agit.konect.global.code.ApiResponseCode.*; + +import java.util.Optional; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import gg.agit.konect.domain.club.dto.MemberPositionChangeRequest; +import gg.agit.konect.domain.club.dto.PresidentTransferRequest; +import gg.agit.konect.domain.club.dto.VicePresidentChangeRequest; +import gg.agit.konect.domain.club.enums.ClubPositionGroup; +import gg.agit.konect.domain.club.model.Club; +import gg.agit.konect.domain.club.model.ClubMember; +import gg.agit.konect.domain.club.model.ClubPosition; +import gg.agit.konect.domain.club.repository.ClubMemberRepository; +import gg.agit.konect.domain.club.repository.ClubPositionRepository; +import gg.agit.konect.domain.club.repository.ClubRepository; +import gg.agit.konect.domain.user.model.User; +import gg.agit.konect.domain.user.repository.UserRepository; +import gg.agit.konect.global.exception.CustomException; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class ClubMemberManagementService { + + private final ClubRepository clubRepository; + private final ClubMemberRepository clubMemberRepository; + private final ClubPositionRepository clubPositionRepository; + private final UserRepository userRepository; + + @Transactional + public void changeMemberPosition( + Integer clubId, + Integer targetUserId, + Integer requesterId, + MemberPositionChangeRequest request + ) { + Club club = clubRepository.getById(clubId); + + if (targetUserId.equals(requesterId)) { + throw CustomException.of(CANNOT_CHANGE_OWN_POSITION); + } + + ClubMember requester = clubMemberRepository.findByClubIdAndUserId(clubId, requesterId) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + + ClubMember target = clubMemberRepository.findByClubIdAndUserId(clubId, targetUserId) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + + if (!requester.canManage(target)) { + throw CustomException.of(CANNOT_MANAGE_HIGHER_POSITION); + } + + ClubPosition newPosition = clubPositionRepository.getById(request.positionId()); + + if (!newPosition.getClub().getId().equals(clubId)) { + throw CustomException.of(NOT_FOUND_CLUB_POSITION); + } + + ClubPositionGroup newPositionGroup = newPosition.getClubPositionGroup(); + + if (!requester.getPositionGroup().canManage(newPositionGroup)) { + throw CustomException.of(FORBIDDEN_MEMBER_POSITION_CHANGE); + } + + if (newPositionGroup == VICE_PRESIDENT) { + long vicePresidentCount = clubMemberRepository.countByClubIdAndPositionGroup(clubId, VICE_PRESIDENT); + if (vicePresidentCount >= 1) { + throw CustomException.of(VICE_PRESIDENT_ALREADY_EXISTS); + } + } + + if (newPositionGroup == MANAGER) { + long managerCount = clubMemberRepository.countByClubIdAndPositionGroup(clubId, MANAGER); + if (managerCount >= 20) { + throw CustomException.of(MANAGER_LIMIT_EXCEEDED); + } + } + + target.changePosition(newPosition); + } + + @Transactional + public void transferPresident( + Integer clubId, + Integer currentPresidentId, + PresidentTransferRequest request + ) { + Club club = clubRepository.getById(clubId); + + ClubMember currentPresident = clubMemberRepository.findByClubIdAndUserId(clubId, currentPresidentId) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_PRESIDENT)); + + if (!currentPresident.isPresident()) { + throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); + } + + Integer newPresidentUserId = request.newPresidentUserId(); + + if (currentPresidentId.equals(newPresidentUserId)) { + throw CustomException.of(ILLEGAL_ARGUMENT); + } + + ClubMember newPresident = clubMemberRepository.findByClubIdAndUserId(clubId, newPresidentUserId) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + + ClubPosition presidentPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, PRESIDENT) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + + ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, ClubPositionGroup.MEMBER) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + + currentPresident.changePosition(memberPosition); + newPresident.changePosition(presidentPosition); + } + + @Transactional + public void changeVicePresident( + Integer clubId, + Integer requesterId, + VicePresidentChangeRequest request + ) { + Club club = clubRepository.getById(clubId); + + ClubMember requester = clubMemberRepository.findByClubIdAndUserId(clubId, requesterId) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + + if (!requester.isPresident()) { + throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); + } + + ClubPosition vicePresidentPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, VICE_PRESIDENT) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + + Optional currentVicePresidentOpt = clubMemberRepository.findAllByClubIdAndPositionGroup(clubId, VICE_PRESIDENT) + .stream() + .findFirst(); + + Integer newVicePresidentUserId = request.vicePresidentUserId(); + + if (newVicePresidentUserId == null) { + if (currentVicePresidentOpt.isPresent()) { + ClubMember currentVicePresident = currentVicePresidentOpt.get(); + ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, ClubPositionGroup.MEMBER) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + currentVicePresident.changePosition(memberPosition); + } + return; + } + + if (requesterId.equals(newVicePresidentUserId)) { + throw CustomException.of(CANNOT_CHANGE_OWN_POSITION); + } + + ClubMember newVicePresident = clubMemberRepository.findByClubIdAndUserId(clubId, newVicePresidentUserId) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + + if (currentVicePresidentOpt.isPresent()) { + ClubMember currentVicePresident = currentVicePresidentOpt.get(); + if (!currentVicePresident.getId().getUserId().equals(newVicePresidentUserId)) { + ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, ClubPositionGroup.MEMBER) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + currentVicePresident.changePosition(memberPosition); + } + } + + newVicePresident.changePosition(vicePresidentPosition); + } + + @Transactional + public void removeMember(Integer clubId, Integer targetUserId, Integer requesterId) { + Club club = clubRepository.getById(clubId); + + if (targetUserId.equals(requesterId)) { + throw CustomException.of(CANNOT_REMOVE_SELF); + } + + ClubMember requester = clubMemberRepository.findByClubIdAndUserId(clubId, requesterId) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + + ClubMember target = clubMemberRepository.findByClubIdAndUserId(clubId, targetUserId) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + + if (target.isPresident()) { + throw CustomException.of(CANNOT_DELETE_CLUB_PRESIDENT); + } + + if (!requester.canManage(target)) { + throw CustomException.of(CANNOT_MANAGE_HIGHER_POSITION); + } + + clubMemberRepository.delete(target); + } +} diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java new file mode 100644 index 00000000..3299e629 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java @@ -0,0 +1,152 @@ +package gg.agit.konect.domain.club.service; + +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.MANAGER; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.PRESIDENT; +import static gg.agit.konect.global.code.ApiResponseCode.*; + +import java.util.EnumSet; +import java.util.List; +import java.util.Set; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import gg.agit.konect.domain.club.dto.ClubPositionCreateRequest; +import gg.agit.konect.domain.club.dto.ClubPositionUpdateRequest; +import gg.agit.konect.domain.club.dto.ClubPositionsResponse; +import gg.agit.konect.domain.club.enums.ClubPositionGroup; +import gg.agit.konect.domain.club.model.Club; +import gg.agit.konect.domain.club.model.ClubPosition; +import gg.agit.konect.domain.club.repository.ClubMemberRepository; +import gg.agit.konect.domain.club.repository.ClubPositionRepository; +import gg.agit.konect.domain.club.repository.ClubRepository; +import gg.agit.konect.global.exception.CustomException; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class ClubPositionService { + + private static final Set MANAGER_ALLOWED_GROUPS = + EnumSet.of(PRESIDENT, MANAGER); + + private final ClubRepository clubRepository; + private final ClubPositionRepository clubPositionRepository; + private final ClubMemberRepository clubMemberRepository; + + public ClubPositionsResponse getClubPositions(Integer clubId, Integer userId) { + Club club = clubRepository.getById(clubId); + + List positions = clubPositionRepository.findAllByClubId(clubId); + + List positionResponses = positions.stream() + .map(position -> { + long memberCount = clubMemberRepository.countByPositionId(position.getId()); + return ClubPositionsResponse.InnerClubPosition.of(position, memberCount); + }) + .toList(); + + return ClubPositionsResponse.of(positionResponses); + } + + @Transactional + public ClubPositionsResponse createClubPosition( + Integer clubId, + Integer userId, + ClubPositionCreateRequest request + ) { + Club club = clubRepository.getById(clubId); + + validateManagerPermission(clubId, userId); + + ClubPositionGroup positionGroup = request.positionGroup(); + if (positionGroup == ClubPositionGroup.PRESIDENT || positionGroup == ClubPositionGroup.VICE_PRESIDENT) { + throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); + } + + if (clubPositionRepository.existsByClubIdAndName(clubId, request.name())) { + throw CustomException.of(POSITION_NAME_DUPLICATED); + } + + ClubPosition newPosition = ClubPosition.builder() + .name(request.name()) + .clubPositionGroup(positionGroup) + .club(club) + .build(); + + clubPositionRepository.save(newPosition); + + return getClubPositions(clubId, userId); + } + + @Transactional + public ClubPositionsResponse updateClubPositionName( + Integer clubId, + Integer positionId, + Integer userId, + ClubPositionUpdateRequest request + ) { + Club club = clubRepository.getById(clubId); + + validateManagerPermission(clubId, userId); + + ClubPosition position = clubPositionRepository.getById(positionId); + + if (!position.getClub().getId().equals(clubId)) { + throw CustomException.of(NOT_FOUND_CLUB_POSITION); + } + + if (!position.canRename()) { + throw CustomException.of(FORBIDDEN_POSITION_NAME_CHANGE); + } + + if (clubPositionRepository.existsByClubIdAndNameAndIdNot(clubId, request.name(), positionId)) { + throw CustomException.of(POSITION_NAME_DUPLICATED); + } + + position.updateName(request.name()); + + return getClubPositions(clubId, userId); + } + + @Transactional + public void deleteClubPosition(Integer clubId, Integer positionId, Integer userId) { + Club club = clubRepository.getById(clubId); + + validateManagerPermission(clubId, userId); + + ClubPosition position = clubPositionRepository.getById(positionId); + + if (!position.getClub().getId().equals(clubId)) { + throw CustomException.of(NOT_FOUND_CLUB_POSITION); + } + + if (!position.canDelete()) { + throw CustomException.of(CANNOT_DELETE_ESSENTIAL_POSITION); + } + + long memberCount = clubMemberRepository.countByPositionId(positionId); + if (memberCount > 0) { + throw CustomException.of(POSITION_IN_USE); + } + + ClubPositionGroup positionGroup = position.getClubPositionGroup(); + long sameGroupCount = clubPositionRepository.countByClubIdAndPositionGroup(clubId, positionGroup); + if (sameGroupCount < 2) { + throw CustomException.of(INSUFFICIENT_POSITION_COUNT); + } + + clubPositionRepository.delete(position); + } + + private void validateManagerPermission(Integer clubId, Integer userId) { + boolean hasPermission = clubMemberRepository.existsByClubIdAndUserIdAndPositionGroupIn( + clubId, userId, MANAGER_ALLOWED_GROUPS + ); + + if (!hasPermission) { + throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); + } + } +} diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java index 474f3e45..8b916959 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java @@ -29,6 +29,7 @@ import gg.agit.konect.domain.club.dto.ClubDetailResponse; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; +import gg.agit.konect.domain.club.dto.ClubMemberCondition; import gg.agit.konect.domain.club.dto.ClubMembersResponse; import gg.agit.konect.domain.club.dto.ClubMembershipsResponse; import gg.agit.konect.domain.club.dto.ClubRecruitmentCreateRequest; @@ -43,6 +44,7 @@ import gg.agit.konect.domain.club.model.ClubApplyQuestionAnswers; import gg.agit.konect.domain.club.model.ClubMember; import gg.agit.konect.domain.club.model.ClubMembers; +import gg.agit.konect.domain.club.model.ClubPosition; import gg.agit.konect.domain.club.model.ClubRecruitment; import gg.agit.konect.domain.club.model.ClubRecruitmentImage; import gg.agit.konect.domain.club.model.ClubSummaryInfo; @@ -50,6 +52,7 @@ import gg.agit.konect.domain.club.repository.ClubApplyQuestionRepository; import gg.agit.konect.domain.club.repository.ClubApplyRepository; import gg.agit.konect.domain.club.repository.ClubMemberRepository; +import gg.agit.konect.domain.club.repository.ClubPositionRepository; import gg.agit.konect.domain.club.repository.ClubQueryRepository; import gg.agit.konect.domain.club.repository.ClubRecruitmentRepository; import gg.agit.konect.domain.club.repository.ClubRepository; @@ -71,6 +74,7 @@ public class ClubService { private final ClubQueryRepository clubQueryRepository; private final ClubRepository clubRepository; private final ClubMemberRepository clubMemberRepository; + private final ClubPositionRepository clubPositionRepository; private final ClubRecruitmentRepository clubRecruitmentRepository; private final ClubApplyRepository clubApplyRepository; private final ClubApplyQuestionRepository clubApplyQuestionRepository; @@ -162,13 +166,19 @@ private List findApplicationsByRecruitmentPeriod( ); } - public ClubMembersResponse getClubMembers(Integer clubId, Integer userId) { + public ClubMembersResponse getClubMembers(Integer clubId, Integer userId, ClubMemberCondition condition) { boolean isMember = clubMemberRepository.existsByClubIdAndUserId(clubId, userId); if (!isMember) { throw CustomException.of(FORBIDDEN_CLUB_MEMBER_ACCESS); } - List clubMembers = clubMemberRepository.findAllByClubId(clubId); + List clubMembers; + if (condition != null && condition.positionGroup() != null) { + clubMembers = clubMemberRepository.findAllByClubIdAndPositionGroup(clubId, condition.positionGroup()); + } else { + clubMembers = clubMemberRepository.findAllByClubId(clubId); + } + return ClubMembersResponse.from(clubMembers); } diff --git a/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java b/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java index 2419c7d2..7ec4b6ab 100644 --- a/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java +++ b/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java @@ -21,8 +21,16 @@ public enum ApiResponseCode { FAILED_EXTRACT_EMAIL(HttpStatus.BAD_REQUEST, "OAuth 로그인 과정에서 이메일 정보를 가져올 수 없습니다."), FAILED_EXTRACT_PROVIDER_ID(HttpStatus.BAD_REQUEST, "OAuth 로그인 과정에서 제공자 식별자를 가져올 수 없습니다."), CANNOT_CREATE_CHAT_ROOM_WITH_SELF(HttpStatus.BAD_REQUEST, "자기 자신과는 채팅방을 만들 수 없습니다."), - REQUIRED_CLUB_APPLY_ANSWER_MISSING(HttpStatus.BAD_REQUEST, "필수 가입 답변이 누락되었습니다."), + CANNOT_CHANGE_OWN_POSITION(HttpStatus.BAD_REQUEST, "자기 자신의 직책은 변경할 수 없습니다."), CANNOT_DELETE_CLUB_PRESIDENT(HttpStatus.BAD_REQUEST, "동아리 회장인 경우 회장을 양도하고 탈퇴해야 합니다."), + CANNOT_DELETE_ESSENTIAL_POSITION(HttpStatus.BAD_REQUEST, "필수 직책은 삭제할 수 없습니다."), + CANNOT_MANAGE_HIGHER_POSITION(HttpStatus.BAD_REQUEST, "자신보다 높은 직급의 회원은 관리할 수 없습니다."), + CANNOT_REMOVE_SELF(HttpStatus.BAD_REQUEST, "자기 자신을 강제 탈퇴시킬 수 없습니다."), + INSUFFICIENT_POSITION_COUNT(HttpStatus.BAD_REQUEST, "해당 그룹에 최소 2개의 직책이 있어야 삭제 가능합니다."), + MANAGER_LIMIT_EXCEEDED(HttpStatus.BAD_REQUEST, "운영진은 최대 20명까지 임명 가능합니다."), + POSITION_IN_USE(HttpStatus.BAD_REQUEST, "해당 직책을 사용 중인 회원이 있어 삭제할 수 없습니다."), + POSITION_NAME_DUPLICATED(HttpStatus.BAD_REQUEST, "동일한 직책 이름이 이미 존재합니다."), + REQUIRED_CLUB_APPLY_ANSWER_MISSING(HttpStatus.BAD_REQUEST, "필수 가입 답변이 누락되었습니다."), STUDY_TIMER_NOT_RUNNING(HttpStatus.BAD_REQUEST, "실행 중인 스터디 타이머가 없습니다."), STUDY_TIMER_TIME_MISMATCH(HttpStatus.BAD_REQUEST, "스터디 타이머 시간이 유효하지 않습니다."), INVALID_RECRUITMENT_DATE_NOT_ALLOWED(HttpStatus.BAD_REQUEST, "상시 모집인 경우 모집 시작일과 마감일을 지정할 수 없습니다."), @@ -37,8 +45,10 @@ public enum ApiResponseCode { FORBIDDEN_CLUB_FEE_INFO(HttpStatus.FORBIDDEN, "회비 정보 조회 권한이 없습니다."), FORBIDDEN_CLUB_MANAGER_ACCESS(HttpStatus.FORBIDDEN, "동아리 매니저 권한이 없습니다."), FORBIDDEN_CLUB_MEMBER_ACCESS(HttpStatus.FORBIDDEN, "동아리 멤버 조회 권한이 없습니다."), - FORBIDDEN_COUNCIL_NOTICE_ACCESS(HttpStatus.FORBIDDEN, "총동아리연합회 공지사항 조회 권한이 없습니다."), FORBIDDEN_CLUB_RECRUITMENT_CREATE(HttpStatus.FORBIDDEN, "동아리 모집 공고를 생성할 권한이 없습니다."), + FORBIDDEN_COUNCIL_NOTICE_ACCESS(HttpStatus.FORBIDDEN, "총동아리연합회 공지사항 조회 권한이 없습니다."), + FORBIDDEN_MEMBER_POSITION_CHANGE(HttpStatus.FORBIDDEN, "회원 직책 변경 권한이 없습니다."), + FORBIDDEN_POSITION_NAME_CHANGE(HttpStatus.FORBIDDEN, "해당 직책의 이름은 변경할 수 없습니다."), // 404 Not Found (리소스를 찾을 수 없음) NO_HANDLER_FOUND(HttpStatus.NOT_FOUND, "유효하지 않은 API 경로입니다."), @@ -53,6 +63,7 @@ public enum ApiResponseCode { NOT_FOUND_UNREGISTERED_USER(HttpStatus.NOT_FOUND, "임시 유저를 찾을 수 없습니다."), UNIVERSITY_NOT_FOUND(HttpStatus.NOT_FOUND, "대학교를 찾을 수 없습니다."), NOT_FOUND_CLUB_APPLY_QUESTION(HttpStatus.NOT_FOUND, "동아리 가입 문항을 찾을 수 없습니다."), + NOT_FOUND_CLUB_POSITION(HttpStatus.NOT_FOUND, "동아리 직책을 찾을 수 없습니다."), NOT_FOUND_RANKING_TYPE(HttpStatus.NOT_FOUND, "순위 타입을 찾을 수 없습니다."), NOT_FOUND_BANK(HttpStatus.NOT_FOUND, "해당하는 은행을 찾을 수 없습니다."), @@ -67,6 +78,7 @@ public enum ApiResponseCode { DUPLICATE_PHONE_NUMBER(HttpStatus.CONFLICT, "이미 사용 중인 전화번호입니다."), ALREADY_APPLIED_CLUB(HttpStatus.CONFLICT, "이미 동아리에 가입 신청을 완료했습니다."), DUPLICATE_CLUB_APPLY_QUESTION(HttpStatus.CONFLICT, "중복된 가입 문항이 포함되어 있습니다."), + VICE_PRESIDENT_ALREADY_EXISTS(HttpStatus.CONFLICT, "부회장은 이미 존재합니다."), ALREADY_RUNNING_STUDY_TIMER(HttpStatus.CONFLICT, "이미 실행 중인 스터디 타이머가 있습니다."), ALREADY_EXIST_CLUB_RECRUITMENT(HttpStatus.CONFLICT, "이미 동아리 모집 공고가 존재합니다."), From cd44c7f70be06372ca744d2e19bbb7a124347e8f Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Mon, 19 Jan 2026 17:23:48 +0900 Subject: [PATCH 03/17] =?UTF-8?q?feat:=20=EB=8F=99=EC=95=84=EB=A6=AC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84(?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EA=B6=8C=ED=95=9C=20=EA=B7=B8=EB=A3=B9=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/club/controller/ClubApi.java | 16 ++++++ .../club/controller/ClubController.java | 10 ++++ .../domain/club/dto/ClubCreateRequest.java | 53 +++++++++++++++++++ .../club/repository/ClubRepository.java | 2 + .../domain/club/service/ClubService.java | 48 +++++++++++++++++ 5 files changed, 129 insertions(+) create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubCreateRequest.java diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java index 5bc66c5a..284c4c1e 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java @@ -18,6 +18,7 @@ import gg.agit.konect.domain.club.dto.ClubApplyQuestionsResponse; import gg.agit.konect.domain.club.dto.ClubApplyRequest; import gg.agit.konect.domain.club.dto.ClubCondition; +import gg.agit.konect.domain.club.dto.ClubCreateRequest; import gg.agit.konect.domain.club.dto.ClubDetailResponse; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; @@ -64,6 +65,21 @@ ResponseEntity getClubDetail( @UserId Integer userId ); + @Operation(summary = "동아리를 생성한다.", description = """ + 새로운 동아리를 생성합니다. + 동아리 생성 시 기본 직책 4개(회장, 부회장, 운영진, 일반회원)가 자동으로 생성되며, + 생성자는 자동으로 회장으로 등록됩니다. + + ## 에러 + - INVALID_REQUEST_BODY (400): 요청 본문의 형식이 올바르지 않거나 필수 값이 누락된 경우 + - NOT_FOUND_USER (404): 유저를 찾을 수 없습니다. + """) + @PostMapping + ResponseEntity createClub( + @Valid @RequestBody ClubCreateRequest request, + @UserId Integer userId + ); + @Operation(summary = "가입한 동아리 리스트를 조회한다.") @GetMapping("/joined") ResponseEntity getJoinedClubs( diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java index 62fc2001..b0d75ae4 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java @@ -14,6 +14,7 @@ import gg.agit.konect.domain.club.dto.ClubApplyQuestionsResponse; import gg.agit.konect.domain.club.dto.ClubApplyRequest; import gg.agit.konect.domain.club.dto.ClubCondition; +import gg.agit.konect.domain.club.dto.ClubCreateRequest; import gg.agit.konect.domain.club.dto.ClubDetailResponse; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; @@ -64,6 +65,15 @@ public ResponseEntity getClubDetail( return ResponseEntity.ok(response); } + @Override + public ResponseEntity createClub( + @Valid @RequestBody ClubCreateRequest request, + @UserId Integer userId + ) { + ClubDetailResponse response = clubService.createClub(userId, request); + return ResponseEntity.ok(response); + } + @Override public ResponseEntity getJoinedClubs(@UserId Integer userId) { ClubMembershipsResponse response = clubService.getJoinedClubs(userId); diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubCreateRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubCreateRequest.java new file mode 100644 index 00000000..fd12fdb0 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubCreateRequest.java @@ -0,0 +1,53 @@ +package gg.agit.konect.domain.club.dto; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import gg.agit.konect.domain.club.enums.ClubCategory; +import gg.agit.konect.domain.club.model.Club; +import gg.agit.konect.domain.university.model.University; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +public record ClubCreateRequest( + @NotBlank(message = "동아리 이름은 필수 입력입니다.") + @Size(max = 50, message = "동아리 이름은 최대 50자까지 입력 가능합니다.") + @Schema(description = "동아리 이름", example = "BCSD Lab", requiredMode = REQUIRED) + String name, + + @NotBlank(message = "동아리 설명은 필수 입력입니다.") + @Size(max = 100, message = "동아리 설명은 최대 100자까지 입력 가능합니다.") + @Schema(description = "동아리 한 줄 소개", example = "코리아텍 중앙 SW 개발 동아리", requiredMode = REQUIRED) + String description, + + @NotBlank(message = "동아리 소개는 필수 입력입니다.") + @Schema(description = "동아리 상세 소개", example = "BCSD Lab은...", requiredMode = REQUIRED) + String introduce, + + @NotBlank(message = "동아리 이미지 URL은 필수 입력입니다.") + @Size(max = 255, message = "이미지 URL은 최대 255자까지 입력 가능합니다.") + @Schema(description = "동아리 대표 이미지 URL", example = "https://example.com/image.png", requiredMode = REQUIRED) + String imageUrl, + + @NotBlank(message = "동아리 위치는 필수 입력입니다.") + @Size(max = 255, message = "위치는 최대 255자까지 입력 가능합니다.") + @Schema(description = "동아리 위치", example = "다솔관 123호", requiredMode = REQUIRED) + String location, + + @NotNull(message = "동아리 카테고리는 필수 입력입니다.") + @Schema(description = "동아리 카테고리", example = "IT", requiredMode = REQUIRED) + ClubCategory clubCategory +) { + public Club toEntity(University university) { + return Club.builder() + .name(name) + .description(description) + .introduce(introduce) + .imageUrl(imageUrl) + .location(location) + .clubCategory(clubCategory) + .university(university) + .build(); + } +} diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubRepository.java index 2d563f7e..6fa8e58d 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubRepository.java @@ -24,4 +24,6 @@ default Club getById(Integer id) { return findById(id).orElseThrow(() -> CustomException.of(ApiResponseCode.NOT_FOUND_CLUB)); } + + Club save(Club club); } diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java index 8b916959..f1a1631d 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java @@ -1,7 +1,9 @@ package gg.agit.konect.domain.club.service; import static gg.agit.konect.domain.club.enums.ClubPositionGroup.MANAGER; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.MEMBER; import static gg.agit.konect.domain.club.enums.ClubPositionGroup.PRESIDENT; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.VICE_PRESIDENT; import static gg.agit.konect.global.code.ApiResponseCode.*; import java.time.LocalDateTime; @@ -26,6 +28,7 @@ import gg.agit.konect.domain.club.dto.ClubApplyQuestionsResponse; import gg.agit.konect.domain.club.dto.ClubApplyRequest; import gg.agit.konect.domain.club.dto.ClubCondition; +import gg.agit.konect.domain.club.dto.ClubCreateRequest; import gg.agit.konect.domain.club.dto.ClubDetailResponse; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; @@ -424,6 +427,51 @@ public void updateRecruitment(Integer clubId, Integer userId, ClubRecruitmentUpd } } + @Transactional + public ClubDetailResponse createClub(Integer userId, ClubCreateRequest request) { + User user = userRepository.getById(userId); + Club club = request.toEntity(user.getUniversity()); + + Club savedClub = clubRepository.save(club); + + List defaultPositions = List.of( + ClubPosition.builder() + .name("회장") + .clubPositionGroup(PRESIDENT) + .club(savedClub) + .build(), + ClubPosition.builder() + .name("부회장") + .clubPositionGroup(VICE_PRESIDENT) + .club(savedClub) + .build(), + ClubPosition.builder() + .name("운영진") + .clubPositionGroup(MANAGER) + .club(savedClub) + .build(), + ClubPosition.builder() + .name("일반회원") + .clubPositionGroup(MEMBER) + .club(savedClub) + .build() + ); + + defaultPositions.forEach(clubPositionRepository::save); + + ClubPosition presidentPosition = defaultPositions.get(0); + ClubMember president = ClubMember.builder() + .club(savedClub) + .user(user) + .clubPosition(presidentPosition) + .isFeePaid(false) + .build(); + + clubMemberRepository.save(president); + + return getClubDetail(savedClub.getId(), userId); + } + private boolean hasClubManageAccess( Integer clubId, Integer userId, From 40961309bb51f2ab128e39be0f28dca83d260108 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Mon, 19 Jan 2026 19:25:45 +0900 Subject: [PATCH 04/17] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ClubMemberManagementService.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java index 579ccc97..469b3820 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java @@ -1,8 +1,6 @@ package gg.agit.konect.domain.club.service; -import static gg.agit.konect.domain.club.enums.ClubPositionGroup.MANAGER; -import static gg.agit.konect.domain.club.enums.ClubPositionGroup.PRESIDENT; -import static gg.agit.konect.domain.club.enums.ClubPositionGroup.VICE_PRESIDENT; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.*; import static gg.agit.konect.global.code.ApiResponseCode.*; import java.util.Optional; @@ -20,7 +18,6 @@ import gg.agit.konect.domain.club.repository.ClubMemberRepository; import gg.agit.konect.domain.club.repository.ClubPositionRepository; import gg.agit.konect.domain.club.repository.ClubRepository; -import gg.agit.konect.domain.user.model.User; import gg.agit.konect.domain.user.repository.UserRepository; import gg.agit.konect.global.exception.CustomException; import lombok.RequiredArgsConstructor; @@ -30,6 +27,7 @@ @Transactional(readOnly = true) public class ClubMemberManagementService { + public static final int MAX_MANAGER_COUNT = 20; private final ClubRepository clubRepository; private final ClubMemberRepository clubMemberRepository; private final ClubPositionRepository clubPositionRepository; @@ -79,7 +77,7 @@ public void changeMemberPosition( if (newPositionGroup == MANAGER) { long managerCount = clubMemberRepository.countByClubIdAndPositionGroup(clubId, MANAGER); - if (managerCount >= 20) { + if (managerCount >= MAX_MANAGER_COUNT) { throw CustomException.of(MANAGER_LIMIT_EXCEEDED); } } @@ -114,7 +112,8 @@ public void transferPresident( ClubPosition presidentPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, PRESIDENT) .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); - ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, ClubPositionGroup.MEMBER) + ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, + ClubPositionGroup.MEMBER) .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); currentPresident.changePosition(memberPosition); @@ -136,10 +135,12 @@ public void changeVicePresident( throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); } - ClubPosition vicePresidentPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, VICE_PRESIDENT) + ClubPosition vicePresidentPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, + VICE_PRESIDENT) .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); - Optional currentVicePresidentOpt = clubMemberRepository.findAllByClubIdAndPositionGroup(clubId, VICE_PRESIDENT) + Optional currentVicePresidentOpt = clubMemberRepository.findAllByClubIdAndPositionGroup(clubId, + VICE_PRESIDENT) .stream() .findFirst(); @@ -148,7 +149,8 @@ public void changeVicePresident( if (newVicePresidentUserId == null) { if (currentVicePresidentOpt.isPresent()) { ClubMember currentVicePresident = currentVicePresidentOpt.get(); - ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, ClubPositionGroup.MEMBER) + ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, + ClubPositionGroup.MEMBER) .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); currentVicePresident.changePosition(memberPosition); } @@ -165,7 +167,8 @@ public void changeVicePresident( if (currentVicePresidentOpt.isPresent()) { ClubMember currentVicePresident = currentVicePresidentOpt.get(); if (!currentVicePresident.getId().getUserId().equals(newVicePresidentUserId)) { - ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, ClubPositionGroup.MEMBER) + ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, + ClubPositionGroup.MEMBER) .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); currentVicePresident.changePosition(memberPosition); } From da78a290021d5df894b388968e139d65fb532f8b Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Mon, 19 Jan 2026 20:25:08 +0900 Subject: [PATCH 05/17] =?UTF-8?q?feat:=20=EC=A7=81=EA=B8=89=20=EB=82=B4=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EA=B0=80=EB=82=98=EB=8B=A4=20=EC=88=9C?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=A0=95=EB=A0=AC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konect/domain/club/repository/ClubMemberRepository.java | 4 +++- .../konect/domain/club/repository/ClubPositionRepository.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java index 47c3d3d9..f8a300bb 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java @@ -18,8 +18,9 @@ public interface ClubMemberRepository extends Repository findAllByClubId(@Param("clubId") Integer clubId); @@ -30,6 +31,7 @@ public interface ClubMemberRepository extends Repository findAllByClubIdAndPositionGroup( @Param("clubId") Integer clubId, diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java index 00b45bbc..474d906d 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java @@ -30,7 +30,7 @@ default ClubPosition getById(Integer id) { SELECT cp FROM ClubPosition cp WHERE cp.club.id = :clubId - ORDER BY cp.clubPositionGroup + ORDER BY cp.clubPositionGroup ASC, cp.name ASC """) List findAllByClubId(@Param(value = "clubId") Integer clubId); From a01dc72d3e219dbb42de6fb55eb5b92ee9ceec07 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Mon, 19 Jan 2026 20:28:49 +0900 Subject: [PATCH 06/17] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A4=91=EB=B3=B5=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konect/domain/club/repository/ClubMemberRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java index 3108d89e..aa1b515f 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java @@ -134,9 +134,9 @@ long countByClubIdAndPositionGroup( ); void delete(ClubMember clubMember); + ClubMember save(ClubMember clubMember); void deleteByUserId(Integer userId); - ClubMember save(ClubMember clubMember); } From 641ee0b2ceb39fc1649ac972a2a72b990121a3ea Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Mon, 19 Jan 2026 21:55:21 +0900 Subject: [PATCH 07/17] =?UTF-8?q?refactor:=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0,=20ClubPositionReposito?= =?UTF-8?q?ry=EC=9D=98=20=EC=A0=95=EB=A0=AC=20=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konect/domain/club/model/ClubMember.java | 12 +++ .../club/repository/ClubMemberRepository.java | 9 ++- .../repository/ClubPositionRepository.java | 41 +++++++++- .../domain/club/service/ClubService.java | 80 ++++++------------- .../konect/global/code/ApiResponseCode.java | 4 +- 5 files changed, 86 insertions(+), 60 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java b/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java index 1ade6999..8b300616 100644 --- a/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java +++ b/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java @@ -63,4 +63,16 @@ public boolean isSameUser(Integer userId) { public void updatePosition(ClubPosition clubPosition) { this.clubPosition = clubPosition; } + + public void changePosition(ClubPosition clubPosition) { + this.clubPosition = clubPosition; + } + + public ClubPositionGroup getPositionGroup() { + return this.clubPosition.getClubPositionGroup(); + } + + public boolean canManage(ClubMember target) { + return this.getPositionGroup().canManage(target.getPositionGroup()); + } } diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java index aa1b515f..234fed03 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java @@ -20,7 +20,14 @@ public interface ClubMemberRepository extends Repository findAllByClubId(@Param("clubId") Integer clubId); diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java index 85ee707d..5aa5e01b 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java @@ -1,12 +1,51 @@ package gg.agit.konect.domain.club.repository; +import static gg.agit.konect.global.code.ApiResponseCode.NOT_FOUND_CLUB_POSITION; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; +import org.springframework.data.repository.query.Param; +import gg.agit.konect.domain.club.enums.ClubPositionGroup; import gg.agit.konect.domain.club.model.ClubPosition; +import gg.agit.konect.global.exception.CustomException; public interface ClubPositionRepository extends Repository { ClubPosition save(ClubPosition clubPosition); -} + void delete(ClubPosition clubPosition); + + Optional findById(Integer id); + + default ClubPosition getById(Integer id) { + return findById(id) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + } + @Query(""" + SELECT cp + FROM ClubPosition cp + WHERE cp.club.id = :clubId + ORDER BY + CASE cp.clubPositionGroup + WHEN gg.agit.konect.domain.club.enums.ClubPositionGroup.PRESIDENT THEN 0 + WHEN gg.agit.konect.domain.club.enums.ClubPositionGroup.VICE_PRESIDENT THEN 1 + WHEN gg.agit.konect.domain.club.enums.ClubPositionGroup.MANAGER THEN 2 + WHEN gg.agit.konect.domain.club.enums.ClubPositionGroup.MEMBER THEN 3 + END ASC, + cp.name ASC + """) + List findAllByClubId(@Param("clubId") Integer clubId); + + boolean existsByClubIdAndName(Integer clubId, String name); + + boolean existsByClubIdAndNameAndIdNot(Integer clubId, String name, Integer id); + + long countByClubIdAndPositionGroup(Integer clubId, ClubPositionGroup positionGroup); + + Optional findFirstByClubIdAndPositionGroup(Integer clubId, ClubPositionGroup positionGroup); +} diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java index 1f1e8b65..3a6e0f66 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java @@ -1,9 +1,6 @@ package gg.agit.konect.domain.club.service; -import static gg.agit.konect.domain.club.enums.ClubPositionGroup.MANAGER; -import static gg.agit.konect.domain.club.enums.ClubPositionGroup.MEMBER; -import static gg.agit.konect.domain.club.enums.ClubPositionGroup.PRESIDENT; -import static gg.agit.konect.domain.club.enums.ClubPositionGroup.VICE_PRESIDENT; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.*; import static gg.agit.konect.global.code.ApiResponseCode.*; import java.time.LocalDateTime; @@ -117,14 +114,32 @@ public ClubDetailResponse createClub(Integer userId, ClubCreateRequest request) Club savedClub = clubRepository.save(club); - ClubPosition presidentPosition = ClubPosition.builder() - .name("회장") - .clubPositionGroup(PRESIDENT) - .club(savedClub) - .build(); + List defaultPositions = List.of( + ClubPosition.builder() + .name("회장") + .clubPositionGroup(PRESIDENT) + .club(savedClub) + .build(), + ClubPosition.builder() + .name("부회장") + .clubPositionGroup(VICE_PRESIDENT) + .club(savedClub) + .build(), + ClubPosition.builder() + .name("운영진") + .clubPositionGroup(MANAGER) + .club(savedClub) + .build(), + ClubPosition.builder() + .name("일반회원") + .clubPositionGroup(MEMBER) + .club(savedClub) + .build() + ); - clubPositionRepository.save(presidentPosition); + defaultPositions.forEach(clubPositionRepository::save); + ClubPosition presidentPosition = defaultPositions.get(0); ClubMember president = ClubMember.builder() .club(savedClub) .user(user) @@ -476,51 +491,6 @@ public void updateRecruitment(Integer clubId, Integer userId, ClubRecruitmentUpd } } - @Transactional - public ClubDetailResponse createClub(Integer userId, ClubCreateRequest request) { - User user = userRepository.getById(userId); - Club club = request.toEntity(user.getUniversity()); - - Club savedClub = clubRepository.save(club); - - List defaultPositions = List.of( - ClubPosition.builder() - .name("회장") - .clubPositionGroup(PRESIDENT) - .club(savedClub) - .build(), - ClubPosition.builder() - .name("부회장") - .clubPositionGroup(VICE_PRESIDENT) - .club(savedClub) - .build(), - ClubPosition.builder() - .name("운영진") - .clubPositionGroup(MANAGER) - .club(savedClub) - .build(), - ClubPosition.builder() - .name("일반회원") - .clubPositionGroup(MEMBER) - .club(savedClub) - .build() - ); - - defaultPositions.forEach(clubPositionRepository::save); - - ClubPosition presidentPosition = defaultPositions.get(0); - ClubMember president = ClubMember.builder() - .club(savedClub) - .user(user) - .clubPosition(presidentPosition) - .isFeePaid(false) - .build(); - - clubMemberRepository.save(president); - - return getClubDetail(savedClub.getId(), userId); - } - private boolean hasClubManageAccess( Integer clubId, Integer userId, diff --git a/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java b/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java index 948649d8..652f398c 100644 --- a/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java +++ b/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java @@ -64,7 +64,6 @@ public enum ApiResponseCode { NOT_FOUND_UNREGISTERED_USER(HttpStatus.NOT_FOUND, "임시 유저를 찾을 수 없습니다."), UNIVERSITY_NOT_FOUND(HttpStatus.NOT_FOUND, "대학교를 찾을 수 없습니다."), NOT_FOUND_CLUB_APPLY_QUESTION(HttpStatus.NOT_FOUND, "동아리 가입 문항을 찾을 수 없습니다."), - NOT_FOUND_CLUB_POSITION(HttpStatus.NOT_FOUND, "동아리 직책을 찾을 수 없습니다."), NOT_FOUND_RANKING_TYPE(HttpStatus.NOT_FOUND, "순위 타입을 찾을 수 없습니다."), NOT_FOUND_BANK(HttpStatus.NOT_FOUND, "해당하는 은행을 찾을 수 없습니다."), @@ -85,8 +84,7 @@ public enum ApiResponseCode { // 500 Internal Server Error (서버 오류) CLIENT_ABORTED(HttpStatus.INTERNAL_SERVER_ERROR, "클라이언트에 의해 연결이 중단되었습니다."), - UNEXPECTED_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버에 예기치 못한 에러가 발생했습니다.") - ; + UNEXPECTED_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버에 예기치 못한 에러가 발생했습니다."); private final HttpStatus httpStatus; private final String message; From 1cc9a42577f5d19b11c342a8fa83eeaabe66ebac Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Tue, 20 Jan 2026 17:18:50 +0900 Subject: [PATCH 08/17] =?UTF-8?q?refactor:=20=EB=8F=99=EC=95=84=EB=A6=AC?= =?UTF-8?q?=20=EB=82=B4=20=EC=A7=81=EC=B1=85&=EA=B6=8C=ED=95=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EA=B4=80=EB=A0=A8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/club/service/ClubMemberManagementService.java | 9 +++++++++ .../konect/domain/club/service/ClubPositionService.java | 4 ++-- .../java/gg/agit/konect/global/code/ApiResponseCode.java | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java index 469b3820..d9efb721 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java @@ -49,6 +49,11 @@ public void changeMemberPosition( ClubMember requester = clubMemberRepository.findByClubIdAndUserId(clubId, requesterId) .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + ClubPositionGroup requesterGroup = requester.getPositionGroup(); + if (requesterGroup != PRESIDENT && requesterGroup != VICE_PRESIDENT) { + throw CustomException.of(FORBIDDEN_MEMBER_POSITION_CHANGE); + } + ClubMember target = clubMemberRepository.findByClubIdAndUserId(clubId, targetUserId) .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); @@ -199,6 +204,10 @@ public void removeMember(Integer clubId, Integer targetUserId, Integer requester throw CustomException.of(CANNOT_MANAGE_HIGHER_POSITION); } + if (target.getPositionGroup() != MEMBER) { + throw CustomException.of(CANNOT_REMOVE_NON_MEMBER); + } + clubMemberRepository.delete(target); } } diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java index 3299e629..b827a21b 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java @@ -1,7 +1,7 @@ package gg.agit.konect.domain.club.service; -import static gg.agit.konect.domain.club.enums.ClubPositionGroup.MANAGER; import static gg.agit.konect.domain.club.enums.ClubPositionGroup.PRESIDENT; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.VICE_PRESIDENT; import static gg.agit.konect.global.code.ApiResponseCode.*; import java.util.EnumSet; @@ -29,7 +29,7 @@ public class ClubPositionService { private static final Set MANAGER_ALLOWED_GROUPS = - EnumSet.of(PRESIDENT, MANAGER); + EnumSet.of(PRESIDENT, VICE_PRESIDENT); private final ClubRepository clubRepository; private final ClubPositionRepository clubPositionRepository; diff --git a/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java b/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java index 652f398c..209ffb86 100644 --- a/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java +++ b/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java @@ -26,6 +26,7 @@ public enum ApiResponseCode { CANNOT_DELETE_ESSENTIAL_POSITION(HttpStatus.BAD_REQUEST, "필수 직책은 삭제할 수 없습니다."), CANNOT_MANAGE_HIGHER_POSITION(HttpStatus.BAD_REQUEST, "자신보다 높은 직급의 회원은 관리할 수 없습니다."), CANNOT_REMOVE_SELF(HttpStatus.BAD_REQUEST, "자기 자신을 강제 탈퇴시킬 수 없습니다."), + CANNOT_REMOVE_NON_MEMBER(HttpStatus.BAD_REQUEST, "일반회원만 강제 탈퇴할 수 있습니다. 먼저 직책을 변경한 후 탈퇴시켜주세요."), INSUFFICIENT_POSITION_COUNT(HttpStatus.BAD_REQUEST, "해당 그룹에 최소 2개의 직책이 있어야 삭제 가능합니다."), MANAGER_LIMIT_EXCEEDED(HttpStatus.BAD_REQUEST, "운영진은 최대 20명까지 임명 가능합니다."), POSITION_IN_USE(HttpStatus.BAD_REQUEST, "해당 직책을 사용 중인 회원이 있어 삭제할 수 없습니다."), From 6729d4771dbf77468c335eaad75ede94e29b1602 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Tue, 20 Jan 2026 22:05:16 +0900 Subject: [PATCH 09/17] =?UTF-8?q?feat:=20=EA=B6=8C=ED=95=9C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EA=B2=80=ED=86=A0=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../club/repository/ClubMemberRepository.java | 7 ++ .../repository/ClubPositionRepository.java | 9 +- .../service/ClubMemberManagementService.java | 116 ++++++++---------- .../club/service/ClubPositionService.java | 2 +- 4 files changed, 67 insertions(+), 67 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java index 234fed03..b37b0927 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubMemberRepository.java @@ -11,6 +11,8 @@ import gg.agit.konect.domain.club.enums.ClubPositionGroup; import gg.agit.konect.domain.club.model.ClubMember; import gg.agit.konect.domain.club.model.ClubMemberId; +import gg.agit.konect.global.code.ApiResponseCode; +import gg.agit.konect.global.exception.CustomException; public interface ClubMemberRepository extends Repository { @@ -100,6 +102,11 @@ boolean existsByClubIdAndUserIdAndPositionGroupIn( """) Optional findByClubIdAndUserId(@Param("clubId") Integer clubId, @Param("userId") Integer userId); + default ClubMember getByClubIdAndUserId(Integer clubId, Integer userId) { + return findByClubIdAndUserId(clubId, userId) + .orElseThrow(() -> CustomException.of(ApiResponseCode.NOT_FOUND_CLUB_MEMBER)); + } + boolean existsByClubIdAndUserId(Integer clubId, Integer userId); List findByUserId(Integer userId); diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java index 5aa5e01b..0fc55f63 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubPositionRepository.java @@ -45,7 +45,12 @@ default ClubPosition getById(Integer id) { boolean existsByClubIdAndNameAndIdNot(Integer clubId, String name, Integer id); - long countByClubIdAndPositionGroup(Integer clubId, ClubPositionGroup positionGroup); + long countByClubIdAndClubPositionGroup(Integer clubId, ClubPositionGroup positionGroup); - Optional findFirstByClubIdAndPositionGroup(Integer clubId, ClubPositionGroup positionGroup); + Optional findFirstByClubIdAndClubPositionGroup(Integer clubId, ClubPositionGroup positionGroup); + + default ClubPosition getFirstByClubIdAndClubPositionGroup(Integer clubId, ClubPositionGroup positionGroup) { + return findFirstByClubIdAndClubPositionGroup(clubId, positionGroup) + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + } } diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java index d9efb721..7b682c2f 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java @@ -12,13 +12,13 @@ import gg.agit.konect.domain.club.dto.PresidentTransferRequest; import gg.agit.konect.domain.club.dto.VicePresidentChangeRequest; import gg.agit.konect.domain.club.enums.ClubPositionGroup; -import gg.agit.konect.domain.club.model.Club; import gg.agit.konect.domain.club.model.ClubMember; import gg.agit.konect.domain.club.model.ClubPosition; import gg.agit.konect.domain.club.repository.ClubMemberRepository; import gg.agit.konect.domain.club.repository.ClubPositionRepository; import gg.agit.konect.domain.club.repository.ClubRepository; import gg.agit.konect.domain.user.repository.UserRepository; +import gg.agit.konect.global.code.ApiResponseCode; import gg.agit.konect.global.exception.CustomException; import lombok.RequiredArgsConstructor; @@ -40,22 +40,14 @@ public void changeMemberPosition( Integer requesterId, MemberPositionChangeRequest request ) { - Club club = clubRepository.getById(clubId); + clubRepository.getById(clubId); - if (targetUserId.equals(requesterId)) { - throw CustomException.of(CANNOT_CHANGE_OWN_POSITION); - } - - ClubMember requester = clubMemberRepository.findByClubIdAndUserId(clubId, requesterId) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + validateNotSelf(requesterId, targetUserId, CANNOT_CHANGE_OWN_POSITION); - ClubPositionGroup requesterGroup = requester.getPositionGroup(); - if (requesterGroup != PRESIDENT && requesterGroup != VICE_PRESIDENT) { - throw CustomException.of(FORBIDDEN_MEMBER_POSITION_CHANGE); - } + ClubMember requester = clubMemberRepository.getByClubIdAndUserId(clubId, requesterId); + validateManagerPermission(requester); - ClubMember target = clubMemberRepository.findByClubIdAndUserId(clubId, targetUserId) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + ClubMember target = clubMemberRepository.getByClubIdAndUserId(clubId, targetUserId); if (!requester.canManage(target)) { throw CustomException.of(CANNOT_MANAGE_HIGHER_POSITION); @@ -75,14 +67,14 @@ public void changeMemberPosition( if (newPositionGroup == VICE_PRESIDENT) { long vicePresidentCount = clubMemberRepository.countByClubIdAndPositionGroup(clubId, VICE_PRESIDENT); - if (vicePresidentCount >= 1) { + if (target.getPositionGroup() != VICE_PRESIDENT && vicePresidentCount >= 1) { throw CustomException.of(VICE_PRESIDENT_ALREADY_EXISTS); } } if (newPositionGroup == MANAGER) { long managerCount = clubMemberRepository.countByClubIdAndPositionGroup(clubId, MANAGER); - if (managerCount >= MAX_MANAGER_COUNT) { + if (target.getPositionGroup() != MANAGER && managerCount >= MAX_MANAGER_COUNT) { throw CustomException.of(MANAGER_LIMIT_EXCEEDED); } } @@ -96,30 +88,18 @@ public void transferPresident( Integer currentPresidentId, PresidentTransferRequest request ) { - Club club = clubRepository.getById(clubId); + clubRepository.getById(clubId); - ClubMember currentPresident = clubMemberRepository.findByClubIdAndUserId(clubId, currentPresidentId) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_PRESIDENT)); - - if (!currentPresident.isPresident()) { - throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); - } + ClubMember currentPresident = clubMemberRepository.getByClubIdAndUserId(clubId, currentPresidentId); + validatePresidentPermission(currentPresident); Integer newPresidentUserId = request.newPresidentUserId(); + validateNotSelf(currentPresidentId, newPresidentUserId, ILLEGAL_ARGUMENT); - if (currentPresidentId.equals(newPresidentUserId)) { - throw CustomException.of(ILLEGAL_ARGUMENT); - } - - ClubMember newPresident = clubMemberRepository.findByClubIdAndUserId(clubId, newPresidentUserId) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + ClubMember newPresident = clubMemberRepository.getByClubIdAndUserId(clubId, newPresidentUserId); - ClubPosition presidentPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, PRESIDENT) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); - - ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, - ClubPositionGroup.MEMBER) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + ClubPosition presidentPosition = clubPositionRepository.getFirstByClubIdAndClubPositionGroup(clubId, PRESIDENT); + ClubPosition memberPosition = clubPositionRepository.getFirstByClubIdAndClubPositionGroup(clubId, MEMBER); currentPresident.changePosition(memberPosition); newPresident.changePosition(presidentPosition); @@ -131,18 +111,15 @@ public void changeVicePresident( Integer requesterId, VicePresidentChangeRequest request ) { - Club club = clubRepository.getById(clubId); + clubRepository.getById(clubId); - ClubMember requester = clubMemberRepository.findByClubIdAndUserId(clubId, requesterId) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + ClubMember requester = clubMemberRepository.getByClubIdAndUserId(clubId, requesterId); + validatePresidentPermission(requester); - if (!requester.isPresident()) { - throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); - } - - ClubPosition vicePresidentPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, - VICE_PRESIDENT) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + ClubPosition vicePresidentPosition = clubPositionRepository.getFirstByClubIdAndClubPositionGroup( + clubId, + VICE_PRESIDENT + ); Optional currentVicePresidentOpt = clubMemberRepository.findAllByClubIdAndPositionGroup(clubId, VICE_PRESIDENT) @@ -154,27 +131,22 @@ public void changeVicePresident( if (newVicePresidentUserId == null) { if (currentVicePresidentOpt.isPresent()) { ClubMember currentVicePresident = currentVicePresidentOpt.get(); - ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, - ClubPositionGroup.MEMBER) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + ClubPosition memberPosition = clubPositionRepository.getFirstByClubIdAndClubPositionGroup(clubId, + MEMBER); currentVicePresident.changePosition(memberPosition); } return; } - if (requesterId.equals(newVicePresidentUserId)) { - throw CustomException.of(CANNOT_CHANGE_OWN_POSITION); - } + validateNotSelf(requesterId, newVicePresidentUserId, CANNOT_CHANGE_OWN_POSITION); - ClubMember newVicePresident = clubMemberRepository.findByClubIdAndUserId(clubId, newVicePresidentUserId) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + ClubMember newVicePresident = clubMemberRepository.getByClubIdAndUserId(clubId, newVicePresidentUserId); if (currentVicePresidentOpt.isPresent()) { ClubMember currentVicePresident = currentVicePresidentOpt.get(); if (!currentVicePresident.getId().getUserId().equals(newVicePresidentUserId)) { - ClubPosition memberPosition = clubPositionRepository.findFirstByClubIdAndPositionGroup(clubId, - ClubPositionGroup.MEMBER) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_POSITION)); + ClubPosition memberPosition = clubPositionRepository.getFirstByClubIdAndClubPositionGroup(clubId, + MEMBER); currentVicePresident.changePosition(memberPosition); } } @@ -184,17 +156,14 @@ public void changeVicePresident( @Transactional public void removeMember(Integer clubId, Integer targetUserId, Integer requesterId) { - Club club = clubRepository.getById(clubId); + clubRepository.getById(clubId); - if (targetUserId.equals(requesterId)) { - throw CustomException.of(CANNOT_REMOVE_SELF); - } + validateNotSelf(requesterId, targetUserId, CANNOT_REMOVE_SELF); - ClubMember requester = clubMemberRepository.findByClubIdAndUserId(clubId, requesterId) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + ClubMember requester = clubMemberRepository.getByClubIdAndUserId(clubId, requesterId); + validateManagerPermission(requester); - ClubMember target = clubMemberRepository.findByClubIdAndUserId(clubId, targetUserId) - .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_MEMBER)); + ClubMember target = clubMemberRepository.getByClubIdAndUserId(clubId, targetUserId); if (target.isPresident()) { throw CustomException.of(CANNOT_DELETE_CLUB_PRESIDENT); @@ -210,4 +179,23 @@ public void removeMember(Integer clubId, Integer targetUserId, Integer requester clubMemberRepository.delete(target); } + + private void validateNotSelf(Integer userId1, Integer userId2, ApiResponseCode errorCode) { + if (userId1.equals(userId2)) { + throw CustomException.of(errorCode); + } + } + + private void validatePresidentPermission(ClubMember member) { + if (!member.isPresident()) { + throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); + } + } + + private void validateManagerPermission(ClubMember member) { + ClubPositionGroup positionGroup = member.getPositionGroup(); + if (positionGroup != PRESIDENT && positionGroup != VICE_PRESIDENT) { + throw CustomException.of(FORBIDDEN_MEMBER_POSITION_CHANGE); + } + } } diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java index b827a21b..d75fda7e 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java @@ -132,7 +132,7 @@ public void deleteClubPosition(Integer clubId, Integer positionId, Integer userI } ClubPositionGroup positionGroup = position.getClubPositionGroup(); - long sameGroupCount = clubPositionRepository.countByClubIdAndPositionGroup(clubId, positionGroup); + long sameGroupCount = clubPositionRepository.countByClubIdAndClubPositionGroup(clubId, positionGroup); if (sameGroupCount < 2) { throw CustomException.of(INSUFFICIENT_POSITION_COUNT); } From 73800744076fc50be2c74a5d697420f8b77da4be Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Wed, 21 Jan 2026 21:19:30 +0900 Subject: [PATCH 10/17] =?UTF-8?q?refactor:=20=EA=B6=8C=ED=95=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EB=B0=A9=EC=8B=9D=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/club/controller/ClubApi.java | 28 +++++++++- .../club/controller/ClubController.java | 11 ++++ .../domain/club/dto/AddMemberRequest.java | 17 ++++++ .../club/dto/ClubPositionsResponse.java | 12 +--- .../service/ClubMemberManagementService.java | 56 +++++++++++++++++++ .../club/service/ClubPositionService.java | 2 +- .../domain/club/service/ClubService.java | 28 +++------- .../council/dto/CouncilCreateRequest.java | 4 +- .../domain/council/dto/CouncilResponse.java | 4 +- .../council/dto/CouncilUpdateRequest.java | 2 +- .../konect/domain/council/model/Council.java | 14 ++--- .../council/service/CouncilService.java | 2 +- .../konect/global/code/ApiResponseCode.java | 1 + 13 files changed, 133 insertions(+), 48 deletions(-) create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/AddMemberRequest.java diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java index 7a54de88..55a8f5e3 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import gg.agit.konect.domain.club.dto.AddMemberRequest; import gg.agit.konect.domain.club.dto.ClubApplicationAnswersResponse; import gg.agit.konect.domain.club.dto.ClubApplicationsResponse; import gg.agit.konect.domain.club.dto.ClubApplyQuestionsReplaceRequest; @@ -405,15 +406,36 @@ ResponseEntity changeVicePresident( @UserId Integer userId ); + @Operation(summary = "동아리에 회원을 직접 추가한다.", description = """ + 동아리 회장 또는 부회장만 회원을 직접 추가할 수 있습니다. + 회장 직책으로는 추가할 수 없으며, 부회장과 운영진은 인원 제한이 있습니다. + + ## 에러 + - ALREADY_CLUB_MEMBER (409): 이미 동아리 회원입니다. + - VICE_PRESIDENT_ALREADY_EXISTS (409): 부회장은 이미 존재합니다. + - MANAGER_LIMIT_EXCEEDED (400): 운영진은 최대 20명까지 임명 가능합니다. + - FORBIDDEN_MEMBER_POSITION_CHANGE (403): 회원 추가 권한이 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + - NOT_FOUND_USER (404): 유저를 찾을 수 없습니다. + - NOT_FOUND_CLUB_POSITION (404): 동아리 직책을 찾을 수 없습니다. + """) + @PostMapping("/{clubId}/members") + ResponseEntity addMember( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody AddMemberRequest request, + @UserId Integer userId + ); + @Operation(summary = "동아리 회원을 강제 탈퇴시킨다.", description = """ - 동아리 회장 또는 매니저만 회원을 강제 탈퇴시킬 수 있습니다. - 자기 자신은 강제 탈퇴시킬 수 없으며, 회장은 강제 탈퇴시킬 수 없습니다. - 상위 직급만 하위 직급의 회원을 강제 탈퇴시킬 수 있습니다. + 동아리 회장 또는 부회장만 회원을 강제 탈퇴시킬 수 있습니다. + 일반회원만 강제 탈퇴 가능하며, 부회장이나 운영진은 먼저 직책을 변경한 후 탈퇴시켜야 합니다. ## 에러 - CANNOT_REMOVE_SELF (400): 자기 자신을 강제 탈퇴시킬 수 없습니다. + - CANNOT_REMOVE_NON_MEMBER (400): 일반회원만 강제 탈퇴할 수 있습니다. - CANNOT_DELETE_CLUB_PRESIDENT (400): 회장은 강제 탈퇴시킬 수 없습니다. - CANNOT_MANAGE_HIGHER_POSITION (400): 자신보다 높은 직급의 회원은 관리할 수 없습니다. + - FORBIDDEN_MEMBER_POSITION_CHANGE (403): 회원 관리 권한이 없습니다. - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. - NOT_FOUND_CLUB_MEMBER (404): 동아리 회원을 찾을 수 없습니다. """) diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java index afd4b95c..88a51697 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import gg.agit.konect.domain.club.dto.AddMemberRequest; import gg.agit.konect.domain.club.dto.ClubApplicationAnswersResponse; import gg.agit.konect.domain.club.dto.ClubApplicationsResponse; import gg.agit.konect.domain.club.dto.ClubApplyQuestionsReplaceRequest; @@ -283,6 +284,16 @@ public ResponseEntity changeVicePresident( return ResponseEntity.noContent().build(); } + @Override + public ResponseEntity addMember( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody AddMemberRequest request, + @UserId Integer userId + ) { + clubMemberManagementService.addMember(clubId, userId, request); + return ResponseEntity.ok().build(); + } + @Override public ResponseEntity removeMember( @PathVariable(name = "clubId") Integer clubId, diff --git a/src/main/java/gg/agit/konect/domain/club/dto/AddMemberRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/AddMemberRequest.java new file mode 100644 index 00000000..ef9a4e53 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/AddMemberRequest.java @@ -0,0 +1,17 @@ +package gg.agit.konect.domain.club.dto; + +import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +public record AddMemberRequest( + @NotNull(message = "사용자 ID는 필수 입력입니다.") + @Schema(description = "추가할 사용자 ID", example = "123", requiredMode = REQUIRED) + Integer userId, + + @NotNull(message = "직책 ID는 필수 입력입니다.") + @Schema(description = "부여할 직책 ID", example = "4", requiredMode = REQUIRED) + Integer positionId +) { +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionsResponse.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionsResponse.java index 59498c9e..0dc2b207 100644 --- a/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionsResponse.java +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubPositionsResponse.java @@ -26,13 +26,7 @@ public record InnerClubPosition( Integer priority, @Schema(description = "해당 직책의 회원 수", example = "1", requiredMode = REQUIRED) - Long memberCount, - - @Schema(description = "이름 변경 가능 여부", example = "false", requiredMode = REQUIRED) - Boolean canRename, - - @Schema(description = "삭제 가능 여부", example = "false", requiredMode = REQUIRED) - Boolean canDelete + Long memberCount ) { public static InnerClubPosition of( ClubPosition position, @@ -43,9 +37,7 @@ public static InnerClubPosition of( position.getName(), position.getClubPositionGroup(), position.getPriority(), - memberCount, - position.canRename(), - position.canDelete() + memberCount ); } } diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java index 7b682c2f..d57b4058 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import gg.agit.konect.domain.club.dto.AddMemberRequest; import gg.agit.konect.domain.club.dto.MemberPositionChangeRequest; import gg.agit.konect.domain.club.dto.PresidentTransferRequest; import gg.agit.konect.domain.club.dto.VicePresidentChangeRequest; @@ -82,6 +83,61 @@ public void changeMemberPosition( target.changePosition(newPosition); } + @Transactional + public void addMember( + Integer clubId, + Integer requesterId, + AddMemberRequest request + ) { + clubRepository.getById(clubId); + + ClubMember requester = clubMemberRepository.getByClubIdAndUserId(clubId, requesterId); + validateManagerPermission(requester); + + Integer targetUserId = request.userId(); + + if (clubMemberRepository.existsByClubIdAndUserId(clubId, targetUserId)) { + throw CustomException.of(ALREADY_CLUB_MEMBER); + } + + userRepository.getById(targetUserId); + + ClubPosition position = clubPositionRepository.getById(request.positionId()); + + if (!position.getClub().getId().equals(clubId)) { + throw CustomException.of(NOT_FOUND_CLUB_POSITION); + } + + ClubPositionGroup positionGroup = position.getClubPositionGroup(); + + if (positionGroup == PRESIDENT) { + throw CustomException.of(FORBIDDEN_MEMBER_POSITION_CHANGE); + } + + if (positionGroup == VICE_PRESIDENT) { + long vicePresidentCount = clubMemberRepository.countByClubIdAndPositionGroup(clubId, VICE_PRESIDENT); + if (vicePresidentCount >= 1) { + throw CustomException.of(VICE_PRESIDENT_ALREADY_EXISTS); + } + } + + if (positionGroup == MANAGER) { + long managerCount = clubMemberRepository.countByClubIdAndPositionGroup(clubId, MANAGER); + if (managerCount >= MAX_MANAGER_COUNT) { + throw CustomException.of(MANAGER_LIMIT_EXCEEDED); + } + } + + ClubMember newMember = ClubMember.builder() + .club(clubRepository.getById(clubId)) + .user(userRepository.getById(targetUserId)) + .clubPosition(position) + .isFeePaid(false) + .build(); + + clubMemberRepository.save(newMember); + } + @Transactional public void transferPresident( Integer clubId, diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java index d75fda7e..a9427445 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubPositionService.java @@ -87,7 +87,7 @@ public ClubPositionsResponse updateClubPositionName( Integer userId, ClubPositionUpdateRequest request ) { - Club club = clubRepository.getById(clubId); + clubRepository.getById(clubId); validateManagerPermission(clubId, userId); diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java index 3a6e0f66..e006191e 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java @@ -6,6 +6,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.EnumSet; import java.util.HashSet; import java.util.List; @@ -114,28 +115,13 @@ public ClubDetailResponse createClub(Integer userId, ClubCreateRequest request) Club savedClub = clubRepository.save(club); - List defaultPositions = List.of( - ClubPosition.builder() - .name("회장") - .clubPositionGroup(PRESIDENT) + List defaultPositions = Arrays.stream(ClubPositionGroup.values()) + .map(group -> ClubPosition.builder() + .name(group.getDescription()) + .clubPositionGroup(group) .club(savedClub) - .build(), - ClubPosition.builder() - .name("부회장") - .clubPositionGroup(VICE_PRESIDENT) - .club(savedClub) - .build(), - ClubPosition.builder() - .name("운영진") - .clubPositionGroup(MANAGER) - .club(savedClub) - .build(), - ClubPosition.builder() - .name("일반회원") - .clubPositionGroup(MEMBER) - .club(savedClub) - .build() - ); + .build()) + .toList(); defaultPositions.forEach(clubPositionRepository::save); diff --git a/src/main/java/gg/agit/konect/domain/council/dto/CouncilCreateRequest.java b/src/main/java/gg/agit/konect/domain/council/dto/CouncilCreateRequest.java index b93f0776..448ef3e9 100644 --- a/src/main/java/gg/agit/konect/domain/council/dto/CouncilCreateRequest.java +++ b/src/main/java/gg/agit/konect/domain/council/dto/CouncilCreateRequest.java @@ -57,7 +57,7 @@ public record CouncilCreateRequest( @Size(max = 255, message = "총동아리연합회 인스타 주소는 최대 255자 입니다.") @Pattern(regexp = "^https?://(www\\.)?instagram\\.com/[a-zA-Z0-9._]+/?$", message = "올바른 인스타그램 URL 형식이 아닙니다.") @Schema(description = "총동아리연합회 인스타 주소", example = "https://www.instagram.com/koreatech_council", requiredMode = REQUIRED) - String instagramUrl + String instagramUserName ) { public Council toEntity(University university) { return Council.builder() @@ -68,7 +68,7 @@ public Council toEntity(University university) { .personalColor(personalColor) .phoneNumber(phoneNumber) .email(email) - .instagramUrl(instagramUrl) + .instagramUserName(instagramUserName) .operatingHour(operatingHour) .university(university) .build(); diff --git a/src/main/java/gg/agit/konect/domain/council/dto/CouncilResponse.java b/src/main/java/gg/agit/konect/domain/council/dto/CouncilResponse.java index d8b11e20..79236c71 100644 --- a/src/main/java/gg/agit/konect/domain/council/dto/CouncilResponse.java +++ b/src/main/java/gg/agit/konect/domain/council/dto/CouncilResponse.java @@ -28,7 +28,7 @@ public record CouncilResponse( String operatingHour, @Schema(description = "총동아리연합회 인스타 주소", example = "https://www.instagram.com/koreatech_council", requiredMode = REQUIRED) - String instagramUrl + String instagramUserName ) { public static CouncilResponse from(Council council) { return new CouncilResponse( @@ -39,7 +39,7 @@ public static CouncilResponse from(Council council) { council.getLocation(), council.getPersonalColor(), council.getOperatingHour(), - council.getInstagramUrl() + council.getInstagramUserName() ); } } diff --git a/src/main/java/gg/agit/konect/domain/council/dto/CouncilUpdateRequest.java b/src/main/java/gg/agit/konect/domain/council/dto/CouncilUpdateRequest.java index 02f86e5e..778e48ea 100644 --- a/src/main/java/gg/agit/konect/domain/council/dto/CouncilUpdateRequest.java +++ b/src/main/java/gg/agit/konect/domain/council/dto/CouncilUpdateRequest.java @@ -55,7 +55,7 @@ public record CouncilUpdateRequest( @Size(max = 255, message = "총동아리연합회 인스타 주소는 최대 255자 입니다.") @Pattern(regexp = "^https?://(www\\.)?instagram\\.com/[a-zA-Z0-9._]+/?$", message = "올바른 인스타그램 URL 형식이 아닙니다.") @Schema(description = "총동아리연합회 인스타 주소", example = "https://www.instagram.com/koreatech_council", requiredMode = REQUIRED) - String instagramUrl + String instagramUserName ) { } diff --git a/src/main/java/gg/agit/konect/domain/council/model/Council.java b/src/main/java/gg/agit/konect/domain/council/model/Council.java index a13241ac..8083f4dd 100644 --- a/src/main/java/gg/agit/konect/domain/council/model/Council.java +++ b/src/main/java/gg/agit/konect/domain/council/model/Council.java @@ -4,8 +4,8 @@ import static jakarta.persistence.GenerationType.IDENTITY; import static lombok.AccessLevel.PROTECTED; -import gg.agit.konect.global.model.BaseEntity; import gg.agit.konect.domain.university.model.University; +import gg.agit.konect.global.model.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -58,8 +58,8 @@ public class Council extends BaseEntity { private String email; @NotNull - @Column(name = "instagram_url", nullable = false) - private String instagramUrl; + @Column(name = "instagram_user_name", nullable = false) + private String instagramUserName; @NotNull @Column(name = "operating_hour", nullable = false) @@ -79,7 +79,7 @@ private Council( String personalColor, String phoneNumber, String email, - String instagramUrl, + String instagramUserName, String operatingHour, University university ) { @@ -91,7 +91,7 @@ private Council( this.personalColor = personalColor; this.phoneNumber = phoneNumber; this.email = email; - this.instagramUrl = instagramUrl; + this.instagramUserName = instagramUserName; this.operatingHour = operatingHour; this.university = university; } @@ -102,7 +102,7 @@ public void update( String introduce, String location, String personalColor, - String instagramUrl, + String instagramUserName, String operatingHour ) { this.name = name; @@ -110,7 +110,7 @@ public void update( this.introduce = introduce; this.location = location; this.personalColor = personalColor; - this.instagramUrl = instagramUrl; + this.instagramUserName = instagramUserName; this.operatingHour = operatingHour; } } diff --git a/src/main/java/gg/agit/konect/domain/council/service/CouncilService.java b/src/main/java/gg/agit/konect/domain/council/service/CouncilService.java index 17b73fd0..f00a6124 100644 --- a/src/main/java/gg/agit/konect/domain/council/service/CouncilService.java +++ b/src/main/java/gg/agit/konect/domain/council/service/CouncilService.java @@ -57,7 +57,7 @@ public void updateCouncil(Integer userId, CouncilUpdateRequest request) { request.introduce(), request.location(), request.personalColor(), - request.instagramUrl(), + request.instagramUserName(), request.operatingHour() ); } diff --git a/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java b/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java index 209ffb86..5338995d 100644 --- a/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java +++ b/src/main/java/gg/agit/konect/global/code/ApiResponseCode.java @@ -78,6 +78,7 @@ public enum ApiResponseCode { DUPLICATE_STUDENT_NUMBER(HttpStatus.CONFLICT, "이미 사용 중인 학번입니다."), DUPLICATE_PHONE_NUMBER(HttpStatus.CONFLICT, "이미 사용 중인 전화번호입니다."), ALREADY_APPLIED_CLUB(HttpStatus.CONFLICT, "이미 동아리에 가입 신청을 완료했습니다."), + ALREADY_CLUB_MEMBER(HttpStatus.CONFLICT, "이미 동아리 회원입니다."), DUPLICATE_CLUB_APPLY_QUESTION(HttpStatus.CONFLICT, "중복된 가입 문항이 포함되어 있습니다."), VICE_PRESIDENT_ALREADY_EXISTS(HttpStatus.CONFLICT, "부회장은 이미 존재합니다."), ALREADY_RUNNING_STUDY_TIMER(HttpStatus.CONFLICT, "이미 실행 중인 스터디 타이머가 있습니다."), From 2592eaae0621941e1ef07a292aa9917302b903da Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Wed, 21 Jan 2026 21:42:29 +0900 Subject: [PATCH 11/17] =?UTF-8?q?fix:=20ClubApi=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9E=98=EB=AA=BB=20=EA=B8=B0=EC=9E=AC=EB=90=9C=20description?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agit/konect/domain/club/controller/ClubApi.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java index 55a8f5e3..22eff1ee 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java @@ -80,7 +80,7 @@ ResponseEntity createClub( ); @Operation(summary = "동아리 정보를 수정한다.", description = """ - 동아리 회장 또는 매니저만 동아리 정보를 수정할 수 있습니다. + 동아리 회장 또는 부회장만 동아리 정보를 수정할 수 있습니다. 수정 가능 항목: 동아리명, 한 줄 소개, 로고 이미지, 위치, 분과, 상세 소개 ## 에러 @@ -261,7 +261,7 @@ ResponseEntity createRecruitment( ); @Operation(summary = "동아리 모집 정보를 수정한다.", description = """ - 동아리 회장 또는 매니저만 모집 공고를 수정할 수 있습니다. + 동아리 회장 또는 부회장만 모집 공고를 수정할 수 있습니다. ## 에러 - INVALID_RECRUITMENT_DATE_NOT_ALLOWED (400): 상시 모집인 경우 모집 시작일과 마감일을 지정할 수 없습니다. @@ -293,7 +293,7 @@ ResponseEntity getClubPositions( ); @Operation(summary = "동아리 직책을 생성한다.", description = """ - 동아리 회장 또는 매니저만 직책을 생성할 수 있습니다. + 동아리 회장 또는 부회장만 직책을 생성할 수 있습니다. PRESIDENT와 VICE_PRESIDENT 직책은 생성할 수 없으며, MANAGER 또는 MEMBER 그룹의 직책만 생성 가능합니다. ## 에러 @@ -309,7 +309,7 @@ ResponseEntity createClubPosition( ); @Operation(summary = "동아리 직책의 이름을 수정한다.", description = """ - 동아리 회장 또는 매니저만 직책 이름을 수정할 수 있습니다. + 동아리 회장 또는 부회장만 직책 이름을 수정할 수 있습니다. PRESIDENT와 VICE_PRESIDENT 직책의 이름은 변경할 수 없습니다. ## 에러 @@ -328,7 +328,7 @@ ResponseEntity updateClubPositionName( ); @Operation(summary = "동아리 직책을 삭제한다.", description = """ - 동아리 회장 또는 매니저만 직책을 삭제할 수 있습니다. + 동아리 회장 또는 부회장만 직책을 삭제할 수 있습니다. PRESIDENT와 VICE_PRESIDENT 직책은 삭제할 수 없습니다. 해당 직책을 사용 중인 회원이 없어야 하며, 해당 그룹에 최소 2개의 직책이 있어야 삭제 가능합니다. @@ -348,7 +348,7 @@ ResponseEntity deleteClubPosition( ); @Operation(summary = "동아리 회원의 직책을 변경한다.", description = """ - 동아리 회장 또는 매니저만 회원의 직책을 변경할 수 있습니다. + 동아리 회장 또는 부회장만 회원의 직책을 변경할 수 있습니다. 자기 자신의 직책은 변경할 수 없으며, 상위 직급만 하위 직급의 회원을 관리할 수 있습니다. ## 에러 From f158aa2a0f5ed1000f1408d0ff9d33584fcc3813 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Wed, 21 Jan 2026 22:14:52 +0900 Subject: [PATCH 12/17] =?UTF-8?q?refactor:=20=EB=8F=99=EC=95=84=EB=A6=AC?= =?UTF-8?q?=20=EB=B6=80=EC=9B=90=20=EC=B6=94=EA=B0=80=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20DTO=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konect/domain/club/controller/ClubApi.java | 14 +++++++------- .../domain/club/controller/ClubController.java | 4 ++-- ...emberRequest.java => ClubMemberAddRequest.java} | 2 +- .../club/service/ClubMemberManagementService.java | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) rename src/main/java/gg/agit/konect/domain/club/dto/{AddMemberRequest.java => ClubMemberAddRequest.java} (94%) diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java index 22eff1ee..d437d094 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java @@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import gg.agit.konect.domain.club.dto.AddMemberRequest; import gg.agit.konect.domain.club.dto.ClubApplicationAnswersResponse; import gg.agit.konect.domain.club.dto.ClubApplicationsResponse; import gg.agit.konect.domain.club.dto.ClubApplyQuestionsReplaceRequest; @@ -23,6 +22,7 @@ import gg.agit.konect.domain.club.dto.ClubDetailResponse; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; +import gg.agit.konect.domain.club.dto.ClubMemberAddRequest; import gg.agit.konect.domain.club.dto.ClubMemberCondition; import gg.agit.konect.domain.club.dto.ClubMembersResponse; import gg.agit.konect.domain.club.dto.ClubMembershipsResponse; @@ -111,7 +111,7 @@ ResponseEntity getManagedClubs( - 동아리 관리자만 해당 동아리의 지원 내역을 조회할 수 있습니다. - 현재 지정된 모집 일정 범위에 지원한 내역만 볼 수 있습니다. - 상시 모집의 경우 모든 내역을 봅니다. - + ## 에러 - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 매니저 권한이 없습니다. - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. @@ -125,7 +125,7 @@ ResponseEntity getClubApplications( @Operation(summary = "동아리 지원 답변을 조회한다.", description = """ - 동아리 관리자만 해당 동아리의 지원 답변을 조회할 수 있습니다. - + ## 에러 - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 매니저 권한이 없습니다. - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. @@ -170,7 +170,7 @@ ResponseEntity applyClub( @Operation(summary = "동아리 회비 정보를 조회한다.", description = """ 동아리 가입 신청을 완료했거나 동아리 관리자 권한이 있는 사용자만 회비 계좌 정보를 조회할 수 있습니다. - + ## 에러 - FORBIDDEN_CLUB_FEE_INFO (403): 회비 정보 조회 권한이 없습니다. """) @@ -185,7 +185,7 @@ ResponseEntity getFeeInfo( - 모든 필드를 전달하면 생성/수정합니다. - 모든 필드가 null이면 회비 정보를 삭제합니다. - 일부 필드가 누락된 경우 에러가 발생합니다. - + ## 에러 - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 매니저 권한이 없습니다. - INVALID_REQUEST_BODY (400): 요청 본문의 형식이 올바르지 않거나 필수 값이 누락된 경우 @@ -262,7 +262,7 @@ ResponseEntity createRecruitment( @Operation(summary = "동아리 모집 정보를 수정한다.", description = """ 동아리 회장 또는 부회장만 모집 공고를 수정할 수 있습니다. - + ## 에러 - INVALID_RECRUITMENT_DATE_NOT_ALLOWED (400): 상시 모집인 경우 모집 시작일과 마감일을 지정할 수 없습니다. - INVALID_RECRUITMENT_DATE_REQUIRED (400): 상시 모집이 아닐 경우 모집 시작일과 마감일이 필수입니다. @@ -422,7 +422,7 @@ ResponseEntity changeVicePresident( @PostMapping("/{clubId}/members") ResponseEntity addMember( @PathVariable(name = "clubId") Integer clubId, - @Valid @RequestBody AddMemberRequest request, + @Valid @RequestBody ClubMemberAddRequest request, @UserId Integer userId ); diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java index 88a51697..dacf88ae 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java @@ -8,7 +8,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import gg.agit.konect.domain.club.dto.AddMemberRequest; import gg.agit.konect.domain.club.dto.ClubApplicationAnswersResponse; import gg.agit.konect.domain.club.dto.ClubApplicationsResponse; import gg.agit.konect.domain.club.dto.ClubApplyQuestionsReplaceRequest; @@ -19,6 +18,7 @@ import gg.agit.konect.domain.club.dto.ClubDetailResponse; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; +import gg.agit.konect.domain.club.dto.ClubMemberAddRequest; import gg.agit.konect.domain.club.dto.ClubMemberCondition; import gg.agit.konect.domain.club.dto.ClubMembersResponse; import gg.agit.konect.domain.club.dto.ClubMembershipsResponse; @@ -287,7 +287,7 @@ public ResponseEntity changeVicePresident( @Override public ResponseEntity addMember( @PathVariable(name = "clubId") Integer clubId, - @Valid @RequestBody AddMemberRequest request, + @Valid @RequestBody ClubMemberAddRequest request, @UserId Integer userId ) { clubMemberManagementService.addMember(clubId, userId, request); diff --git a/src/main/java/gg/agit/konect/domain/club/dto/AddMemberRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubMemberAddRequest.java similarity index 94% rename from src/main/java/gg/agit/konect/domain/club/dto/AddMemberRequest.java rename to src/main/java/gg/agit/konect/domain/club/dto/ClubMemberAddRequest.java index ef9a4e53..0b51d477 100644 --- a/src/main/java/gg/agit/konect/domain/club/dto/AddMemberRequest.java +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubMemberAddRequest.java @@ -5,7 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; -public record AddMemberRequest( +public record ClubMemberAddRequest( @NotNull(message = "사용자 ID는 필수 입력입니다.") @Schema(description = "추가할 사용자 ID", example = "123", requiredMode = REQUIRED) Integer userId, diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java index d57b4058..f9fdacdc 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubMemberManagementService.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import gg.agit.konect.domain.club.dto.AddMemberRequest; +import gg.agit.konect.domain.club.dto.ClubMemberAddRequest; import gg.agit.konect.domain.club.dto.MemberPositionChangeRequest; import gg.agit.konect.domain.club.dto.PresidentTransferRequest; import gg.agit.konect.domain.club.dto.VicePresidentChangeRequest; @@ -87,7 +87,7 @@ public void changeMemberPosition( public void addMember( Integer clubId, Integer requesterId, - AddMemberRequest request + ClubMemberAddRequest request ) { clubRepository.getById(clubId); From 8090b432c110eda10905e7f47d3451894f4df649 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Wed, 21 Jan 2026 22:25:36 +0900 Subject: [PATCH 13/17] =?UTF-8?q?ci:=20checkstyle=EC=9D=98=20permission=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/checkstyle.yml | 156 ++++++++++++++++--------------- 1 file changed, 80 insertions(+), 76 deletions(-) diff --git a/.github/workflows/checkstyle.yml b/.github/workflows/checkstyle.yml index 5c26a408..0260a845 100644 --- a/.github/workflows/checkstyle.yml +++ b/.github/workflows/checkstyle.yml @@ -1,76 +1,80 @@ -name: Checkstyle - -on: - pull_request: - branches: - - main - - develop - push: - branches: - - main - - develop - -jobs: - checkstyle: - name: Code Style Check - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - submodules: recursive - token: ${{ secrets.SUBMODULE_TOKEN }} - - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - - - name: Cache Gradle packages - uses: actions/cache@v3 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Run Checkstyle - run: ./gradlew checkstyleMain --no-daemon - - - name: Upload Checkstyle Report - if: failure() - uses: actions/upload-artifact@v4 - with: - name: checkstyle-report - path: | - build/reports/checkstyle/main.html - build/reports/checkstyle/main.xml - retention-days: 7 - - - name: Comment PR with Checkstyle Results - if: github.event_name == 'pull_request' && failure() - uses: actions/github-script@v7 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const fs = require('fs'); - const path = require('path'); - - let comment = '## ⚠️ Checkstyle 위반 사항 발견\n\n'; - comment += 'Checkstyle 검사에서 코딩 컨벤션 위반이 발견되었습니다.\n\n'; - comment += '### 📋 상세 리포트\n'; - comment += '- [Main 소스 리포트 다운로드](../actions/runs/${{ github.run_id }})\n'; - - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: comment - }); +name: Checkstyle + +on: + pull_request: + branches: + - main + - develop + push: + branches: + - main + - develop + +permissions: + contents: read + pull-requests: write + +jobs: + checkstyle: + name: Code Style Check + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + token: ${{ secrets.SUBMODULE_TOKEN }} + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Cache Gradle packages + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Run Checkstyle + run: ./gradlew checkstyleMain --no-daemon + + - name: Upload Checkstyle Report + if: failure() + uses: actions/upload-artifact@v4 + with: + name: checkstyle-report + path: | + build/reports/checkstyle/main.html + build/reports/checkstyle/main.xml + retention-days: 7 + + - name: Comment PR with Checkstyle Results + if: github.event_name == 'pull_request' && failure() + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const path = require('path'); + + let comment = '## ⚠️ Checkstyle 위반 사항 발견\n\n'; + comment += 'Checkstyle 검사에서 코딩 컨벤션 위반이 발견되었습니다.\n\n'; + comment += '### 📋 상세 리포트\n'; + comment += '- [Main 소스 리포트 다운로드](../actions/runs/${{ github.run_id }})\n'; + + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: comment + }); From 47f6179c3a0d5eff1641edc0b6d46cc22f299865 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Thu, 22 Jan 2026 14:58:52 +0900 Subject: [PATCH 14/17] =?UTF-8?q?refactor:=20=EB=8F=99=EC=95=84=EB=A6=AC?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=20=EC=A0=95=EB=B3=B4=20DTO=20-=20?= =?UTF-8?q?=ED=9A=8C=EC=9E=A5=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=ED=8F=AC?= =?UTF-8?q?=ED=95=A8=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src.zip | Bin 0 -> 215486 bytes .../domain/club/dto/ClubDetailResponse.java | 28 +++--------------- .../konect/domain/club/model/ClubMember.java | 6 +--- .../konect/domain/club/model/ClubMembers.java | 11 +++++++ .../domain/club/service/ClubService.java | 8 +++-- 5 files changed, 21 insertions(+), 32 deletions(-) create mode 100644 src.zip diff --git a/src.zip b/src.zip new file mode 100644 index 0000000000000000000000000000000000000000..51e5e8d91e5a603e733c53ffe9863ec6719ec18e GIT binary patch literal 215486 zcmce;b95zWvpw9g&5mu`NyoNr+crA3ZQHhOqmz!=vGaA$z4Na3-rwB0Gk4bdver2# z$sbiYr*>8Cs%Jlul>h=p{`BkX$% ze_#{)f3#^~V{K&cPfQd2Z>9}x{$Z@h|Dp$dJ!^}9@EI}v9XAFx){gczmX=2Lf6*iO zC-6_^<;?#j8~FZ@9{GR1(J!`UG{12BN0~%EWNT(VXZu?wCCYKj^wYs_-cVLZmj*`p zMFN_~!t3t{p!n>>X+|avu-qq>@rzaHNVG=A+_!?4)iBLo@6$X7`x#TvbE9lMgU-6$akTYl1{A2mR82U8vUcYR#N;n{WAj;~uwJ~= zvoL6B(c8Qv`OEsZ%-%1k@yXM>KdM@MFt)q+S6hvzRTK`#!?)C*hp_QOPsLX(K~#F- zWF^4BxnD_7L;ya0G6MYc=|2k89|cw99|Tq4U#R-i*joH&Y%^n}q<_XX=z%9_QK_9C z3_J&QftcSPiEU~@Rm^z8bq+Fj3!C&lpweoGa1U?Fg4KyhKs zx2QoCQ-n-X3P_U-WlfYSZ6zI4;H9WK^%3s0yI*dhT>XOQ|0R$KwJB0`9$ z77?8Bef3Km8m7V0JCMw^C-Ft(1qJ?1Lb#)(_A7vR&-#w;r|seAK<0%cMYv4hVDmwq zeNnL%2Y#=jeI}#sZVGJLsri)Y3-=o)jgpl_Dcdz>7UIniHr`@~2vBvt&o;{RM>d6y z+HSrYlsT*bR{6Abr`L7SU)nu40Ub(oiA1`O54U87?n}5wY#DS61-w*|A`c9H*qWJ5 z8QKAUE--jCGAqf#-DWd=Ft7Ih87nYwru}C((x0&#{8#LLHJ|_9o~Zv$>MKlIFVMkv9gtvaOYu82>?amwTUoyBj{r~Tu-GjKfN7$~)bVheX|W-2XlH;I;T~gZf5Q%!G<^Zs8)|dpcLOpJr`&!nDl0=XX!2DNG4bg zAj;Dv=V|O=7Sv|QhE?p<8j`DRpD+zFy2!}eZcLC35Ocyck#3f&NU>`qye*_q^2u2v zmn!urxcu+g_NBD=juIo>&DJ>GhNCK+&4n1a=nI0PC?VZs3%SKa@?*b+LWY2W1(f+n zYycNWe5anp#VE^LzMf%w(>gkOd~BY_qQ7Ezj^$HI{AP70e=a9jWNB}eRR;lmtJ95;SEn99QXhRa}A}U z5t(wP8&nn;B4QkTNS9p=0Vut?#ZL(<-RINY`$B`n4CHt_O$nn`8i8(>30rqL*V~hS?fODC_Xb`x zpk#zYEv>_E!OHl<3m%HfEnh%nf+%=CH8$eBU(Yn-n01&UCfz(boK@tM3A<+fTXb6_ zQnByY?SSKmN%(&M8FRNzl*rROo_=FwyM(QYiRSKUVCL=zy2~iqFC=MYUv&!nL=w%P zB8mR*6cPs`duKBPqkjOSFaH;Jzc8fmAFlrrfFk93e=;`c&O=K3Gn#ilfVG{lK&D54 z=DWNZCfF!WrrbA9H5Fx)P>Ae|;)ks4%s{D-s0s()DN0AIQaRIB5!~FNl`kahkHJer zk36*{Uc*3rIXpe}(;RzLu=a?!o7y$SGD!r=i2B?l{>!-8n2snBpE2*S01ONVYrWF- zpl^CGb2W@ysid~#q_J+e?t@DXllsVB;55kW?#Jx0h}%zZC}201H+rLZKxr4O2ltEP zgp5oftIujvt@T-aY$uFs-H8LwC7?w-Y@h;^Nno6=BCP-qET`#7L|%*{sFf}}_=wvd zgshXSEQZZ-`W{p={WWg&5yy2%-dmd)hnwB@Ue+#&h=OYP^Dr7N_2|Y?Aow75nB?YU_~{hAlekh#PiNh4 zE&&e-iY!SKTSSx?LOS&OEm-Zi&(WE^EmTHmZqgXk@YWeCBj+}2eSw`PHmOm9q&Qot z>RemZsGWrP5qX8FyeEu?yyh~MfQr&;$`98BMRiuH0!*<{NzAY$O=eqh?-I<@xiq7~ z!mpM^PLl}%X@#oM#=@(-2`U9BLK32?^Nvs&VO3(hqf3C&#l6;Nl@crJ9=WBpr5w zq{*{UW4`|Izekl$lSk$(cmk<5=X|@@VK5hRKeI z)R1-9|Hs#?QMp(gUKFn88<@J6{fxe%G2Ln4SabF;`go*~xu0ZBvpTpjqk8RD z)}^Ca5hgEZc0U8@u{$E>6_S{Hy^6z~ zeqCjGLffq5%L5vA=@8LYLYVw=4>o-~Rk}_;7vOa*A_Z6T_~U!^8)Lqsq`B12CnV?$Si%A6#?E;|Cqmpx)?-RvcMAt#9Wi$oT@^?il;)Tmqg}UZZJTqb$ z9_FH)7Is-A_IH@r_+>}5Pb|fJRXXj6lvW(H=pd@^=V*9+E*FUB3Y|GBc(LHXZ#maV z>sVYSf%SKV`t_W`#gB04gUX6xqg1fe`DG0q=exHJE6*xMAz~H4b9!=sr>*Jz^m(MVEEQ%bcy_M7vXHY_Z<{;8E@w79ZNa;Fz9uH;pdS?9 zrT!RJ-W}QEp^CJK-edVD5K4M@YIvo+L7I3W@r8bOvfHIzA^^eUkz%R@H6j37r|a9@ zL&2bAQ5Qfy1^J+T@6!bbRo!YXx;-GOa;^CoEYmiLZn)2gC#DwsAyZ&U#^890n3rLx z;qgtr*y8pun92sd5qH=U%dV+k3V)Nd*zHpp*hVnTegQAT+Kd5k5!dOHa7G8IicjLPFZOWwjarocQ6buj(9jio6(* z4w3z9tNYYDfIfypsys;{f3T*Q`}mdZG?PiKZ+I`~qnuywG)3ozU3jOlk(t$DpG|6G z8URa6s^~Q%vzXj$q?Tp?eUqowl1j3`C0~)%E#r)F)M2LlpfHd?%C{EKX(xBN2GHAB z(iz{&jb|(>Bno5yI!HKgt!}k2tF?fx`V2F}+Yw-y%t5ctGnhaM{Y2Kz0po>aS*#kfkfWU80&YF2n`41Yy~$i9H=}IP*0&mQoI{S)xMj03-C+{QduKw zFTJCNgb3$b;{YdNd`*b>^%&&`_3YZJPMNE0coGXVJkN;7iYZa{t54b$?#eK#X6%SE zN;pnumFIi=sf+?Ab@-@AlPK2O^4`0Hv2PxQd*luTO`Nw(F9vLJ&IjrUdS;P*#A15W z6n;&KWyUXBEl2SR=~Oy72pv0Yy*KYxN9H;oU!4u60~6O3Sm~nIyT9cbh{QFdHI!U(8Tu)RRD3F z^mT*w2Kt3?jD?j4sh=$F1mbsu|C7brZwUWqi#MUa$n*c@>KCb!GIDUxGco#m>o>(s zam+8sUE9Se?u~x7bP&1loZdy1rRDsV^4%=3;4_Rb7iTt z!C?lWUigilVKXfw#7d0MH8WG$4?VZp57Wg=Ya|JY^5nORqq79ldIe2^iY7Piyw>+Hif3m4&bzoB7=_CgF>;l#zH~G<1MenB_)gcvagEKQ3 zVm}N-03~kkvy(^q_*zL5P$Vx6aMMOOrM){PZ<=O}4ybbJlh)}Jk3zt-I5WL}*=|`7 z-7{^(A?@PCK9g3Y`(%jV=y0CG@((zjlIVl0KHT;=jdq4Zg z|9mVV`VU~QU}SA5Z)E3WlGlj<@uN0I!Iz#!F5pi%TN_uZbX645(M41@O7WYyz+iP(D0E+DiW$IHugb8vxs zvn5$(H#oI@dL#4jnG$EAJM8whZcN{2-W*?G*P}*rEr)-~e~0Vww_$i7n4DJP=PQd$Ix0(RBTmzqU4ZebrO^{d4bFzOPEF)T>dR?&cY)a94A} z;hvIASuQRbO_JYL$~tmj9|;=f3Vv9@LN}uvOr@2yUA!pBF8kdN1*C@WRQ;cQtnPK} zzKDV9^GlaN3=K;h)WXUS$%ZQYm_X0Txm#gfMb>rrmNQ{z4`Zl{)kA?_e*wou1y(@a zfyV*mbbu&hOwz2)4}qV<+Ka&CY^EyCr1}=H@{>ir)C6q zXPrl+%L}C>WYWQWK;pYL!NKN1Tg5-LMRQv6IH*GE~>ViPtAliLeYq z^k*g&n<1JAuiE0BF9yTaJAjN6O6b9Y5Bd~he|CF&>XM)Hws~_koh<6J5@l|9dA=A_ z`*IxcUYS2l6U(!?DAN9{vgh(BhTsl^63N9l4Lx~kOeQFu-FP=`6SJzN)iBIi%MoJ2 zGrXv#n3|rQo>{GESID6eIQ{l*rvWf;!Z%V+Cnf0A>5T2@Tfdw5Vc|feuz~pz8^d`l zbq^PZ4(eCY?AKx$4pH39kdFu_&G<*euo~~4R=7a?=?OJ?!QD*ligle%+d~GabwVcuUL_S?K z#mU;S`FLmyJ505G{vnBgvZ;D;3*zA_)Nszxk@(;&_p3gP$=R=7Zr|M7l`vk7Ne%O+ zrBojH(oM^@$33+LztFoe%x%06<7s_Cym5E5t9;~}jJ4;wT{ucd^@84AH_qC0cZWL2 zFie~+F0l^?QWT~zPvk}Xq=2Xz3VBpNs9^y&Ox{6rJgd2BTd_MUlnfxbuufr>`2O30 zP<#YYSjx|}>IvkZ)r!BmGXF0eNZ!WAO2FPo&+#V>`rmtj)qfsBM#l7t1JT0=U%G|W z6r&pQaiM-O^;ii2QStOOW3V(}<+O;a^mi?nJ?jkz>2yVu=~`WKp<8bx%bGBYOZ~{E z^$9YMVjtxKn~?HlPc8s7Z88;?WsGpz@q-^yKJ&i?2#}kjd$gEvu&-eQ6oykx+PH7I z)fK}GbYLb7kC|1n!a7!10$zPQBbXe@$L;^%gt?EC$jFBRhoXwug7FXQ?-lyKqt~Y= zk0zukw>VGG$02{#fHgF2IN^K*4%DdnT|j2URl19rTVku(4r{!?&2!Z{Y4RmRQe?6} z{&j<@x%}|_)T>^b`IJ@kIkO?))a-gJwXE=|TpE^WGp8~v^HQ&)O(%7r*^466Kpiy9 zPE=`OUNO9@17%m*6W|v?Mgs;+!2Vg;OaHXG^Z#F}`>%-oCCd7*V98F35Bzpw9L(K_ z2eexY?%y7Q!=?HIK%c?5pCvV|pbF1pKAm<~DqF$}Y<{hb?5jiC#Kc3gbXg=5@K6pD z%eP?e(!jLL2AoCp10Fl#Kqu@FVER!*6xE@Y#39+9Qy|07a_-apQC@-~YvNoA7WRmk zZ6{WEUVUjbYMEKfljcuCk0CYVUs0nS*6G^Kgw5hqKR+H{+L}bFX@_e1P1xt-{S$y zkdpP(4l@$pt-o=^M0E{PP=&13lR~krUZg=lpepY33n0`f6i30VF_q)R6n42Q=SNXM zbJ_-0#LVc<{g0#;q#w%4RPZAOWM!}~hUGVgE*f<_(SB&$wsPNO9eG*1 z-*(oGKY-?aoxY6y_%>kC{H6?ccQ5@ab8crn8p<#<9oSSUH_T2;`rXIusTvmkOgdVm zPQ635BjPa3)fxwdmKvE9dCkyV;z!HKnqZ$Q#B8?jjyjA5Mw^p`U#+BNEQY?GB;`U} zuW>NO>IceDZS(0RE0SL(j?3#Zu84b~Ym%`Y^_NiPgDT?w`jTuUZf^85Bo7Q`U=uq7 zFvL>m7rJQw)DT4#aBw!&LxhNfav;d3ujBf0&}7h^B z2_47rVGFTciQNe@n#b1{KFft|t6^)^v_+TGydj@5b8bcWhy(j!;t-&DLB=^|^DEu4 z?uah5e|FBD%U5jcN zy^20fzDkI6=mknespT|&GAc#ccBufm6YpEbmg-+B2EMPmsJ ze1FW8{dR}54Exg1hr!x(ai-zn5>fdUxVPjqAT*6mQB_IEWz}o3lUjD_Ok!Uf`9KJSCjOEmFY|n5J zxs!qeQ#5zY#--J+H=GY@nBAj{<$v4J6~#v7?yaJFrp>KW!U!9lwLOcwT-I<}^(6y_d`yz!uEp%Ler_lXJrvFO5UzGE&WuEf7eLfq!*CAztTb~k*S5HyX z5-=m9CGma2q_z&3T0;H@!|b@Z@n_r@qrC@0!ghvF;i)WpiODGD9Ck`KhbPI-`q*fp%Q+FifTb^Wr!`@09~aHYlQaulxAm(B1LyP zdpM&{GInB6kF+vlaf!=k^Jo)jYMy7Cnam#63W8EmUa{-!J$O%4J^c^ZmkWJ(Pcfa? z&c%lbKr4xMEFpVV(z+>zcy^pKHRaxn1);v%Bhj$xMz`VD-Z+#(HeGZ?@dyxN1h(05 zxf(3&LsjaF(iF--iAcLAgvP+mn7)x!zWkl)BWuy_#ljeJdLo&m{$^x_Jf*MUsW@`5 zG^gY@sNb|jHbTcY)0qRl8;>$&o`I|h4e64Vpr>;{n_RHf4&fHk_yw?O65C8td*z=4 z)GWrYPg{7Wt$B(v3&h4A%ueU!5%da9M1U19p;23T0a-`{-}49=c-4op_}e&J7rQpP z6can^rt+2Yt5zm#=~wgYZK7!+OPV*|U0}U@7oTw=Z})XHdD)-h2y{!^#mI}TG;-p6 z&V3U-p0ZBxkX@NeN0GGfUx_CXO7n-MCkv`()?TM+y!UiIF%D5I^BFy==dXRc^!_1} z_T-#9AZJx9)OgK^+e`Nu?K&Ra7jx!&NA(Bm59vP6LI&Nquc56hkZl_esPAu_pQCkw zTZy9gauBQ+%;I_%trL4r>jprKyk(^K2Z|K{o*E^>U%6UZ(1KlGQF{!!2{+53+}^kJ zx!1`Lv0BJ!te!2jlU$A#XzVm*(r!QPJy+A8)P?}+&wBgclDYhwj_!|cApE~~ zdH#q@N&lT1^KTyit;_#K0pIWazA|ysdW{Zw`0@rBRpkr6x9?mYzvxeL--gU|KGz7B z3Khz@K9g&9$-{{sicbwv+11N~+w{@xpl{EwLIjXNltQGrmpI~UJ|QUX8hk91R~x8F zRu!~y#~oeV8iUapL*0uxx%}uyxw#S~Su;jF9al(1-T~R#7hx)I^=LYEqJt=zwQNGv z@qM6`BnxsVnG?y`?w}b)H5J#0{d29rp?`zUJzo9{Fw?CxvY(kBS}Jf~QBDE?(pRaX z7ZbxG|6U9*jKk|>hfarYUQ_n>BuoS7gcB^R+DHoCKidq!YJ)o*=KM)(t9tHCY ziLuxcr1@nsn>ttCY;?YXMR%@>_Lg_(vK0l8;Q6$lK&0~*hdsR^)UmA+09OsiqHQ}z zr?!0vr&(;B>co{1Cbt)4$AYTcL@it*)8VA}uRKRcaIn>Y6flM?L;d{FF86Cb`8AZJ>RFapU|FCH7Uu8{>n{&zf_FB8-7l zgiHouXRdys1mxQa$}!(5l>~K1i4`<64uX5{iP0c&j$`8j^x1!;D&EwxlcDT^OnQK$ zeU2^E6>36pjF!h?#e+*T@#QRY7JvId@LUP4nzzmw;0BCxe7D- zFnb031wP}%mCEk`pFR49ez|OTzA;fA8^bxe{SqnaihCE?Jr8s+Ys_Sje0@2Vs)8VPywv{|KMw=}z z*wNqu8=_*eY5Gy9&}~&Ig-}N2*u0@*%2-v|E=u{fl*zC%Jxv1qP%8OtBHGp91U943 zgUM1q_=Nh+za*c$-CrEkoAD-NsT|Kd`B5aK14J-%6gdbnQ zm;vVV+ly0l7#cyKqoW0g3^`C?XfHe^#fNn>M2$0(v!3>8$R5}>~G!1NbjF>uJ|OEPo>^0F#|!!#25*mWHfRxq%8S%&S3cl+E$yl@ zXE!F7hBeRz*w{8sX`1w9>=9HCp_mas8SpG~Tp5cNy^2V4v5~IXLY(Y1x$iA;vPk;Q zhZy-BaJJW2z=3iQZjPmqHP3r~AG@zpetRyO(FBZm(_5NsjQIXT$0 zh08Ysc{_fQchZvwSC=^cNddY{KuV-GKaOlji28%TNP;`(hbs3lE6)ek#XZD}Ro&C7 z%hvvUH!GcoD`j{Yx=m2AlgGLV$7NK{nPvx}5kNC_8|p(~|6-jfIJ|uUZK@=fG@OJ? zV@dxQCmz@MkfK8`2UJH8cW6O%Y=A9KHMmcEpnZ%S$&{CTy(9}U$n8{(dc+CTbFjAr z^h0>;TT18&GVDeLVS0AtWs6H%CT&U8_Nu9LF_%hSCqKvr+vG~|7_^RJz+uCOMuvN_ zQfr3K$Szaip!E8k-ej8+y#Elm1`4#qi6`bnSn=Qv8=m{4Y2Ei&mX=*7m<$$p1xt{=3J& zdWqTKzj+k+`SYJ?)qi>a)enG2ZOzU#trRdt5Z^C!=!LpcD5x~Wx-z_y>!_#=tN923 zGsa05{g+g0V-gm}Xp$+F>N+3U1ZddkYbAk6N#P^HH%5i;zhJlG7O1_2oTg@a&3BnL zin81XQDD}#&vVmmPIGO}ujSGCXsN=__VEjmD_w5w8yGEj&@#mdW#9iTA;x&0IZ67uut#DK7Cj3g5%_!Ciu)sYb&b^+U= zWlmPbfmx##oW@$zX+{(b$Rl8cX=+c6HG5`vlTQg9)ICKA=@HQ!@U0ifQuXC?H{+n~ z*GQ26{f7dLY3nR9b+!F=#8#-`suo`EvkCZVJ+Y5KCG7 z2*heUe40U!Cy7ME{embW2>S%vULKX9gWeD;NtoxmIsPj$CZPK=H#yBzs610VM6R+0 zrg>6hQEr7Fb7vBDusN(OzXzs!rV~K@;KV3!;EA_*M)H`No7}{Bu83}|T^~(gR=^C5 zM;6nhW`t5V$#*pOMNZ<-LQBwKPC|&MIVHK1+PB2B4$~3vg@7PUJ?Rmlz&g*#w&IB- z!O&^+$hsiWjeTp>vQ(IN9VAvr`#@8gdSDyjqmM*mg`Z*omEBDJp@@b;?_ zOMaB!3D1m@cUtS+R^Df_XJ%Ffzo;YI_kXRJ1_|u;%B!M$On%EnNI;Odk#7=RizAKH zAmbQ>gUN0++$Nfajf`Wb?9J47gJq#jm;|D1hs^of;Dr}%oy{Jwa~Mb8R$q9%n}@ea zaJ}wRU6wB8)a+kVC&fdpw75p^tzyUl#b8xuimS?N_PFR> zxKN%%Tg>c{R9(XNFTbdncmr4qgqEb>w|$+ywaotn)eJ#%m0Gp0ikzRI9@HNO8LDmX;K}6C{w6ne1`m9vL z;yb=App%6NYx||nPI3CVlff7a3a+Pb&(IIvduqxo(W!#rxcX36cjq*T+JGFy#C8y^4!1GO5p2>URegrQO59&akIp3`-gyN42l zUorYwDrVjmmGeQ{=jSm}Ae|O`u>F_)XBUv~N+4adDJui^5P*cufP79rA$Lp+?`aZX zr>AsgWJQqV?P*eAM-H|eo9R>G!syia4_&Z815klAY9px@v3)aVR_-UvbLy{O_hwx` zt$s?92^26AcjT00CjxhK^^KHxm<8(TTBsz}7xi0-$F%lQ8#x$^c(808ut#qDkX(0~ zi<$v4Qx@%RUV?s6_ ziD1*@RthVi^7$Q!Haoxb!G7TgTqmDUd)X(koJoMkCG*UI!+k

7I5bkOkmU*swIP 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 AfDuYjPc9Lfrl5lq+hG*SpX2(3DI` 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 z zRDY0=N~#))z^}JLxmYLE+0=DJLnhdBV$x0Y;1(670Y*Y$# zRSPHdlvE^;4DP(0UMv~6H!$#5GXaZCDGSl!OqVB|JA#Gj_>-B#KAlHg+52`8QD6P@ zKu@@?W^JNwYhPvlh8e(k0S+)Y5=D=A!&;nDs8LP5p?+AIh7eu;4_r0}nDr_}O)Cu* zHS{17FiFBO(6S#vjt?x^5|D5o`}Q0LJdaQSG2_6s(zJE7b?i4m9mHw*?m;L5r}(vvSqD`5|1pAJ%x;<;PJEluDAe zKEb@jIM|(TERhS!H|Nua$~mQ zt4g^M=}WT7Revsuq`hHd9NS@h?r{&?G>&;167d`>aOpdJ5gQdt6 zAFhIX0)QAc$B$y0pLMz#kEpSHioF>It1j|(zZGt!L`0!l!W#6FS<19*L81pvA19M>T>+1nUZeaiM8bi6vU1%aL0F^g6`lCbi5pm1`25qlFRXwq zVlKD85j`7Z1{%YVp*4!_g?!RBP>n#ym*UTm$S-6_lN(k2@6jV)esicS+~f=WnTVtR zt9k`&LOTFT02klKLFs%D(0tyr=m)NKNv{(5^+Htoj`uEaPoEjc@u!oMMGTmcB|Tt# zOSA+QlN{$hqEV%#bMdz=#8G;jik3+JIE{^w= zkpcIK=c)oX2@?5&9-}UFMHhQ!b~E33x_%S#YCJ(|TG%kjAzzivZ74zoXMQU=RX=~| zW1c!tcn;UXYD@Yxp&aV%>Q?*iw3;`wt@G4%BS!x0jy4B($oCZP%gbfPileWc^C{{x zZ;ndT&;!FtRf}8y)OX;*{oL3>w+aib2ykT)J`XB2zEsW#;Bm=3Lf0ziDXjWq?W!mr z;#j zgj^JyvLkpe#3_uEW%kjaAf6Snsx_DHbhsl4W3Aj=4Jv$>8lFVHSrS;Ou+1DiqHG;I zWz@zAl$3tvgVFTs2S#@+O9uEat_Wekkqt1&!kg`u*B!Z=~tCcCW4(LK*nfRvWZc>0ir3B4B}?8OhlWrwKANMmM9uzHJ8Y9rJ}JnIGt=3w&Qinhn5P>E&`7FJFO>67DD6F?333 z6`WAS(U-nmPI4+tJFG2!e?iC$Eiap-QZy68wlN!ey*$e|J`L{*cu~gO0nr5v22^GB z>dllqK8dP>kk)cSwLDtCPg{$VW#NpixI#7uSRC3qDD7GPB8zi=qbz&uX>`iY@uHVq^E>+wUsQo)md!@kjl|PQ>#+VRW7sg= z9pIM49>&)$VBvJ74QhiXOlOJ!+lJ8ytz+3$P58;}I|G)xpztC|N$9YoK9sDhV?;G` zcg+W)0X*LT?xZ>oI!n{3dGMjL$eL(;7eW+=BnY@V0u$ZUZ<&tCawV8BzOTXpgT=X5(KHDT=A*4B5rV=&3Np$JrBCfxxM=DTq@&cn>MNp17nJhZDw z2SoWDa5T0%EnNp#x^hRFbEJso+t@8} zi-eit6%?@JpH|lC*)SJ708PK~!bGtVv)H1mRB@j*RMdHnIZUA% z6blG-*=d!nx@S=u4tNxrC~^lw!b+yD9X5s^h7YjWo`bVHH8^G(pMBDDHpLJvsC@q9 z<;nK&t8pVUnokMnyC?KU{*6EWQAt4T?<8aX;SGN|s9*V*ch6*J?BMj?OYu)x+)v-+ z9XBBXME^_GH<_Sw1sE||hPU0_6L7cW!~!#9(qp938hUP%OjBuQiTAdDH)g~W-wkS4 zn#H);mdXcFiH7<)&`d9}JcMfyZ)=p^A79rPIwwwMsnkQ@T1*Qhv>3Maxn zch-}YA+)5PyD#I-0-0YVp4?Ensy0Y`yh;><19BgtXgFPW$|bDqM_jpc>q&{k^`(I< zYg)}6n0JY4Y~5$Z?WxBjmA#sXbqmZqr1rF_2z+4++mLd>+w{_-} z*r<+1M-b4=FR^=%0W&E3x)0=+;`MS}H=tAJZBj9GNuBXW2{k9@HKhFoyOQ2OKdW5J zXz)yc0Pho5-_G8M$OrqS)yags?FK3fp#DCB;`AqRT{q=!3LbMa&&O?$r!Ji83m^DzPPIo3t{Rwv@vHdp#65*-2VW9r{-|j!B+4-gw`31#7$X_S*0n9K zJoO=dH467^dD9QHRYX}^M*ygf_s3m}BXB@%VC`GzZE$iHxplJ>FYhBC``cy@B|-VG zpSCnysO#*Zp)d;9C~^ne@x>u&faj2OXQGVz3%3WK58(UgGTEUXQsGNM}zo`WE0rO2x= zLbpG1qdv-DcmdFK432%E9u7TQ8tb-*0!HlPwu@#Rj9HX(i(`Z00^Pu1tsfHHdS1F| zDrql|#Y3dWfDWjV?9o*Ih>3%6q@tQ~W$U|cb1g=j5V4DcYO1uR1Y~h`dudvI)Sj(F zj3&gS%w}-KOV9H>Sys*N5a3NTeTQY*K4!e}Hr2<$tJsXdMTtZrmUc57m^^6cPoHpFxl&zYMa` zW(U_WuH-F~ygun1M9|3t&v;c6cHUkabAs$}lK6r1r^RNUMS`AvmNWT=WL)$nBmG@e zp6D*PCL4{il(J&hz;X$PCvr{RhDxslPS2Y&ph*0QxutOlfVT36*D}8NDcHx;+Q5@hxUu0e@0`tZW51I-9NJ8B8%ex35BYxI+OEsTTc# zm;#6GZPZsKPoxcDbObB061^Dmt>wlGH$fRe2a;#|!@#fjp9d~epQ9b>-ELa)KU z4XIcZrwbd^s?1SH{@Ov$FFV zRV3l7IfrItig|od`BtCN=MNjapWG%Fp28A$9)7H#75JG?V>}I1VAe*c=4?9@Yh^5n zJA(>rKYbC~=1)DJkh&h0EqFkC`4!%x#qzs=ydTl4|5b!7@%J5vsI9H3mGLi+{&zgb z&umeV(#TKG(RNH3`kUuiWg>HM*kr=xle7$G7B1UW2$SF4Xe~4jyP^~y3FM1ytz&Ez zY{=J&z);h6l$U%jcIFA`P`(#Cp<-lLgU*eUhl-g|mT0FS&g3b0Y~?YiXWdM##Rs^ZCrR7ZHQ6O*EO`#FX#Or?vux@dP>_xZJ=)mh#+X?LCDgU{S>PSKc`g=(`tYO zAUywA6i-a~URZqzwVNXJ4r?t|hSq_1+FSe_(i7Sg@JZ`vF_64SjvV+Y!8j7dz4#-z z6>%7NhJ~q56|yLzj7!!7BT$&w42f0DKDL@9%}VmJi@uVGAUpykuiGH^LK7_-kNWk= z;?h?MY`qr=id1{gzD(O8Ou?!8-o4mozpW*DJVx?ibO1LPHo+Ec4sh-p;TRXDUhWVA1-w`LzFe zpZ_0NmZZL=zU}`FE6UQc?~hvA4^-8-i4m{#t3YOH?D)!+<<-Y2S<^rj2gV->Qy>l$C66O)s3Sfog#H7{fsQ6e-4af$A00z^X&sUu@L|e+0?~Ujy z^k>y+zRRk}!nvY0>`5@t8tuB2Ct#vSz2u}(SUo!TO>Y2{BmW^)$=`EDcy3LxN*L@9Dt zT`g!~Pi)r-Qy3P;P0Ajga#l;Y-pJqGYUSo6tV{1;1`r*!(=myo=4b}kPIf9X#5tC# zVH6Xn(z3v1ObXBoG1O{e4J5ySi|{4S+7P?RICMwi^Kxm}iK%XOl!5rOLezJWC@6Kw;0&K^cw3fuU29+EgLDL*_QKiE#&9tWFq6qabhjtGwv4 zg7rsGV>UpP>ghnsReP8T^qL8cb_|ExVgoR-ulbM`ZfykpbKfI7%(U`nHc@?mXmKk$ z-BFEdJopW@6ZHJtvnffb0bxq(fjPgTwL7?&CT>)~WE#!j)PoTDfg*#)HlC|T9_LMq zho<&=wJ2e?R0V#20;DH+!=&uoO51}sHg$c#&sgayj=UhC=%yS6iE|wqM z-$K7&p?27@2wX&f(oh!=mT-ofPyC=G@hhnbg=;ZT12P|A;p7PYxZ@$ap5Xg4g85?O zFxmHxt^WVNu_f~^wsH7BV(T|Q1fE0o9>J)R@~<+5U}=EKTm#hCtDq?s4u^a!80>Tv zA41$yjZX&SCvi13bqR6!7QtNQr-ZzdWM@^0j1;Y`K-+Az+Dcmd%`x3L-=^MvH_evq zT1MZ3~cL?&` z^qA?^4T39fmz5B}FKnS)tOPpe2+n|VgkJC&$zSCDxNYzwd%U*u*AO`7@&f`|w#L-M zHUGq@rLF_46G>U5y*um!vvL@DyRUnc4mCFov}ZYT7PTJAkoS(Qd1A5KQWUwc!4|AA zPu}amDNqdS;2D#5Y)#>Mqr78l_J=~1`bAV1BBSCGW@QCqN7p;HoLN6|$a?{q#G5XV z2Gku-L6-vPj3=$eO9mjsnnvkL$j1seSPo72pR6^K&1 zPX=!?1mpSEMs5lWSTzCFA`S*dCVlK&2qlCd^^|!|vll9~hg+^>r(phG)2Or(#E%~B zCragE7sdJI^1T{2^c_`ld|m0}!=Z`-KU`Hx?;~i|6sokO6Gl&u?Pgyf6ze%u8g0&$ z+Pf#Rwp;bX10pEz8p9HyX%|d5F(7%UAF!|o&!r{apT2eNfPw*cLX;&X52hLG{ghF9 z{pJ1HtG!rz816S=MB(e|PPDzP?3oxCiOww)vmTo}0KSh-v?(t*D|Uza9r=cc-qX?M4`Q0n&BJUbo%@Cf05VygbY z1MOqCImLF?7q#ccsc35-CwS8SAIa^;zQ5QVa*FF~$2+K6{#Q_m{C#$(XlrP$Z}odr z{b^3%C$meEt&tI=hhDu#M%TaWS`PC^4-1F0i_*1dXM&9u{7mth1sogR>vy!}#FHi4 z5ngYworGWQYHQafxbNunnzGde+#t(}P<2nnFG=G2C@wIx8z6o^6Y~&Ivzff57DN1%$O4f#t}q#mikG{oMk-I6gZz-g*i=N^ zhe6TL@P{(HU00bAS_B*DFyvQSX+mT)5~~hStj%SdR&K)%daH58; zT+Ar<%$xH@8$t~c$Ogchg8Up0@7aL?IeYTVZ7Esy{) zFDzvR?F58Eetz=CMG!Z$j+LNKf3wp|S#rWkR3PD@C895y=TwV*fd$4C*u3mXyO2X{( zfjbIt9WdENZR_xG11SSiM+Cz=fon39{;j_rqYrauikH$#;1 zjzW|Pi1<9_(XyYUc>8cj8wB$d=`viJ(nd+%Qkrp%(;9Xj5&sdNa_sh}8o%FQsQ>nE zvc2HnQz(B`TyJP=^vCZdzc$(Zg~r_6e-YWg%)Bex-yvmZYvX7v_-^)3VfAwfS?X(w zD=H|y2USfoB}TB-28MQU~(zHFK)CvyjO9uhN-H2%uD&Xf|=ClAf->rgFQt%ZOnMHCd_sXSIP_X zVz765xFC3zs&<+(LQGBK^ZXU!YJ*TU(hD2C|K@oF?c{>%S?>ds&I+Y zC)&{D#-UqSL`1~=5Lt1bh}{^1oVC|XsAL0rF6v$>{w$VlwRu4!7npLEL;V_Muqoz@ z-3hT8sk_GSx5j=}(x^^c@taZ1rUe2zE?y;bpah*bQ){4W8|Zkt9i+WPvWe`Ug>a(_ zLG$H2*UH{{b~z`;Gp8XO^}hnRf;La7d<3DD(hiT=g;cMa+JST!CQh${1^3h}ex>u5 zzPAX1*sI}NU1xA$QQ^m`%S@gS^A2gVsZYSNdf;UeW+_2prU}|xP!^;~->n#8s?l}E z(mPu2fEjnznr0Hu-oGM3mP?0M!jE>Y0JU_IU|FO1>KK(N;IC9QbS^#ch0!XGIzx#U z^e_Xl5Y4O`&Pf^G`QyOWo1S!db-ZWf2enGxt_BhdZLJxNuruV(W1FjZC7kshFm^O? z5uongFx@&u4J1Nn_E2{$AsVrANuCNw<;6%ZN}Lu+^L@lhC;_1fP?#N2X5nOmwfPzO z;pjqr==`k8!eJSA#NPe0c2*S7HGL{|utU_-UNEEjSpgkivw9R2c#D)V<8}ZOH|^FK z1GxSl-rgxZ({))Fjytx~v29x&+jhscopfy59ox2T+qTnxM$fs{+-vVS#~S10KlpOx zB;WI51!OKywA{!z1wRdbanI58h z5EF#A%rnOLwaze()p&@VY^ryW>+KNtn18)hm$2nEovSv-x`D<_)>LES7p8PEzr^AY zc}7sGFEh-X#MF6E>t=WRA(NK(mtoxg<0d>P_yY`6H?V9L`F#97=(%S?Ar|lLmB>Z) z@hn$bz(F14<$7fU6amIiP>M*($1Ap<`o5O)5?gwl`Aj;t3&Fk3xl9FvsZ_9A;A;@0yLe&_gbUJpGN>f)7@ck|5kX;XzB5lW1Og+y|G>F#QD z!u{Zacz7XumGJRAu8yG0QAb9BR;W`d`&ITa-EIKOUh7f(Xs{(1aXW}i z-Cqa>3rRr++oEb-I)i}jtgMFncd`-ae+ zkv~r6{p&Fd{f1_M5W&L~vf(+8Pz(2A5Gw2GO0W#VuntfKTNDJgajKONuAN;@>etsG zs^F5GXF}u0LutO_2Lwr}n%drDKsM)@y*mq8y!VnNQhSIWzHCUjWjb7AKgCNgz-r~~ zVWnFP8N+{ul;9tS8@E`5HdFNJkG#uHS(W)R2yJ9e?H+bCoNMa_O$j!6!OTJx&MTL~ z4z(O)1EXqE2If*s)xd&$V}aTM*d^BaI?aKX`IW4DZps>w&Pxo!{{_a#BerFcE8`p= zpv1Snc5)rizq~ckBP84baY>vc?WK}=(I5q^_hMj<-mrVh7+L9sHL_-DEx)jAy=&pB zaOFUil_jQPr8B2k@4{#sE~LScr-FDiqKU=lw7G|eS}>GB$x+>%jdhDf z&{tevK9-Szxn7ZzBQxo!q2_l}n&+4^yE%lr<|9x6XvOep-4?lmhu3R)uv^u5{jyO} z0-T_zZ}YR#k0-LIYjSvdQ^E^+qHS2K&rUyD-+b)%;Lo~b&&DW{BEl<5ow;DA=QuM) zH*~*>ceXmdFvl{o|C~>_``Xek(4gi+-i@U6i`Tm2eAAgiSy_^f0@L3|l3&{`6$1Y?z%>G(a-fLgR9X$27VLAYLJ58&oF=?o0%%qUF(tuuXdX}1Kk zX%PCZx3ez1*r02MPBk#9BciBB<*K*-PUXdAgpC`kAH#_#Xvod~q8)3Nv@r^Vz)AKH zeKsajnmI8y6O}nrhi@BL55@?b(TIx{TCIOJw$R{PhF~D>N;pSEMQ?P0yDI1!4-+@L zFF9=)N5T7o(X~Rgp`9|be4vBshnoG_R;k~cjFawwGyw2!ol*|UD(4NB$Q#iQ++rhs z??7Swzo4L?QgEq~0sLXpjUBjsmxfoq`@X5$7V&)rmIw#C{`hDG zG+u7c1s>kpjQKgFP(^m4yFG1hXB(1!gF>2zD?MEMU?`7R1qNtAJRMF>AOp#{$~c$V z=0J2k3+C+3MO*8;lQH)=NrDe%@g=c5y5LEd~Ht5xhAWlUPKxb!;vZ`sFEUwkcC$XmZGL9X}Gf98@ z*i0zO)7tbEch2stpGLhdF)8j=StRkbrry(fW2AbqtkEhD_gU*9sosuqnQ4Sunp$LL zSh(pJ@|WpOQAp?S$-IEo6EZc3&+0AC|Czo0-{WMIe>ujp`fh6cZ_~CvUGmKUDC zcaWg9o&Dc{M*NXFI!4l)0rNu(zp@9~7_qkS?daNIiQ!u`?QtZQAN^sNX= zXPorwm_7=~CQzD&0o;D%pw8hLvf2H66m3nf|7-($l$$@dMUCs`nS5GsE=GEim)|bX zWd{S4%*kpAp zozc&m`d{Pk-}Q;e|6&p)aPaF#JCYAjO>Xi_D~vJyK{$wl*SAhy03{%xUw60hIC=yI zy%7X}E~>Y+mm%2bYhI7fjl&Zo{K`{gVnXvw*j>$P1*|`eYTl^h~$@2eW-4zOZ z1DdxkZ6MGWqWl{W)+V`@;y4cN5y<;XL+6-8YD7ey_@0{w64AQlE5~OU- zMDH3QHe=u@QCDrP?$}+V4ypNB$08PT$oO&bvhhm@Ts2_lI?<;YGjIKCF!0YU%@NEYP^=OmXYu-3?wlhi&RA z)~{LuD-armqvaO$SL&>Jdu9~}zuQ2=dLEU3YUYNJ4#Dcp_Zm z;~)5VF)t+DEV|+~3D?deuGS=q`rIx`p??3&tc==^v)co?o#O&d3C=!Vmj?EUH$V5Ya& zeg8SQ+_h~o1{?d-7kbX@aEa)RybvgCR>m`bzk%qt%DuY7riZ5Ug~>C#b-d)_lRw95 zf@yI0?ng(jz4w=P@@*1hyTHPnC%z}!GoYL^U%_peY!1(!CgV$?HP0QN?`dZe5Ju#^ zJ-!@k255~n9xaEqud8CPPd8gCl?yB@-@Jc2BSU`^*}Bhn_wJLQ??3C%|GEk6pGfb2 z>X3qgiIJhBg{hVC-_Rh>NQr;UiSr0cZ$UXIK-dCFZw1T=iJg<#f+Fr*#1mX=RHaX1 zNfktgc*@8PL{1%)}hOE~DnxO z^UXT@Qy1_zt=cEx-O=tJ2${d?2ijF8?N`{4J8o4>INaeGi(%a@T2kP}lg8>`fc2ak zk|L{czlFuL#X^fQK5weX#CC(E^{~`(_)v8|9v{EI?D>&OWC9K|3^3{~%ZrIpjoLBq zvP;CLhn>~TB9sc4N`&t#6A2xMrwBl$j5F(We>*1DP}Qi)c}-zUnW;KX+PL#_VeNS5 zc&Y+^N~>h2EFW4n);>#212FC?(6i4}Ex^S{lHWcMuhBN0|7Ide`z!7Rmy34$X9;J0 z;1>;*7F(0Ule_j?@$;-m3M^4^>NA5oXKX`YMixrpOh1+fYwfPA&DtM`inxIiLB=}=`Zrf8itL}+-_z$vKWO~YDnN$z4m18b$kL-ff4 zV!)oXPnb&=BBs~tS%sDIPg?e-gI6*T2ZvV~#VpCLRfCk+pq`sHp(bzW@+y%b?__rF zX6W$MBaPXMIyU&u)H%)gIZ756`+5BH2MW|A9x${PY<@Lc4C9S-S&Afk`FGd2L99hS zF09qsa(mOQ7m}D~qNVkslR;O7l6;lIK#ipYyjtx#n5D|}IKZYEDq4DF{8>lgJ`8dp zTdwP&TSK;Sk*8i3?aO*wl*9;`*$s3I9= z;C8S55A$&9`>#kV>nPjFm*wcKOayIF9(#XryH@7;FBx0Kfnur#di0(5RKfYvdV6BsUj)a|NbvJK+@w2Af?`Nn z^Q=EmCIj7xFQMYm;O4E@Y2EY}=Y-bN5~;K!<6N~}P5E4UY}H5*@sMk!%|#I!%8KtI z&}cFTa3;b+0Z+bUv4t{QSoshg^Ien#h)n(G()z7Mz4{-9v6%cut?g2~u8 zwl{A<(0VBYCW+i*Dr=*OydB2 zt=={t0$CsqI%6U3jKKsL#oLG-U?xv8vGQyy62a0}f)TkWNPIQ)0eA2|r5Qz$DYANe z!BDr!g2O)I&JjwLG~Zx5aw84wIlG3oG|C2>XGd#36-Y2sNa$)tk&i+5)jcfH4rWX|dI2qgC+3^NdGABTB`(hTci+?Epf~{o?I+ z7_o((^r81@{;%Nw%mw`Qn)B~`-aP zxZ1)c`$1KPBP7JJo8LIhR(p3RB=oQjQzK*mt~yv!39H22LLB>rAgs?UiQKIyQ6SZz zil!fQb}YGL446~ZrVoHdcVfy-CEz}f|D3@C6WBaLQ+W<%qr@h^$k+sD!rGcfJGJ)p z6jgc=1zl+#BFt&<-cTO<-A<4o(tG?ZQb@Zn@R77(wy`RqT-xl+^(9qvLj@^I0pZXY zfHpS&g(Ya2*GXG@o%^F~O))^_r`KzvfA4irH}pTkvpvz<`*~&gC~ddE33Rr;uMaUr5H79eftX8CJi5aUV1re`C} zp@*FMD6e%(u{bd9d;6wtd76ew5|8~I{VvxlpRHWOY{KPc#x3>Ay*rZ`bSqSYy6aVP z?N^gWan6N@E#v*Zg60pKtUp?!H{^=!>z~5*`%_{6T_twbGdBLcSn#hp>;#4G$k{(& zP?Tk%{`R_cCQ&Hzdd_h31fhysJW|-ZB;^gN`N@;xedG}=$`C+(=bQpDAEgt2mL z&u9JBjJhvn#kY0cVNtmiov7=Ag{j9%oo|ox0!QLe54LYyiqWhn(}RuN;YhxVRMfPn znJQHYiN|elKA7xg4u+k!Z-v#(f?dI~D_A9rMYHKJ>h|Y-!DK zoy97BN&3v2OHB_4<_7qZ|3U`%op$h@utSFCyRC!)@48TmlrztQB+_xbUp_+X1@>f- zppu`UHRSly6w9UE;4TRBMBSV4rZK>-?-GuAKk4BW&;$vo$r=fqjV9To44-CY962wk zoFmvx-rTz%K^6>0UOu5e1g8~$sDtXn{m%J(zdPz#7N#bY4x7^8rIF?UZ0D~v?|0i@ zx2xM1uiF=B={LEjLl|DFbWVfzcxk9OJrDd3%Q}DP6GZ?PWdElw!TxDn{5OjLDn|N$ zBOoqUytGcEgMXjU(Yp>&j8ie4;h|cc3$G!Om(Pv1iYp|y+Y)F)AG3(dPkrgUgcidh zn88(#f!E#SzF2qf@av~c1QJsik+(V$KY+(dg=9DO8(`46syk)lqReO5W7S|($D}!m zHovW+Q4)8|aml1X9@QnBA34BW!W_BL#QfegR;<&VQ1WuZli23VKHf!TB;csFM7Lt> zO28LUGM_0v3T?*-NZpS)7pIFkr|z>%Z-!cM2O__hXY~vCyN`tubYRR0%2bE#l5S&o zED(Dq(3W#@)WWqkz-kq@a_dbQlf(!v+jNek>jf>oHa6Wk53tZVQ3--oRbSi=M9TPn zsPvZ1Fp6pnvvT;@XwyrI{j^QAy)D5E`AG8?eF*4mD&9Ru#FjP460b^FgjaNDq~KLg zVMPjHuH~kF%@#XSAA>ag037MG1s6mI>=%{yV~e?0`co~?TC%I&)6pLu1eY6GS49>+u34kPiGB8bq!cpa}+%xcMaN$@aGhYY-so$l$m@H>a2Fut^%sDs+fez z$R=Fp*f?KvooKNwh?ccpnL|@rsU|($oerEX1kZ$1;O&6LezGMNwtu&ebmp8J%9KA_ z7}XObFo5fxyw%BY8go-OnQVtFyujLt?EUGrp%^u)i!KTLiW*tuf5lPq;HJ>&ojbr& z1%kX&A9pn!wj@6h@Guo-gB(|FNeg;ui{)s>eVK_rSRJrZYw*0A7k9(Bj4Qf6XVz%a zeCpFhqA5zV+p}?@N<$9hRSxf!ZRQrUx-ZA4&)>F=70QIB?vW z4}Q~>yk_WXkFGyey;}OJ6kSc)z^#26mmPoO&ujD=ZF1xrO2qzRL)VTYqqcb>Ho796}@vlh-?=S^ntwFQw zgN3}T19uU)1yjU^d4tpqu^YSgqa3r<4nlW~^R;TQ1{{*t8t!r}vJw+B80+2PGwk8L zv?Xjrn}1l|4RDNF|>z0M>?5sbT*#Ciq_)B+O5I1Q(ONTso z`A%7uArJA~Q|;rVD=JL)$*P=ALTk%d`7F15ksLsR0zM-Yvs9;CDhrgR$boV{WeHl> z`;oKqj%yQFC-zN)XsBQMZDa8Ab%PZpKPe`}*Hpj|5q7k~-w{@7bX@?o&z+;fW``qC zGja(f$*#)Z38BnRzne7Rdaw0jr78e@&|$J+E3$`S(RavJGjagrNwpmfd%XmcZJ2<@ zurk_IAJX|!0IgaP%%6n?+|T@lr6FcSEz&8~H$_@Z6|D&_@ta78#i9=vJF<>DADBq) z2XHvgecy9sfk%b>dd&}5vIQ+O9~5z|7oghE9s}wxbBw_h72M10@b|#aIow8@Onudr z*}HAb(jf*E>tG#m8bYzw?l<--UhInT+xsGT6<{~{q^lbslr1o7kNd9F5)JeQW=!6` zg9+~zL$jFwqzE01&yZ>9Z)|0dSWgDq z3ARQm6i%6qmn7}!$<~;;c@{{n|ApHQSaUqAOXtRGE3)7e;$f-2)#e+tq}K^1w3&42 zCpY_LdVORCc>3CB;H%<58izg`?q*`D)6%-j7}P$r&^rgoXf|_#{b-o|`xD&R(c|=9 zF>M;_O&M<+x+GJ`ZWxBT!#ORfA(YP7N_22=K41!GIBs^_A5^mq>Ygs-K{TIHYYe}YS|XH z7r0Jcw*NZ8!A6#1%85^jL8G&V)d`T&8=JCSBNH%+nOWCMY_V%tzZ%z>dyX&jdY2G zsjQ)Ck}j;L&^qq?R0dqA>)}Vj|AN? z*<`hGtFTU47eJdovuBjtCg@F2yG_|RPk)L}7@b|OL+ViuFR?++jPi_Ycp;T<=;f9X zA3z!V_k}VJDm}l_jeAhoBCox3-Mo0Ojw*2?MM4wfq204yda(P{Xj@%hzEkpke%S6AY*rxB1odG=+AEYoXk*Aj4B_iBi}usW!4H%@uPb>OqDG!yAmliM zv|pk|HIMLq3{)84kM`^Rn9v^%?ZTg!uNADr(78L=0_X;AqRJl0j@IZGKpI-25l5tE z2wvweH3)~EJxj@Rx;z`Bn-kYHF%q2p2e*tkvUI zKBPk+m6J_)=a0R?$x$22=BwxrcvBPp8lqZaY!2D?qmMBdK%~VF5mgQ@f>30yUlE+cF0lq`ywpA=ft@aHaIoiDRQf6z(vFW2ah^)1|&^+Az+L$1% zq`4I>e8%R+khNh$(YIbJZx`EX#xDcIKb`fGBlt@f*9(=@tefoh$+oMDV8@-H(!J-{ zBIlP#JOcGwOKDJ4H>S72bhOb4U9he0n?kVZLp}-53y{F6s_RT&T=DD#l zSk%vR)D#=Pc(OZM5RBwZ@{#FVqk0;UmZ9dK!!RnIwFnTvQkx`tl*T>d6IU$9FlDfY zo35|sG@)FdqWj-&4F6p9Co^eumr=>p#a$a|{rFl%UF63}(61vg-7=xA0zld2C#rs* zgP@M4R(Rb%bp-cqusx3U(m4GkyfGWXAFv&gD31p8!6M%m01xF6R` z-8&mylB0>+uYuYV&X?3$_y#ayZ73a?#N=$1*0+an@kGc9@xxI3mPVwG>lDq9T6P#S zr-_45EGuG^0IEodTSCU7gk0nBdoY;f;fU#*LEfSAkfJ#(AG@eID&Ea7u)BY$a@6@J zRq)19W*v;Z!wQxYub81VSEvMn_W95U)Obj_R~8x~&K5P&N?KUZvX78ya@NnnvJI%> ze#74OXWZB+!=?Z<+&u;36PM_( zyJNAF=E0LZ-ZVy}F^hyJT`PNVo;wOh^K~oj@as_K_YRLloHvMrli@Sj(RL;cHU4>h z9Ib@Xfu?r4*@`yJ>8=0}kUb(A#15WNP%S9kkr&H&s=0<9E{^gnHzupsqO7S=-8960 z<4Deu{UeCKC^&MUt{iLjOPIvzf6kkYZ2Al%w6vjVQ{-8G4v{N<-->M>mEdu3Ra=uQ z7ttMY3)12a?#!gnR4*8@l87yZms;q^uTtVr!02qHOMMfaXB{JrZrZh+Qx(6oTM!z4 zu)N`@2pYh~M5|xVJ|3OiwDahh@YBf>Av&d#FSsxZ&$y^wP_NK7YmD4$a;~?8)uuw~ zeBWh!K3`&4I|-F^G_wOJiTcezIlJ6EmN@cM0$EGr%``hDQO=!Lm3Q`!CD zE7t#;U`fdxZEp`65lW2epFyZeG{NWsyMNJOtSx?#SP7W1Kw zAK;$kvcsmkatO$2$5Gu=>>2R4Y}FkCDpg)zzQD!8oRCRj#ZH}`(_)o`i_IYPgo6`b z6JGm^*f~gaQbK`|>-o!%!9^fGgh;k|f*av1GMZ3Clf)b|es%IlWl?)eCV`-I-K5$D z=NyLSvg-w@Z$t5BXureLSD(n~peSLY)HrWIU&k2zByLxO+K|;xR`WtojP>js32Cl* zR&Vc8i=9islga^B_*S7Ir0`Qtuv4HO#!NiDfsCTnni)=0H?$%yYmcw>?vbTJ9j(or zAH-Cfm*xE@=>!M`EXLzIoi6-3MZa+tF&g3J<~tzuub0`uPS4sm(zf>Jhj;If$VBT- zwU6h)eK>30x82R7-qS|hj(0-0U%fJ;ooyN)$IR*~o+`HCPqyZ?VPneOdI-JnpdEy&&-MY~cBr_(h?;d7{JHfDG%z z8}Z|80$FI=YH%@-adnZTFx#fRSD4O;Y zHL82KmmWs@V;O0hx7D#ZGqGRw(VL^4kX`S4SOS-2(N(cCcKHk#Nx3-my`(i&`#dVL zm9?=KiX#kzQki(j%};hqS#3%nhUduGMbxXlJ!3m>4?0PHMkR88hqxngviLNgc z#_6*+Z=XbIrg4xM-ZBm4B2jC8I3 zoGIBL{<9M6UnRNzR~%)dXJD>pY(#DPxn%t>r3w*|)i6DL&;af-F%WHCtT{Pjum|*s z_mP(DQMw+G(K9nzwlnK3fz~p$5)@^;9TcnYKKVSNE(rXH8EiexGRR?A7&oo<(lFKl zEyi=2xgb$gj;_e(Z=skbdw#}w@26h4m>$3L?E%p+2cyqAXZGjkA4TQQU;ZEBJgUE# zZ(CR!e{#8~XUG2uuUj}!ksg2)Q!9|$606igi-5Mgl%-vBlr=PUII z*xi^#tY~;=V}u|1A)|-CI<@n-qUnC%g@C~-vwsnD|M$~5~*=w@0$^}w>K*p0|)vS<@ImU@& zR!^3)Tsc8Z@@i{IZIw=#`d9m)EsgXLUn>G6$;ZT@J#P-)aH1iy5e5kcqYEXd6!b)s zCPHNM7z0U-7<^S*^hmaG4QaC2*UiaJ(mFcHP%&d`WAwqtQe(VnV9rq^F7xI5k*b4J z*2yO;mJEkXRLBV}%Gg=7;szJtkSP}_M8f%;9dB8?N%@iqNHal{gacVwt^@!i#pGI` zOh5_MlhLg&`Yg_UL}^eZ@mqm0{b*1;P@XxI>7oVv#s##cdfVm$-HINxh%bEegzwfO z_0Ot2ZDbl|ED1e6_Ju^t0NDgjxuSA!I$$st3w1drwR#fq_^Jx^hjY3`dk%uhSrS@f zJ)UsHT4+u5g2*9{`tiRv=AdDt2Mia0*QAaw%Y(^>UnPVV>yku!TP;iqRfm zoph4Iwpzrxwq8(LvX{!)BxHL+7JkmWTdM?2NDXD;$wveMMRZ1{s3%X zMheIatkx5Zx}6+--Z|Fb61vVWzqXCM-G7p z&yYEVRYvy>EQm1?@?hJ4c60UhPXt(w3zzS-M>7xfR{3wBJ~ZeB8IUY6l!aj@(A~-O zKBB&}eN)zJ^_lD>ysY}k&<=9<)4h3KEb=Fsq0HUUNa|z6158Z65ob1BW;KC8(Ei-V zkfS0?U53|b+38hF8Ey^B4U^v%x0v7)lFbJFL<;PnCla-ZTqaVa`^c&bNjlzKVp13$3>QViHO~?GxdCxqL*#XwVlCJ9CDUZdN5AN zmx{HS$gg9V`}~xgN_bn*wV|%Vk!OLD_JxB1)(b}L}A|w@&)sl$*&+6 zloSF+L}e=UTV5REl}oC>8639%@7@M1c0v^RXJ2Cu`oB!mzw;p!f6+Ak=hfbS&4c{a z9?Cz?5zwU-HZ4@_ObypFNZf9fSul{tLLFPx2CIMX(o7%~|shskms(uLftG zw3bE+q&3|y#m(-Q8}7|)@h}TSpG7NW=m=&a3^Plpxv7=dJEl>^(=y}gL13WLL|r4| z6HtcpnPV*7&!H7pqmvN>iOL05Spvdr`ox$7X1d3C7bB6(kHE&BE_00%@%O|wXYc|` zISlY=N7dwhd0PP*7)mdV;x5CXEE0<;(h@@4mqMas4Qvg@c2IU)G%NkZqpu08$!78f zPY^uW%KOo3>PSmP0AFY@5UG(3t`eZUs zXj0Y10)eMG1)RBmnpHWi zE!Zk|b=t<(DoL$OP$=? ze^rn2Y&f{bpR9Qq{%*o5=3g|MefqoPKP}xd{%?vU@w+GR2NRpA!SAgwf9a|dqWL90 zQO1Fn&nWE5(Qm%(irj7p4`kf=yAI&18PF+ZsN%m`cbk65%8gy`w_kQsekGAcP#}=r zVKR;E{sNE^mYS!Yt1fBBfj)UHWtrPvGP~5@Dj$isBz${i9Duf%{fuW?-2`;8x~mfn zcI9G6QAnIBQFd3wz`1=afeXxvW8qEZcTP)AHrjzf|Fv1!<1Ef&bO!@qwY=g)3g)Tg z#*a~ABm6_|sZFp!(K;1tv2`WfVmOVG=YC^#@@Z-o%?GOOH~5VH3DK_q^NlR~l;poc zy#E^?j`V*@(e86**71}4*#0l#!2fvPbIY0j2mKS~zyHF2Li+w4OYD@3^>2K6ak=H6 zY()4UD~c3z~Od;p_hEPQZH^sqU|a<9?= zoATxWTcfL>T=AiGmCO!gnSF-Iq_i?k3+3eoGL@*{PG}l9KW-zp3DnlIWK0AK->x!X z)b^-`^D|@2T0QtLtbjC%d(Q-gls`O9bmt_d;kv@mSMQitKhe3@Ylu7Ou47YEK__9* zrw$nhDh!fbjfQOBoH(0{(qEsk_<|js{8PToN)*St!6`-d)HCC7aa~JEw><~_?((3b z!{*?AD!A*Pnu`C?H~iDPv9Yr@{7YA(^xrt;s?zhaR^(=*lxb85GraMJyquvDLRAD9 zG3i8@_shIDxz+O7d|{aeF`m%N7zR^0Np1lgX0lPGlMRSv+1_{gQSxPVjbu~w8ObHQ zQLagLwGU-Oe7{2z1(O^GG&45J`l>-pu)4a{(w7W)5>S35Fi*J~!QE;pveB0jij50vs?zHx;d_F7RD zwy)Ho+0z6jMlO)Vh5~`iozeUwy)7sF6usFl-Tv@dSJ)^srzt4w_MVBC?`JA?Zlvpg z2aL`c767rD=N&e(r9 z!T(*$@_!76|CuuX6+N#1mmX{K+45EaGSWeFpSAR|oGtMsqHEMsxglmyz2E0i6;&_l z!+@P32k#MX<`o>Wft;q5!0R7IesPqP5%5u|2UdW9B$SL%7q(gO7ov4v1re?q;+PAi zdQpWqR}A;hZD4Rrp=6h{Ns-GZh~yWIk=aXR9k zEdtkr+ipGI4gto!%v0KD?V8@FNq;CYW&w;Toa%yxMNjUyo{%-R+Ti9Q0*mq=$qV)Y z2C0F+^~P7%DB=Mr@`11J?`1(i;@l_T8gxc?6K20{^F?zpNLM7(BYqfBTYwGW2jK>j zxJ`|LT3JOB;DpMYxCLfnk>A*4rx5aAVpILrRQa9%G#Xx>ud<91Rj<+|;k2a>(BCul zK-5bolL)(cm7{jvL>F|-!$|uh=@mDt^8=|s+7YsJk)!DO&HQ#bmYWV+VSJgok^#W- z3lGgN{>i=*L~e2OuPGC_El&aGJcA*v6g zm%5FfitPfWSVh%4dzmxm-I$kzqu!;=)E}-8GZRTrkra;ohT1m;VS)?v2Tkg{PY(GfXP$RbXS#Ze5tEdpe#ezBR z9SSqyD9+m4P8YhwP}|s1An0qVg4ZYP zkD<8UPEC0jDFu63cIiq3EH6sg20TH6^tu+t>fHfStz0)zrBkq-qnT z5E06ONo?!(F1(v@*Vku00^BExFPt1#!5H+N7zi939p{S`4!I85izozHMZkhZ0&~*x z8Uvcoo^-~JQ?8eB11>J@X1^0~CQ3=BwhK_uvoo{K+8;*&FIvMzg0E{ySFf>ot^QOw z7bvi8`<|quUV1BSi{y2Ag3@9I4ZVJL^4wb>kxRC;AF7qo$<#N=2wV%keqgBYk(-p} zXu-8kS%pz_v0rnb>SV=WD*Xt_SZi;}$a%^uBX#(}kU6k9U_3yAG`pEnySvXyuD4KB=0SjDx`); zESHF!frTtKSE7bs`*P80y~W8B-U|!6gByJE@w;)+_ZPyL6t!gefUMfxVjlU;vXquZ z*35{i5W+^iWrNrm)`a%e`B`@{-CvH*MhrEDqtuAYtIY1s8#L4b#PS{?ME8#|WS-VE zrG3PC8IlWeQisC$RB!zLQZ@k>&ZMhbQH0Mu6@D9q;Ev>KJ z!C`-;vz*8;94z`iXs>ovcy{JM!=1#yK6rvcVn+wocBpBwHPWTx&l*(GMA777v`49# z{eG&xYm;N!M6t9=DqTItRs#NTo7!%-b%qRL-fYFa0w44Z^l(~)^Vh`knn~!dKwa;Z zs>V~l`bIPEaweUn0>Acp+s@HVXqF7l*!CK8>^Tr)LhE*_)db5Wu+#aFDYmygE?QrZ zh0_uMg=Nmlt8E0g zP?~R_m8SZDlF$$#4vN(8k}8O?$Py{j;Nn!8lk4LljJ%R0_DFScYjps{4>Jw5^^gzL zL$TpceQBFRjg3JfBAS*u&D^0Q-z+Lr0HZ*SO>=BLwkpqbczIn%;9%d+Ej!UnzBEE~ z2+ey?X;^EouDSvu>s^lPga=h@Vq#!pVPdz@@0^N-5XFTkGNjB2aT}QA77ilQCr&fw znkJ`y7cD8n6bHdpmv<`Y_C8FKzxB zK!vQ5IM{DB-zBPYzGJrw&QxQs``&JKi7X2!eO>=PI*j&qMs1+S`_QbVmOY8vF2Kyu z|31Jg?pLo`1L?}}D~!2=rDUG4uuRB^Fa~+nje*##rZCi&jzCU^OpK6_m~psiK#|fs zG$%7h{a$fb5QfTnbuwuf1kEfP3L15O(C^+0W_*n1e77aQ`@QWkJ*)p$v_;HobQxUk zjdH@BqiQWhzBtpgN`2VFGTED$P(nWDIFT@8A(1f5n7kwzIjGm{?y)L~5s`s9QN>Sx zl?v^Mual$m`o zS>Qp>zCFYDF-GxN*hoi{H}b@*a5ybGNQ5DqEEpww3JE0SgGWGnuFLnnn5`-rUUL>jw2f0G!NsIkeLbC%7b@ zD0y_#noU*7&yEQQKc9OYPE%+|PGeRbPeU>rMDcx2Ra0RsyaelbNK#)OV3%K{wuHDf zmKPW*eAdy`KzGla7THl02_##jif2mBei)E?2R)!go0s931m~&nkjveOmf9yZqklbY z5pO98fArX4Wb8+Z5D?Q(arhiV3=4*eWC-S*eo4ZUZ)EH^oKWBL^yXpUv~gQl98L?1 z+PW+IrdNTxMPaQDxt1EeJh7_bMz=D5c0HIG=)}?fvP`*aQwz#8u~I(IX?O8K-~N`j z83E9b_wiGm0w)PsVT?#YPL9!0Ash=sHlw(7INVg!ZU%-Y7E@tzM*Zxp$;xxgA3J-a ztiQ1f)pi)bU}2iR4{0v@-T{k=VrkOsftM29NqIw$&Nh*+bL!Z&zFmB|>1fJ#Vy_GN zSPKOSnt`^{#<2&N8bL)#0fm_wlGovhn&w!JK4B)$j37aJzyL>TMv>4940WLQ3BHciUa z!mO4%7TH{yr#tCq2$T@%@7%2cqlR<&$pr#SLvDc! z)2pRF>v5$dk#av$Y-gDgYT9cr_QmIAvOVBz(R@jCni2*H%|QHO3DQ~!3d7lmq}0Q+ zm5~gB^ao;16=oAmh${LGj4ebYa_3sGbw?ijm2MnyOsh3PnLe_EvbW#vmN?jKl^;0+ z+`OS{DN%pOQ8@0r`u3O31>+LWZPfliwT-AmrY8>*aO}NNapCL=m#n-rRFZP8t3R znjSMu!jfZSR4QLhMA_)2Wy3af}bg%CDu=(1Qah)n0zU*Rrm6psx0nA>2 zMalO{L(m=H=iJ_$FMVI$@b-N7IW>b8YE02{Ox0kc#m6@S_xPmiK8F7@T+OakwDK^i z&0Ox&%E5x-(S$KJVcKFZ3jos5;3OUz0lK970TgL%QTObJqUA^Xa|Zsa9u!n)Hwk1( zHyrsbEE9b?~+CkJ(z@4CPU`h`+m{d!We`J*r2zeH7*oe9)}tY6lnU;LL<6M%tf%lj>I~xHOQJ z_gjp=IKV1)@b#fFE-uWeC<*w(h2g2qk%`D&z313 zfZ+F$m66HluMzcqWu`*D_49{Z>%vThLhHtim2B(u3{Js=iG+LjiUIYxtyxrK-7e~O zPyPbyMXbgmRju&oMu{GhIx>%CVd3F`@wG$TEQd|c@p3iORkwEcSmFAneDj$_k%DaV zBB5Z-kTe{-88U|i!WBvtzd5@#_b?P>p}XS{s4~S+Oxa`jBp**hqZg?=>8tl7#RU>7 zG`?|1972 zYVE}UjZKf~U5MTryE6Y3jY``#mLh?R-vXO~SgE+p(`;PERey7$N znk|gG+F-UH^^b%o2<^5kWf_B(^3mRh-HKs)K)<9TWaz*!*f627$?Xn<6{gZhNk|6d zn?u$dZsF-Y_Aa$y(Iof>cJxmG7eKmJG?VdNS^Rb;{~k zDgjixm-gru!^Lh)h`blfw+VF>)v>wy<_PG*I4(!tf^-KdYJpZdKA2FGvFSKZpenOj zZRR$v{yap1<_oG6wlG0q0qODB0p1aeJGK3-_^2ZArbb6vmusnm1tsEF6XGwktCA5j zFwNAmrF(+_iA$gmlCT#1=c4zDB9G;|0g&Va2TqZXkJrmrkJ7w1@56%b zuR_r~@3BN{XnW{y>%;tmHS9K^NIOBVlJTA%PPrJA>cB#j7qBtDhc9pJt?6D3mwKt@owEAoaVcH+a4GMMx!&1qh22A0Rl`3M9i2 zRKDv2>$8~DVM%s;K@pdNWbO{6EH<0eaU0~e z^`~Z%&p;a)$z%QIx9Fy=H`N|233t^;^+sH-pz|~Hb$W2`vuNx(Kz9ey(uaDgB-6-e z*V-82aZWXuZ-L0a?!hi3zjU7D_{*|3v{2@d`qqg}e<0V6B+0D8$Y+HK0C;Is`d6|6 zXODw9^m{GHwHMC;oA5CPXyK(IB?HQ0+P+mC#04a16~z}Jg^N^*e$f}@20u#xU2?iS z-)O7q>FyE2Qkf-j|2_iY}~$f0wq4j>S4$!;z|L{IO`n6kH^*3SA|&gl$b28 z@kM9(`~oDN+fPZ|0F7krJ>Sw@yS{-J9~`(L?w9>sux7KIR-T%t$Auz|IZ%hY!};p1 zHXv9t+Z;pc&;B9$AS2^i5c+bhCsRt8z|o1N{vISNup!}Zy*u-1`(BDgwiO}6EDdti zXM}6kD2*C}>kUxELOf=4Ro!m4m^Ly%Ypt{*+oYZyw~)z#on7eAs?7O-c#p6FTaGS= zt1fAuBLYq4+{d4jwMcre`69A&UfdH$9Kk&AM<@|5ZChOIITRe){A9ELUu#z$59Rj8 z?UWL-rW8q8LljEc5~1uuH3oyR4P)#jdkLk5vP4AMl)X)&5G}T%B3cxsY#}84&P%%U zP9yV<-yd^tx6l2&&-Xn0dCqg5Q^+a#v$3`9mrnp|4c+-9UW*O4zf>ob++Av4{>#}0 z@AP2sRQ&J&fo)%Q2=gN1Ni~ZZAS~mMh z2ean*$L~ycscBG;O5LE@-OFx!*U#wnQl@)FZwdJYmmV3*+6i5<$#KcsX8!y>2P5Og z5x;eN$9n12Iezuy75Y{7S_Q=nX+Q98EhI$iSRH@Q?Yr`<=W`W0eIBKC3e|2)k9r%l zC(L%x5)9+h3SgGHUy|d8|6Vwf4%2 z70%1hf*KhgNAs?7Y-Gon3vukVbvU-`-kS!EK1Io1(W5Ua#Imj8%(s-vuk~4=^IXS$ ziG^6`sk@Pcb4Ntl#dC7+8*P$iwM!PeweI?XhZURe3+4yC>dH?q+R(;_d1#0W`0{FK zk_X?q)xp5Zh{dG;gbM=tF|Ip;?9 z-FV%YS*cpWFI0Iq+xoNPQR!As?4Fx<*L|c{(JY}47oSwosu;s358-*EEAr&}7xRFZ z&}CHC(L8Ql@-^z~bFRZ2F9L&4T@VQTifwxO(@J>5(y-60F@AeRmv+h6Cygwx;ZE#2 zO)JK?_`$;f9@bHBmc!QmHK&%f8oYIl^gd9(dJihCnR)*r_oLtNTXOu~4f+m@A8flj z)^J<2>d|pFi~4geRS`eK*IPNWo~x4QleT2<*nHl0ti6M=-eK&JIr?01IZqZHC+l^o zSL?6(f)l2#aiPM=WeNSszb*;>5((mx;b>Kswz+qNnLSo7A5X9^EEBE*jKpnnye^3Oo4&6_Z7{X)#LAuVoLT2 zmV_6?Sg{Dk-BA6d+<%QuyV~;gr_bN=XrzQEd9;t;W%=2IZM-sa=1AM~98gd~x5YWfBB`oQ`}TO*HnpYVly77}KM!lES>+i;bTu zH=i$0+V0M}P+?_9cdJ)t7G3KQ{S5|OSx7@09i3p5i~bQB8<~}>GVU^{Gc+e%L%j0N-X~wJK1!Hg)9Y%vc1BEL zw|Z=8sFG6c{xpBt?n+DX>{t`l_xDC3-#RzdB_{a=FL=9LK3~p#u#>r|mf70Xq)j?I z)Y(|)+q06w5-rhQVYSF{4I!?$oE(GiY{x>5u~yexR^QVdc)gu&QTzF_g8^6BLW6sJ z2MC1~KhAo$U(&MKyC-2Ozoxafmdsi9aL;PG;1!egn$H$jG+BmkWc;BbBjAut%c)U) z9~{2$8J~D)p!vdbwQy3~4Fc2C4SU`jcK_@@xFRr2d;R|C0D{Yg!HP- zXg_*4_?iY=y@bKB{)OXbGvm}E6CDCdQu2Fa(V-(xkFVV?Rgt2qFC()mx4GlC zSO8{)8_lsFV?uAEa-+?H-N(|(ndE=CB{W%Gzm=rxZhqZhxhVH&QBmk4CoY`>asqv; z%%rySK6ttn#r>vdZ@Jg~9iQ%;@W7T?h~JI>=#bCOS@bn#wfL$6!|^e?w&RtyOWtkf z=IcFEJpL~8P{WWf{bV@5;j;AITW}AS-fd*i@4* zeKmfVP3i8Ak`;n?{Pb@rE6OR?Jzu_)7vwNJDZz=6WfSog=jnU0!+CAroz0F4?ilgo zd9H>#WW}~8L`Yn#MMwQvXQJj8Yc~(WlP!7;4R5ekw@TYCcD=6rXl+**Q>~W&V^lON z*&aW#`$c=UbEy4xmD=XMoN ze>7)K#li9TUmc`8vlQ`d$aWa~-RT2;Glb-Usa3On(-rH0pX&4=`*l-rtUmV~yB!pK z-Aq;ng+klep}=vmH`We=M`7(y1RTl>%pXS)&^9jMvA;QvD4?Nwjj`KULuJ@2e704% ziYsy_EALaVloj2mAGXV4QAOqyO3*3Ghm&f zQF+;kZ_BrFmBGrcw8L!My)`+y8|0ZTu49zs8597T1 z3QbkKWjU*DI9?SEI34R~s8}nwXtQoG_bC~bLi$FDgyWa?co{LIb62lt?+v9Hf3V5< z`oj^qra|e!^^b9BhXTr(p_WuJFGuElNY=D7k|%e31MBGh@0ilgX8nIsGLw~^=A*5P zmknSh2IY!zwVB}|B`nN7skS=|v`F;+I;y1ppzL$~^F2(iVLZCdZ;T&GtDI%A;F!2y za4qjT@3Wpa&1Z(a8ivmbzhGF_yO1s=G9R?VcK^kn;$7cw`ok3C69G*nADs_-y6e*7#~q1opEnR_j# z5?|9dOz1U5$V9)}9Z{01zx%^(4LhCFZ?vYmrchUteVBnrUV)Rf|JqbYjfXPzmIGpO z0gtbtY;j(0wpbSw*3FZE2FB$I{>H`2)onJ}KsE-ouR#BfGtzf{pbEX^^K^|1kFZ%( zmQk0J*1kKhPq*rC+a+|QAmrkj%E`B~r!VC&DIdmcZ7aUHMQhz*rsT6?VMD{YmN*|; zgQw=|>p6-V)5NxY#iN#gZN+%Kda>QKXH%c}BDB7Iik{-8wGP%a@p4s;tp@FS4p^t#?aCa2&tEhwZ#0%jdNQx50$x9?$t*6Sn@t!&MuO zqo2}$f9{((@hveTnxP_QKqp^QdaM7Ej)|V{`va%kWBlt%no(dRM_|$*eOn3EU_Yyo zpaA=^gxOdQH8w#khn#1lrM~9{MTq5}dG0SP8rU8FnG zCu=o297Tg(kh9trE8bMCh1b1=x*zD|+@ty=ytJ@HN@&j;`hZV#Bc8e5FV7zdeJk=T zos+@lTp_4qwQq>Jq#c@r1Fne1{@)>Ao#xh0ZD}p__eiuJO`mam%v~ z7#8#zZrm#}p%Y=g@zs{MvbBR_KjI~x55(Q`UJ<2~;j0mlC4?R`%(oQ?=&xl8iL6s_ z_V)Bw7$56$3S?lj!1~ZEP&cLx&ncBosd4=7c8Y}=eTe<=<1Fw+Y?a_4)~_3pc_5AWMXOH2IQob@}| zlq7Am7V>3($n;mb@#c|~{@bs#mP*#Dw;UPI?3P=<_~e%J9xqFH-gB4x?HqrwbpM0! zZM7byhw0S5P8=>ET+dOu(>SzInPSgtpd}#}~h4tK$xh z$#<(#t+y?*>5<~;Vcvcc8$2jhe!}Q+sSan!g_|LEi^NygzKzT5*kLJl^hVUdrlYOj zX<|>_6khi{XMf|NNalbA`(xIxvCehi&N$n+`BvD|D}^amJ_al7+D}K)NM%=DDL6xW z_e_>=P5*>TP)b)!Tx8_AqsJ2YV)rR*P+(PmgW4OaQ0wsKL{`ppIVSz^BwK$)@(bp*Lrwd&8=iTnc#>dLjc) zE@%mjFjih3c2K4X9eACe+xpO8^w;utA_XSl4}TuJxpjD`@SLKVfMi5hi+@zc2e$LB zJEO`Ea5wobXcBp$kRGrq_vZC?xA%!(FF;@1ixG<}KEtC{vvVX>*UnyPmuL9_^A$S^ zU$4nUSuy%|`^(qp98BJ1`h}go*XVi3iA(INPw6iREOn}9=P=Xx;v9A-L0OYONBUH_ zo9S}9Bc?H&PhaA$EizEZAANWHvtVF@obZ9l6#`>X?0pU9hQ-F&TePBHu|7ao%Y&!n zjpV;%$5eY^?-hMYywfCk>U5I6?Q-Gc5%LO_x-Z92mk*4pU+u18Wtm+|8p`-U!C1U`P!6!R^xzSO{lT(UP}RUq^HLFUwj)tF7aV zXK-4pvEZbol&*V|q_O3it9PA}z`1Qtv-u-M%iioymbV8FgxNmZo@kgU8DwB4UaX-~ zx9hkWkNtE9msCge;scB{G=>VqF__frD^rqULLnGrn4Y#%GcYmJY309SK;6^n7;vsW zcOmFiXL@&Uw}&m`+Ole~i))#Z3Nmz`1V-)lNG$zPjJxX zVxm`>o#&)`6B#Y1Xd2*98^ij5=FSVA{lZ+d8%}end&F?wm1|U&JNJ-j;EVo9^CmZT ztBa$FU)(pQ?zR>gCtyB|^z1I#;_ndEFwDIml3zCA*!v~DY~FQ~Badho9>TV+95dfx z9@w(&0rv)3+D(=|hb2M9v@oOfO+i zc+M6%H=s~>j6K?xfWxD_+_2zXB2O?l69G?W;%ZDx?n02MM+|SNh>;pxoLuu!vcXqO zmTi}?{&`xDx;>v;UKT0d9(gD=+&{j}X$Q~pjznwzb_qRCy9dbf_rIr{Ii-M%(DyP2%J@b!gV%}_UxiHAtq2HOe z(#Q{U%aAqebFKB|Rl1UwBc6@XKRmB}YIW=$U6a$1Q=_I6_8HYA0hS5>lVzJJQ9JqH zYDe(0^CMtgDbTwa9(AA8cLO{MA5ON3*L=MA4&M66wUD&R_{6wyn+)MKX>{PerSs;? z4dPDp*f`1N*Q1@!qT9xVk7=%A$1Mi|jZyFTL;lZL_Xcs))L;yuEkvF8nb~?lb2+5wrGdzL{@L%TL5bKDNX3RnyE%gkl5@L_8S!Nr>*F5CEV?&r zKB6TtBvaJBD@{StGAaFlUOSg*flZ^98oOwJ?-?$pZYH`SAKm5KHV4*n>=5P<;TK^c zut=T?x?!SCd$l<5Mpwed7R;AX!96C72SVi*XjbbP^LXgh3qDG|7`FQz|624waZTr^ ziBZ<~^-JFePWDI#ZE!D4*m-i_cYS}bj`*7W!KlTPPVlz zxNKt{a+wfRyy9R^y)6EO?8(8sw?7vvJLiiPHJc0=^$NUpe&METRhDdUrq9;bYslhy zQ{3w=t-cn1y^_Q@t(D)tJ4A$rx()9>VZPGpo^)2!ojolBLC2(v>M>{6I}J2_xOFb= z(|e{#x$ljOUfxm~T=ui+ameIDCG<;{_lAx4Fo*efDBG+(MgLAw(`t))zq2vjOPlBg zcX%R?Xh*N*+uXSMz@sYujW@4OU8nMIvh+R(w4wQ*qvEtF(T0uF+Ay`N#$#;pURVP3 zBpM3q3T`7)t`gZNWp_jO4~Bmo6<8WcE9BK>m(04yE4eC{iNt93>T<8+uNRJ{3j z>WB+9-+UeD|MuLkOPcBIT(>(}uF)8Zl{z$CV!DI&mu>S3?0R%AKtTV#Giu*SQT7*B ziV~tP`c(_AELv(}6ZyU*{+bA$Rp3qA@{kU$yUPc6SA>Uk{7Tw5`u^HLr1np3JO7)O zn3rj|q+ z3D@QpU2Gi9zRui0)>F%|%zF)W?3M`sU}^}jv0If}%C7FwwpaUt&^!D`K97tvkw+p{ zYo|oP^ilEF5b&oo|GZVOixN?6LZR%yj7`)mvhc#Y%(0^;-rix3$wCDqNFZPBSlL=L zLmN*ologY0kj>Cp7gBVxGHtTNkac0(_ny}FgL~B^o-%To$kcWB#nw1&k}t_$zdmV~ ziqyB8K1(0IYv$7%_+m8_hjX|VrMCHMv4YWP>~P2Zl?LGpY8XOf(v-g*iC=A(_sGI5 z2vmaz@2|Z%aHPllX+K?PI^AQ2y2Mx-ZEVS7@3lwL8PZO(JXOnZ2)S9BoG)M({bJ3& zD+_*3ZGt}!NO4~SY+MV}`oEF{X*#4y2_F@KN>5iLpi&XBQcu;}{*@Tbc(`y7#2?6T zZ67{RA;7(y&@(8%fT4lwBjz)gjetmHej_b#eK(UxR(Md(&>c2|oQLF0B>2q|#~eUhRU!cP#6+b>&364X%-o zet+Mr#beD_;**N3yo153BlQoBlr=s$mbwctxM zJH2d?lq-*zm+{(+*oj!dNrUQL{Wh9g(s+aUdXha?cDA7zv{$pRkDm<EZt`7$Kbf2(JtPBVNdv%TpA0M9LB`=#MQg6OC<=*XDeUzEqDqJ}Is#gx}CTyfe z&-e)tlfHQ)jIpb zoTipp>*9ISg5+L1ZP?yf@;&{`8mFiZk#!+9LdCxX$8SaMxc6~9Nu8fdzSi^2j<};g zcgmhy;gyL^ii>`j%~#}l_DBZq{Vq-w>IdX^?b>!i=2oH`b|>4zM>>N;$zks^ zU46V3r6w~OZd+BBRnNUha7BtpSuBGamQS%brFRUHzZv{cf0`wA-2MHMNBvgm zBPrc?{5*M4de0Z%61b{d^!5F_duoHO?8kpR{HiwMd|*@f>zaK@*0(Zxx3UQ^=%TOR zxc6hlftnlsuZuZ8w^n`eBD`T;9~ocJSh+(XnXSFnu2zrvhF|f@ecdO6HY=T2KcP9k zA-zgzz40BC9oEO~`TnelsoeZ#C5yfSsA!@7nX#-Puee}#gAEvnA>|3~8Mrw}`~Ld^ z98}KgHq&)(QDrX~Gk4L{OA5+3E1Jn?p%%A-lXF`RMqQ@zL}sC+aQB_7rku8m!aLX# zb$55K$vh(%z!E-jxp{oazIz{hp2s(6d zUL}`pd)uA`b+dP~mcbmzP7JWy3FRvPhfh-JfN_BWwnKY|@{ zbdK5DbL}@`Th)qr(tILau;>_T?eLRN56#jnrOcJyp;P%>o_iA7^=<`qOIJFi&@3nm zTl&f5W2)cL3)gZG za_cNu6b1?(D91KOusbi{K9^@uccSglRw>N~Vz{(N`!iOr531Kr3f(GjAh#;1V|91^ zL|~Iwe#+VxPKD^D8T?_#pZ_{WUz?WCA@!0uF7!bBO1DLOTSJa?J=Crl_*HrSLd%iL z5H02W)pp*FXH;8VYI-t9yQRV@>ec95^)5((<+c>-q~xU+bSeD%6+3JyYGbxO5xllsvl8;Fi4g`gKEU_EmPz zE*76Y^4Z>)bG3Nl`G6`lpV)G2^^HE$>@x+SHt)BgBt{l~{&}}}UE!&d&6bAxPt=Tx zx5~vEp1Res;2X`4q#H&aJ8#-<9xUVG7hAAHZJ?R8b09hFpgzzln(!zK#^|HU3U~6- zuY?~JjjZ-pd-CIr`)bs>b74-A)<=WarMy-37V4d3&x?F}X!+~UDACHekt5C0(W#uP z7D+v-sAX%FcXdi_DM)QszSCZ|^1`j?)v}So$_kM}j_0e<%$fJT(+_GcVd>A>oqCl+ zXHkvqZh4Q67}2bfsVig`J4d~wLDtd&9)_BZEFi?tkY4(o<&G{W@e{DNWY5l^<0|Ov z4Ep!%5o?w^y1%~*>>ukU?MV2y-9r?@O`jbDBa2Hq#rFPa*!e_V+tK{=s_iWQG)Zc`Ya#ncU@&J=p4Hew_7%fAjNN!q=Fg(oqZb7>zt0rTTxgK)BiyW2>S)$% zazg!wz{fEA+unkAdgO3d7qat9(SIyDZhSEHoVr>9o3r@399@yL(?ud77hPNUPWp+C zq?aq}Rc;TGHhQ~-Ilp)8rbOk?LGPz8S8%eeqqY2`obY1}x3%6ANmbjMUG7|-;3gKM z^_^JJYTM94DbLaanFE@Eg<2ZRq*A zSb0=I^J{tBhj5Q?S{BCAUsM*v`eeM}*t{&}r(0;Jvbg=0gkkj|_r0CbIu97vJ@)#r zW__x}!@92#uXOqp5AQnnYbnDb)UddD%hqE`5AQvT^GK1kd30q<{XSmX-sbx&hUre{ zybwz1_t~)t_X~Sta(PE-?daPY`;xCeerlMWJN`D?{N*-6(J4_v;$`kc!=;Ovgf8ly zmWjpNbRRl+w>~alcW3;B(=l|XyY&n8+pE5m;}s=MdX(%tL)u>6`ylUaHdqqBj8i2z zT)Hcz(#gULeupdqc(#bF0gykMCjAT>@n@z66qCE-P1(0N{`wXec1-=} zW=`U#RtTG&O#L@kkb_7(kD0PhlRG|Eoa@tnO?NN>qWkv~5s3}c6;jg}73hf|EuU23 z)siJNy6Eu5($)>^x3}fS-3kix_i1=QlX9(BWz6`yO2s=H&7&@_bQiXH(`>n7=Xr9q zxAB#Xq|;J%BADVZqjM`W9Xq&i36*`ZZ`w`E>#l_FKN+6&-cNx|VRE^~Kx)v+OI$vC z$A+)a2gt=2*nhE_k%kshGy~n)zqA1MCH3E5nwqXn&F9!)pNk~^ z9C=%y03rwMn~i^clblUZ@L3+%XGLhIdHDBSacbDG0`_g+S-<^zW;rz^L|`PI&qcxx zN3~4FV3eTT|DOZce^Y|Cqf}|6Jd9j25^`V?2mz0Calzo{q&(wrRDP}P+5wmcy~wUg zM7b!K4dhT1FO-O~I#@V(DV_YJ8K9R?HD|^mXHdw0`soK%NGbq|9WWH_pcF_g3XMPP zpa={wtiK$M6cLz7wN!9hn_@6_1RTXum<(z1e+$-M4OY92h-6XlLa@z5L=s}Zr_n!$ zvy%vc+`88jftXbD2B|c~AZD3jMdFcWByX40@xl+RJOF5$A`#J|;CAFhp|w*jYPj8f zU`4QGJjNXdj@58@KZ+&3FSYNU23R+=Q-N!|3792DF|&y%LyI^11B7Ze$Px)*QcaQ# z0T|Hw=Z&?+P|Sn3YUWH(+(`mfuSP_+C^(54vJeA|ry)?idbqFO1>W(ZL=?7;Xfi1? ziN=#NGq}zbA|XfQapwx3e{8Lcw>B6Y&C_#|`uepT2o_32SpzH_sjpx5;?=M|ka!oc zZ@A`f1iiErvzr8k#{b*b^DRRF28pllxP1jQKRX7_u#Dn)iUgXUDU$WdtCUDrYy8Z8(atCiHF zK^6;Vu<$a_on8UBavA*KN_u!T6tB+|1V2&f)dt_BQ8gD90asFTi18z%)<;7<>MpC$}QnK(iqrfxticE62C1GM@Q zDAHMS&K#aIl}aE$f-Gm^{T$ic2Rw)|kOMqhl#)bDl*n)?TKSBH;1t?@9f2|kgG6Zy zOa@ohQw0LD5sDCy<2^i(CT~E1fGCBcG>|gAY279X1W*l<^IfpDvw;bT6o)V(%0yB? zn8VG;!#?g+_DA3#)_^^VE(}xCM(Qy^LO}?KoOs|#rLhtMKuD9y(`>8GUk2N#Paw&G zCzTJVAqxrS|C?0)+)ClWl?KMv$PQ4$pNTNgO}GV*oV82!;m*EQlh%4H+dQm>E2NhF+lP4&GS=h}>P! zwp1l}el4vYKY{O-1Gw~HxcE^22VDPpsE?!;G^0;C&gREb0jG?B602>tL~^>)I103oy;C?Z=dNY1V-`xhQ|Cp?ErC-KmQOdlIDEA?O7NVd0uy!0 zyryXBNIGB)4|r+~UP6Dss#M>Vcr;(fDp)ZfcoQg9MNu2Iobot zixH(+N1mKLyc59r41Vz4f;hO@g(y2Wz+*hYPzpDK3AhC0X^#P~RU^mKzUtAB4`#_4XEnd~=n zv7yKW004;w-XX9)6*1ANT{ZB#4&ba5k#bCG2ifET1WAA8cX!WIg+ zKG0eby5XC~PkLmZjhrZ?5Qw<{vi;D&9^gSAgWN;~=D2QLMZDxcyLdzpxD7w-+z%jV zg9HHX#7|zQ9>R2?1rZQ>A#W9N5Yo~?)Q9J=!MW4}nW<N^X49z8%|1yH~43=t>QLY@bLa&*iF{kUM%WyL4=vDl0rwz>E2x4&6h;v71GA0k z&`!V)5#Y+;9RRq;^97;*|Pf?RcMU8TwT$4Kd82Z2uQSD z)XK*IggcPYW|;3ttf2~s3EBY>fC7n_<^lj92mpXPukJc(0qCQV)8&(uzM;Qq>U4)MkwFaYZx0PBaJ z7Why}`A@nr9nTORtj>5++f*HmKER!I0GA0&IUPXXJT)BogKH-AQ;96&+6CEt098Ej zCh#O+^wm6(QHjV$Io~oBWJoGYNw>LuEz~2L_V`pn`m`rY(GxJ~Fvv@G!^9{4j(SKl z(U3||rxitB$^lSmAg_m?A1b%c1Jq1#q!N|hJ6<&(5UG_xV;o$c7IsjN3Me_=k4i** z?z{mnflt^3{4(4p2y|1Ah$wnfiEGk>ZY%-d+5>bQUa>vdJ0D!`zx$dg3SN-QCT&K5 zcYc)iBLMTS&JWVF4v1`q67IVL&=v(zFntPUSnI!2K^Ag~(}u2(b_1CVG(KdmP7qR9 z(3}VEyBl-TfV!x2la^)`MyZ4~W9)OmA(wid!Se3JfEIImUD6EL6;ydBjvh0@fw+VO z2BagTR|X}Cgf*##W~HSJ#`IiHvf+HLTVI=C6rUiZI7gQZG4Yw0&G#fekrmix@n5~I zs*8{A56E-#UBY`z0D(jUcM0EwU8IWcZ;?=J8Kiy^?zLoABU?NE-#Z|3 zUP~~rFCPUwMJdn)xTnaZp7f0<=LI zxNvxi#UV-^<=>o`Z}^menZ!CV%D}kcz@Uq{?`n~Y*BfC3Paq>m6u-!Eo}3!$)7I^% z2P&8k+!5R{GKwQwED`NpQ_DvhI=9gen2G=$-~a`8crSt@DDzU{iGH*FFCv^*#ap5&4mqfO1u z$oJqfi3J641kPl7{V*U#;8K$|))TstOc5q>GJ(7KNN`&j0VXQ4jfR5Iq?15LHvqR{ zMigR-g2$<*{TEZHtgkHkxYgbfU?Twgf!BRDXi>`-5^RXmAyWUpfrw|5YMZqY;rdrL zM9zxZ!}B>bfuQz-R%H0m^EK)SPX~bc=0fo67NPo-@nB}cI90U-;;99bYCT9v5@iCE z=0kkgid7GRB5qtvdT3|23*mx^s2l$tvyL<;68v~}>mgtopMW;N>)H2==8xw8kQc#Y z%WD&appaxn7`teEEZ_ySVS?`wv`wiXJ0lXn1S+mA{4^6D$^r3(1spWM!MK{w0}QeR z1PUyqt!r>cm1l_%%ILRQ?E>p11{VJQ5JrRx!Q^xEJdrP-z6#*432j&XTOt*loJ|z+UkGGr_gz2AG1rTutQVh}v z26v@LLDx4TJXGWyy4{9dEr1){VA}w9UNkn;Q=ef3!eoOSOB7&1-PaBwD5PP%s@bN@ z0a(ibuon0>>MOORXP7bH&@K(*#1{t&IWhB!14Xf&v=*%dqiG5gu;$PvN6c1DcwdC9<5C}Bl6DWehPt_`L z^I*pxJX8dDQYpb}!XNNRVa*od$+4ry_u&a0;4r)aOW+#;BTs7R{^5hZpAnc}1g1h$ z7wmuW1ljuoTuXslhvVAp_5ZOsOGF0k*XF1DiwVu|dRR%rzOKS0ebKvGnY z{Tmub1v&x6f<`vMdoVJB=Y3R4(A^Ex4Qp2PcS#;@Mz$A096M<{^%fs_R^t+{UP7R-{;s-yxsf$DkYW7Pk zTlB67_56f7(N8PF-9 z8}Q9Y9+i}TyFJ94k$c>6jhVo){Jlke5knmh{)j~rTy3YU_Bj)(4!NTFvH%!C;D6z{ zFB`Z5hAb#d3*-+Neb5%+h!BoZPoLQq0LSC6IHe@3tslwe{P;|OmGCW3q@eaIXU=d3Vj|a7%H~+ZJTV^z^W0T&EE>&Qu;2Ved;oGI@|CAL?lf)ijbL-P?} z+XG`-dB*<(+izz`CAxL{f=p6?I1|9t892Jui~kRFzhz4$I=d0A&Cu)*7Qj3BHcaTs z{{tPk$c*TmXhz?Z9BgQ+fKkQ+Y;b+!z4rgWHRTx)Vk74x;1$5oY^2y`YLk=?Kz}L1 z<8T7#Qw$gj08f-h=Ry6CAl827IdAh`|Stzq0s9>9=o ze{DmPsHXjg9aFvcNGgGl0z({GyJhHCJSft(tROY4-Qb=SbsYJF>bK3$g^L`wvenw0 zoI!>bAV|7B4!<*RT==;V5pS|)Ouabl_GJzb`&%SPuLm71n>V6A>Wl;#IYVDh6j&zJ zRH`XM_TLM}6qR#H&li+oM6VzxI!8U1+-7TX!jBOznuz{?$1eY> z=#o>A)Vq`lkd;d0$DPfg>xJOJng)Jg8bK{-4YaE}g2@)7 zx&UVY19S^)Q5%bE}~0skj+ zoYQyCgc7-1B|><1pX6V zOFTe5@&8yd-^eNk3v%Yo6!HUbVNSh(^pdoh175l;K|+ownvpvlCD+aI+|pP36X1Ip z=&OZ0CmC>zPmx=I7D`0f6#O^R2)gNH5-+sF(*=75c!}l0Tk26z5j9Eo3h?$f)pi76 zW{a1kNiRgwcu7p2HSmy+fro?-6uF9&q%qdP&1=qMAW{&}nM=&C9)`m}2pfPZz(>@c z?LfG0NC&3pk0Lz#ftX=)_V@~8zzi?I40u2BjV>y1P}WaP%n))`2~V$2bt3>Wd$vH% zAiZu}Z7c@}K(`FZGXOL_h>05Dao%8T8|8atldBv4F#~H?F9HO!=Lj^bp$A{#L($e; zGOyePgbv-Igy#r%krOp_Gr~B4W^D`}V+W}sMHSYW80}wo#OWZ&TSY-5E^+k)Jfid+ z@$xCAPEP0GksxIl0rfd@6LN|t+$6yg4U~=tm>oPfVIQH6GN~94<|Z=&!8R}21`Q}P z{j2`2@{>wnKqnA_AtxVrAFTK|0x$r;tS@_!6OJg|u4@6HexxfxddWP28nTdD8qf1( zFA-Q;bb*QP-`RqL3(f}ZLRCftPrw+NDWin;A~=#IN6cSHtfadmxY@ZNA%}JY*U`X( z*Elz_l*w(CTW-8n&jcvIr7DuB+eRg211}pFtS!)v`Ee9~-Ef_`# zFW=j-Q9*W^8+y<)?Z#fVw%~0w?P)+1^Mceo;l+zwZUmsPZa^(;G49|N7g^;XXP=oK zRRzL8IXD4N;QSB)Mg4znkbb+oDMv(1dWstwju=~Ko&Nw)%nwpKfoG=edu()IJ1W;?FNGdaEBu&q#O#&nmU;_p3cZn352b$l3TF2F$vQ~i^ zIDD~c-i!dwcaYG*-P+1Eh~a2>fxD03$}k1pC7jhh!7?lV3UB>>Ky zzu@RfBZjjJL>~OS;CPq48Ucel_|qHbWf8+M#@S-gF2r~!GA}3~k_G{Ihk7rV zv_`T2!DBpeE`To-M*!uIm1i+PB)nk%0k*o|Ain(#` z0(^!GJVCbENEs?yoE`ab6*q7FJ-Q{VrE8r9Xztz%j%DFfqN|aR16k=zqpJoWPw|RL zgC2ZDM>goDqeT9oN@lV_VW&G9IBc+dig-Q~L#ojSZa`;OV0TBt0)H?Z0s+sb`V=%hU8uld z7wTvLS`ugmK~V-?m;9lL2m{bOf(ZtMQ7|u`3LF+=&YO+^UVH;Tc&S`@2O=E5&-|ya zrXZEbJH9g$Xuyd+Fk=g@lm^{p|_yefJor1pff;*!w2o)fWcFt zm-RGjq|$(Wz5wwF?jnqg5J51~@SRV*dY`9B!YL0a6+wpiDs7fL{Fo6zk4%8m= z%LVyj+ZxgoHpdbviXBsBxK+%GHwm_~>V7<`To`0B`gH+%JU>5;|EDhfBql6{1A0m+xfk{TsZ70Bf z=+S$)CyYl#PaW-vncm|f@&>XaocIc$0Z?}ual2Jf@L|_EmaB_%1I0q9D1x<}svlEC z7*cl9%y=n`&(GY52;;#%!wb~E=6>dxl--`}ah6hel;R zX+R4+@=Zg0o=_C*{m<`9JAeoI9Ncht47olB;{LB0r^Lg@mbMbe#Sf?kamB1Cn8*EJ zD?$G!5-As)Ex4`W=juW!(UesMKMg^6cnTsjacC?G&hwy@s5>5KhlFOlXJQ!mIL!f2 zsUzMO76l(7P)HLAIUeP^Lwk9Fx6!1b5g^i#qF@IfvgE)cfoN$@k2!e=sUWEj;UOY0 zsU``gko@r>|LL|JWsiK5c6zLWeLHB@Z@Xe0@Ux%r5VsM`sGgXYBXd5q8lZmg=9V@J zsF=yhpipQ#I}}iask3|()(%C$p}ar=0YyODxPT%h1?-#wgSwjR!wi7D0xAN}oJ3E| z#?JqiY$hu^4aOEssRoEJDA%dSRHuPZiUVSO{Od{@Fs+;B2*3en%Dt16;E)42phF&% z?ervC6xPj?fCi#*1%Kn>WE$pJ-}tCKtn^EEEEOnf+v{B>liUpP=Gp? zFdId3?#Lyg_jNH?{tqAu;zq=xV6{XFC_<|TDlv080~!0FlrdqSQB4w{FAV6ztFYlo z6wu#*Lg6v?Xj^cQg8Hv5bRKweIi%>N0hS)%DdF$K+)AbZkNj_b%*+Wv&Jh15OYegK zKr_gk;7vz3a5-vD6;L1rfS;Z{fgA|aN5xx1Kr%ESP{EHh4xXm~$i`_PQ}zkYAMsvT z0#sr|VWGE!kfZrLAjN$RfLRMz10Si#l1>4dO(>Kd*jJ-wf#ZdDnZsJi*^ZY{=&=ZZ z3B1ih(kf(dfdWj5fJ4)s1M*?SJeu;RNUZo~C5yfSa9}8)wZylIih><8C_th#Eh`(K zD##^sv2)Z*8t6z1D9WxOid{v)LRn;KgWZJ<*iA`!y5qs-LfUukGzReZuk;e01wOb! zmK5;BU=}jPb=HjsE?R-w)l|v?&jOcS{nz)wim-0djs(h9LYho0AY$62+KcRIN(4|N zBnzB)zX36Z^mA;m&k0;7`kWKm8%@cL4~JLMdUt<1_?G*kXOJU zFT6p@1^{{L+s;!Po;gX(q%91EBW9<-S|FQ;H|1gGBJtPO$^?jbu3{r2$euy|Oe;n! No&d@_(9}Pg{{g`Am5KlW literal 0 HcmV?d00001 diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailResponse.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailResponse.java index 4aa0ac08..a278a3f8 100644 --- a/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailResponse.java +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailResponse.java @@ -4,13 +4,11 @@ import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; import java.time.LocalDate; -import java.util.List; import gg.agit.konect.domain.club.enums.RecruitmentStatus; import gg.agit.konect.domain.club.model.Club; import gg.agit.konect.domain.club.model.ClubMember; import gg.agit.konect.domain.club.model.ClubRecruitment; -import gg.agit.konect.domain.user.model.User; import io.swagger.v3.oas.annotations.media.Schema; public record ClubDetailResponse( @@ -51,8 +49,8 @@ public record ClubDetailResponse( @Schema(description = "동아리 모집 정보", requiredMode = REQUIRED) InnerRecruitment recruitment, - @Schema(description = "동아리 대표 임원진", requiredMode = REQUIRED) - List representatives, + @Schema(description = "동아리 회장 이름", example = "김철수", requiredMode = REQUIRED) + String presidentName, @Schema(description = "동아리 소속 여부", example = "true", requiredMode = REQUIRED) Boolean isMember, @@ -80,27 +78,11 @@ public static InnerRecruitment from(ClubRecruitment clubRecruitment) { } } - public record InnerRepresentative( - @Schema(description = "동아리 대표 임원진 이름", example = "김철수", requiredMode = REQUIRED) - String name, - - @Schema(description = "동아리 대표 임원진 전화번호", example = "01012345678", requiredMode = REQUIRED) - String phone, - - @Schema(description = "동아리 대표 임원진 이메일", example = "example@koreatech.ac.kr", requiredMode = REQUIRED) - String email - ) { - public static InnerRepresentative from(ClubMember clubMember) { - User user = clubMember.getUser(); - return new InnerRepresentative(user.getName(), user.getPhoneNumber(), user.getEmail()); - } - } - public static ClubDetailResponse of( Club club, Integer memberCount, ClubRecruitment clubRecruitment, - List clubPresidents, + ClubMember president, Boolean isMember, Boolean isApplied ) { @@ -114,9 +96,7 @@ public static ClubDetailResponse of( club.getClubCategory().getDescription(), memberCount, InnerRecruitment.from(clubRecruitment), - clubPresidents.stream() - .map(InnerRepresentative::from) - .toList(), + president.getUser().getName(), isMember, isApplied ); diff --git a/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java b/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java index 8b300616..3494a47e 100644 --- a/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java +++ b/src/main/java/gg/agit/konect/domain/club/model/ClubMember.java @@ -59,11 +59,7 @@ public boolean isPresident() { public boolean isSameUser(Integer userId) { return this.user.getId().equals(userId); } - - public void updatePosition(ClubPosition clubPosition) { - this.clubPosition = clubPosition; - } - + public void changePosition(ClubPosition clubPosition) { this.clubPosition = clubPosition; } diff --git a/src/main/java/gg/agit/konect/domain/club/model/ClubMembers.java b/src/main/java/gg/agit/konect/domain/club/model/ClubMembers.java index 8f675c29..6af1f0a0 100644 --- a/src/main/java/gg/agit/konect/domain/club/model/ClubMembers.java +++ b/src/main/java/gg/agit/konect/domain/club/model/ClubMembers.java @@ -1,7 +1,11 @@ package gg.agit.konect.domain.club.model; +import static gg.agit.konect.global.code.ApiResponseCode.NOT_FOUND_CLUB_PRESIDENT; + import java.util.List; +import gg.agit.konect.global.exception.CustomException; + public record ClubMembers( List members ) { @@ -15,6 +19,13 @@ public List getPresidents() { .toList(); } + public ClubMember getPresident() { + return members.stream() + .filter(ClubMember::isPresident) + .findFirst() + .orElseThrow(() -> CustomException.of(NOT_FOUND_CLUB_PRESIDENT)); + } + public int getCount() { return members.size(); } diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java index e006191e..a6eb5c05 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java @@ -1,6 +1,7 @@ package gg.agit.konect.domain.club.service; -import static gg.agit.konect.domain.club.enums.ClubPositionGroup.*; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.MANAGER; +import static gg.agit.konect.domain.club.enums.ClubPositionGroup.PRESIDENT; import static gg.agit.konect.global.code.ApiResponseCode.*; import java.time.LocalDateTime; @@ -98,14 +99,14 @@ public ClubDetailResponse getClubDetail(Integer clubId, Integer userId) { Club club = clubRepository.getById(clubId); ClubMembers clubMembers = ClubMembers.from(clubMemberRepository.findAllByClubId(club.getId())); - List clubPresidents = clubMembers.getPresidents(); + ClubMember president = clubMembers.getPresident(); Integer memberCount = clubMembers.getCount(); ClubRecruitment recruitment = club.getClubRecruitment(); boolean isMember = clubMembers.contains(userId); Boolean isApplied = isMember || clubApplyRepository.existsByClubIdAndUserId(clubId, userId); - return ClubDetailResponse.of(club, memberCount, recruitment, clubPresidents, isMember, isApplied); + return ClubDetailResponse.of(club, memberCount, recruitment, president, isMember, isApplied); } @Transactional @@ -370,6 +371,7 @@ private List createQuestions( questionRequest.isRequired()) ); } + return questionsToCreate; } From 69a171bc013cdd82b6d19b04f6604731ffc1dcaa Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Thu, 22 Jan 2026 16:07:33 +0900 Subject: [PATCH 15/17] =?UTF-8?q?refactor:=20=EB=8F=99=EC=95=84=EB=A6=AC?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84/=EC=83=81=EC=84=B8=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20API=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/club/controller/ClubApi.java | 55 ++++++++++++-- .../club/controller/ClubController.java | 37 ++++++++-- .../club/dto/ClubBasicInfoUpdateRequest.java | 19 +++++ .../domain/club/dto/ClubDetailResponse.java | 11 +++ .../club/dto/ClubDetailUpdateRequest.java | 18 +++++ .../club/dto/ClubProfileUpdateRequest.java | 28 ++++++++ .../domain/club/dto/ClubTagResponse.java | 16 +++++ .../domain/club/dto/ClubTagsResponse.java | 18 +++++ .../agit/konect/domain/club/model/Club.java | 21 +++--- .../club/repository/ClubTagMapRepository.java | 22 ++++++ .../club/repository/ClubTagRepository.java | 26 +++++++ .../domain/club/service/ClubService.java | 71 +++++++++++++++---- 12 files changed, 308 insertions(+), 34 deletions(-) create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubBasicInfoUpdateRequest.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubDetailUpdateRequest.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubProfileUpdateRequest.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubTagResponse.java create mode 100644 src/main/java/gg/agit/konect/domain/club/dto/ClubTagsResponse.java create mode 100644 src/main/java/gg/agit/konect/domain/club/repository/ClubTagMapRepository.java create mode 100644 src/main/java/gg/agit/konect/domain/club/repository/ClubTagRepository.java diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java index d437d094..413b41f1 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java @@ -17,9 +17,11 @@ import gg.agit.konect.domain.club.dto.ClubApplyQuestionsReplaceRequest; import gg.agit.konect.domain.club.dto.ClubApplyQuestionsResponse; import gg.agit.konect.domain.club.dto.ClubApplyRequest; +import gg.agit.konect.domain.club.dto.ClubBasicInfoUpdateRequest; import gg.agit.konect.domain.club.dto.ClubCondition; import gg.agit.konect.domain.club.dto.ClubCreateRequest; import gg.agit.konect.domain.club.dto.ClubDetailResponse; +import gg.agit.konect.domain.club.dto.ClubDetailUpdateRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; import gg.agit.konect.domain.club.dto.ClubMemberAddRequest; @@ -29,10 +31,11 @@ import gg.agit.konect.domain.club.dto.ClubPositionCreateRequest; import gg.agit.konect.domain.club.dto.ClubPositionUpdateRequest; import gg.agit.konect.domain.club.dto.ClubPositionsResponse; +import gg.agit.konect.domain.club.dto.ClubProfileUpdateRequest; import gg.agit.konect.domain.club.dto.ClubRecruitmentCreateRequest; import gg.agit.konect.domain.club.dto.ClubRecruitmentResponse; import gg.agit.konect.domain.club.dto.ClubRecruitmentUpdateRequest; -import gg.agit.konect.domain.club.dto.ClubUpdateRequest; +import gg.agit.konect.domain.club.dto.ClubTagsResponse; import gg.agit.konect.domain.club.dto.ClubsResponse; import gg.agit.konect.domain.club.dto.MemberPositionChangeRequest; import gg.agit.konect.domain.club.dto.PresidentTransferRequest; @@ -79,22 +82,60 @@ ResponseEntity createClub( @UserId Integer userId ); - @Operation(summary = "동아리 정보를 수정한다.", description = """ - 동아리 회장 또는 부회장만 동아리 정보를 수정할 수 있습니다. - 수정 가능 항목: 동아리명, 한 줄 소개, 로고 이미지, 위치, 분과, 상세 소개 + @Operation(summary = "동아리 프로필을 수정한다.", description = """ + 동아리 회장 또는 부회장만 동아리 프로필을 수정할 수 있습니다. + 수정 가능 항목: 한 줄 소개, 로고 이미지, 태그 + 동아리명과 분과는 수정할 수 없으며, 변경이 필요한 경우 문의하기를 통해 어드민에게 요청하세요. ## 에러 - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 매니저 권한이 없습니다. - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. - NOT_FOUND_USER (404): 유저를 찾을 수 없습니다. """) - @PutMapping("/{clubId}") - ResponseEntity updateClub( + @PutMapping("/{clubId}/profile") + ResponseEntity updateProfile( @PathVariable(name = "clubId") Integer clubId, - @Valid @RequestBody ClubUpdateRequest request, + @Valid @RequestBody ClubProfileUpdateRequest request, @UserId Integer userId ); + @Operation(summary = "동아리 상세정보를 수정한다.", description = """ + 동아리 회장 또는 부회장만 동아리 상세정보를 수정할 수 있습니다. + 수정 가능 항목: 동방 위치, 상세 소개 + + ## 에러 + - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 동아리 매니저 권한이 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + - NOT_FOUND_USER (404): 유저를 찾을 수 없습니다. + """) + @PutMapping("/{clubId}/details") + ResponseEntity updateDetails( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody ClubDetailUpdateRequest request, + @UserId Integer userId + ); + + @Operation(summary = "동아리 기본정보를 수정한다 (어드민 전용).", description = """ + 어드민만 동아리 기본정보를 수정할 수 있습니다. + 수정 가능 항목: 동아리명, 분과 + 일반 관리자는 이 API를 사용할 수 없으며, 변경이 필요한 경우 문의하기를 통해 어드민에게 요청하세요. + + ## 에러 + - FORBIDDEN_CLUB_MANAGER_ACCESS (403): 어드민 권한이 없습니다. + - NOT_FOUND_CLUB (404): 동아리를 찾을 수 없습니다. + - NOT_FOUND_USER (404): 유저를 찾을 수 없습니다. + """) + @PutMapping("/{clubId}/basic-info") + ResponseEntity updateBasicInfo( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody ClubBasicInfoUpdateRequest request, + @UserId Integer userId + ); + + @Operation(summary = "사용 가능한 전체 태그 목록을 조회한다.") + @GetMapping("/tags") + ResponseEntity getTags(); + @Operation(summary = "가입한 동아리 리스트를 조회한다.") @GetMapping("/joined") ResponseEntity getJoinedClubs( diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java index dacf88ae..803822ad 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubController.java @@ -13,9 +13,11 @@ import gg.agit.konect.domain.club.dto.ClubApplyQuestionsReplaceRequest; import gg.agit.konect.domain.club.dto.ClubApplyQuestionsResponse; import gg.agit.konect.domain.club.dto.ClubApplyRequest; +import gg.agit.konect.domain.club.dto.ClubBasicInfoUpdateRequest; import gg.agit.konect.domain.club.dto.ClubCondition; import gg.agit.konect.domain.club.dto.ClubCreateRequest; import gg.agit.konect.domain.club.dto.ClubDetailResponse; +import gg.agit.konect.domain.club.dto.ClubDetailUpdateRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; import gg.agit.konect.domain.club.dto.ClubMemberAddRequest; @@ -25,10 +27,11 @@ import gg.agit.konect.domain.club.dto.ClubPositionCreateRequest; import gg.agit.konect.domain.club.dto.ClubPositionUpdateRequest; import gg.agit.konect.domain.club.dto.ClubPositionsResponse; +import gg.agit.konect.domain.club.dto.ClubProfileUpdateRequest; import gg.agit.konect.domain.club.dto.ClubRecruitmentCreateRequest; import gg.agit.konect.domain.club.dto.ClubRecruitmentResponse; import gg.agit.konect.domain.club.dto.ClubRecruitmentUpdateRequest; -import gg.agit.konect.domain.club.dto.ClubUpdateRequest; +import gg.agit.konect.domain.club.dto.ClubTagsResponse; import gg.agit.konect.domain.club.dto.ClubsResponse; import gg.agit.konect.domain.club.dto.MemberPositionChangeRequest; import gg.agit.konect.domain.club.dto.PresidentTransferRequest; @@ -77,12 +80,38 @@ public ResponseEntity createClub( } @Override - public ResponseEntity updateClub( + public ResponseEntity updateProfile( @PathVariable(name = "clubId") Integer clubId, - @Valid @RequestBody ClubUpdateRequest request, + @Valid @RequestBody ClubProfileUpdateRequest request, @UserId Integer userId ) { - ClubDetailResponse response = clubService.updateClub(clubId, userId, request); + clubService.updateProfile(clubId, userId, request); + return ResponseEntity.noContent().build(); + } + + @Override + public ResponseEntity updateDetails( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody ClubDetailUpdateRequest request, + @UserId Integer userId + ) { + clubService.updateDetails(clubId, userId, request); + return ResponseEntity.noContent().build(); + } + + @Override + public ResponseEntity updateBasicInfo( + @PathVariable(name = "clubId") Integer clubId, + @Valid @RequestBody ClubBasicInfoUpdateRequest request, + @UserId Integer userId + ) { + clubService.updateBasicInfo(clubId, userId, request); + return ResponseEntity.noContent().build(); + } + + @Override + public ResponseEntity getTags() { + ClubTagsResponse response = clubService.getTags(); return ResponseEntity.ok(response); } diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubBasicInfoUpdateRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubBasicInfoUpdateRequest.java new file mode 100644 index 00000000..87a25f4d --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubBasicInfoUpdateRequest.java @@ -0,0 +1,19 @@ +package gg.agit.konect.domain.club.dto; + +import gg.agit.konect.domain.club.enums.ClubCategory; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +public record ClubBasicInfoUpdateRequest( + @Schema(description = "동아리 이름", example = "BCSD Lab", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "동아리 이름은 필수 입력입니다.") + @Size(max = 50, message = "동아리 이름은 50자 이하여야 합니다.") + String name, + + @Schema(description = "동아리 분과", example = "ACADEMIC", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "동아리 분과는 필수 입력입니다.") + ClubCategory clubCategory +) { +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailResponse.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailResponse.java index a278a3f8..dd8e1925 100644 --- a/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailResponse.java +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailResponse.java @@ -4,11 +4,13 @@ import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; import java.time.LocalDate; +import java.util.List; import gg.agit.konect.domain.club.enums.RecruitmentStatus; import gg.agit.konect.domain.club.model.Club; import gg.agit.konect.domain.club.model.ClubMember; import gg.agit.konect.domain.club.model.ClubRecruitment; +import gg.agit.konect.domain.club.model.ClubTagMap; import io.swagger.v3.oas.annotations.media.Schema; public record ClubDetailResponse( @@ -52,6 +54,9 @@ public record ClubDetailResponse( @Schema(description = "동아리 회장 이름", example = "김철수", requiredMode = REQUIRED) String presidentName, + @Schema(description = "동아리 태그 목록", requiredMode = REQUIRED) + List tags, + @Schema(description = "동아리 소속 여부", example = "true", requiredMode = REQUIRED) Boolean isMember, @@ -83,9 +88,14 @@ public static ClubDetailResponse of( Integer memberCount, ClubRecruitment clubRecruitment, ClubMember president, + List clubTagMaps, Boolean isMember, Boolean isApplied ) { + List tags = clubTagMaps.stream() + .map(tagMap -> ClubTagResponse.from(tagMap.getTag())) + .toList(); + return new ClubDetailResponse( club.getId(), club.getName(), @@ -97,6 +107,7 @@ public static ClubDetailResponse of( memberCount, InnerRecruitment.from(clubRecruitment), president.getUser().getName(), + tags, isMember, isApplied ); diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailUpdateRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailUpdateRequest.java new file mode 100644 index 00000000..59769e31 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubDetailUpdateRequest.java @@ -0,0 +1,18 @@ +package gg.agit.konect.domain.club.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +public record ClubDetailUpdateRequest( + @Schema(description = "동아리 방 위치", example = "학생회관 101호", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "동아리 위치는 필수 입력입니다.") + @Size(max = 255, message = "동아리 위치는 255자 이하여야 합니다.") + String location, + + @Schema(description = "동아리 상세 소개", example = "BCSD에서 얻을 수 있는 경험\n1. IT 실무 경험", + requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "상세 소개는 필수 입력입니다.") + String introduce +) { +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubProfileUpdateRequest.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubProfileUpdateRequest.java new file mode 100644 index 00000000..42191333 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubProfileUpdateRequest.java @@ -0,0 +1,28 @@ +package gg.agit.konect.domain.club.dto; + +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +public record ClubProfileUpdateRequest( + @Schema(description = "동아리 한 줄 소개", example = "즐겁게 일하고 열심히 노는 IT 특성화 동아리", + requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "한 줄 소개는 필수 입력입니다.") + @Size(max = 20, message = "한 줄 소개는 20자 이하여야 합니다.") + String introduce, + + @Schema(description = "동아리 로고 이미지 URL", example = "https://example.com/logo.png", + requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "이미지 URL은 필수 입력입니다.") + @Size(max = 255, message = "이미지 URL은 255자 이하여야 합니다.") + String imageUrl, + + @Schema(description = "동아리 태그 ID 목록", example = "[1, 2, 3]", + requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "태그 목록은 필수 입력입니다.") + List tagIds +) { +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubTagResponse.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubTagResponse.java new file mode 100644 index 00000000..c9d67f7a --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubTagResponse.java @@ -0,0 +1,16 @@ +package gg.agit.konect.domain.club.dto; + +import gg.agit.konect.domain.club.model.ClubTag; +import io.swagger.v3.oas.annotations.media.Schema; + +public record ClubTagResponse( + @Schema(description = "태그 ID", example = "1", requiredMode = Schema.RequiredMode.REQUIRED) + Integer id, + + @Schema(description = "태그 이름", example = "웹개발", requiredMode = Schema.RequiredMode.REQUIRED) + String name +) { + public static ClubTagResponse from(ClubTag clubTag) { + return new ClubTagResponse(clubTag.getId(), clubTag.getName()); + } +} diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubTagsResponse.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubTagsResponse.java new file mode 100644 index 00000000..44ff85e1 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubTagsResponse.java @@ -0,0 +1,18 @@ +package gg.agit.konect.domain.club.dto; + +import java.util.List; + +import gg.agit.konect.domain.club.model.ClubTag; +import io.swagger.v3.oas.annotations.media.Schema; + +public record ClubTagsResponse( + @Schema(description = "태그 목록", requiredMode = Schema.RequiredMode.REQUIRED) + List tags +) { + public static ClubTagsResponse from(List clubTags) { + List tags = clubTags.stream() + .map(ClubTagResponse::from) + .toList(); + return new ClubTagsResponse(tags); + } +} diff --git a/src/main/java/gg/agit/konect/domain/club/model/Club.java b/src/main/java/gg/agit/konect/domain/club/model/Club.java index 397ff54c..f0c76468 100644 --- a/src/main/java/gg/agit/konect/domain/club/model/Club.java +++ b/src/main/java/gg/agit/konect/domain/club/model/Club.java @@ -147,22 +147,21 @@ public void replaceFeeInfo( updateFeeInfo(feeAmount, feeBank, feeAccountNumber, feeAccountHolder, feeDeadline); } - public void update( - String name, - String description, - String imageUrl, - String location, - ClubCategory clubCategory, - String introduce - ) { - this.name = name; - this.description = description; + public void updateProfile(String introduce, String imageUrl) { + this.description = introduce; this.imageUrl = imageUrl; + } + + public void updateDetails(String location, String introduce) { this.location = location; - this.clubCategory = clubCategory; this.introduce = introduce; } + public void updateBasicInfo(String name, ClubCategory clubCategory) { // 어드민 계정으로만 사용 가능 + this.name = name; + this.clubCategory = clubCategory; + } + private boolean isFeeInfoEmpty( Integer feeAmount, String feeBank, diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubTagMapRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubTagMapRepository.java new file mode 100644 index 00000000..bc5ca897 --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubTagMapRepository.java @@ -0,0 +1,22 @@ +package gg.agit.konect.domain.club.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.query.Param; + +import gg.agit.konect.domain.club.model.ClubTagMap; +import gg.agit.konect.domain.club.model.ClubTagMapId; + +public interface ClubTagMapRepository extends Repository { + + @Query("SELECT ctm FROM ClubTagMap ctm JOIN FETCH ctm.tag WHERE ctm.club.id = :clubId") + List findAllByClubId(@Param("clubId") Integer clubId); + + void deleteByClubId(Integer clubId); + + ClubTagMap save(ClubTagMap clubTagMap); + + void saveAll(List clubTagMaps); +} diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubTagRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubTagRepository.java new file mode 100644 index 00000000..aa6cee3c --- /dev/null +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubTagRepository.java @@ -0,0 +1,26 @@ +package gg.agit.konect.domain.club.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.repository.Repository; + +import gg.agit.konect.domain.club.model.ClubTag; +import gg.agit.konect.global.code.ApiResponseCode; +import gg.agit.konect.global.exception.CustomException; + +public interface ClubTagRepository extends Repository { + + Optional findById(Integer id); + + default ClubTag getById(Integer id) { + return findById(id) + .orElseThrow(() -> CustomException.of(ApiResponseCode.NOT_FOUND_CLUB)); + } + + List findAll(); + + List findAllByIdIn(List ids); + + ClubTag save(ClubTag clubTag); +} diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java index a6eb5c05..3b1aaa82 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java @@ -26,18 +26,21 @@ import gg.agit.konect.domain.club.dto.ClubApplyQuestionsReplaceRequest; import gg.agit.konect.domain.club.dto.ClubApplyQuestionsResponse; import gg.agit.konect.domain.club.dto.ClubApplyRequest; +import gg.agit.konect.domain.club.dto.ClubBasicInfoUpdateRequest; import gg.agit.konect.domain.club.dto.ClubCondition; import gg.agit.konect.domain.club.dto.ClubCreateRequest; import gg.agit.konect.domain.club.dto.ClubDetailResponse; +import gg.agit.konect.domain.club.dto.ClubDetailUpdateRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoReplaceRequest; import gg.agit.konect.domain.club.dto.ClubFeeInfoResponse; import gg.agit.konect.domain.club.dto.ClubMemberCondition; import gg.agit.konect.domain.club.dto.ClubMembersResponse; import gg.agit.konect.domain.club.dto.ClubMembershipsResponse; +import gg.agit.konect.domain.club.dto.ClubProfileUpdateRequest; import gg.agit.konect.domain.club.dto.ClubRecruitmentCreateRequest; import gg.agit.konect.domain.club.dto.ClubRecruitmentResponse; import gg.agit.konect.domain.club.dto.ClubRecruitmentUpdateRequest; -import gg.agit.konect.domain.club.dto.ClubUpdateRequest; +import gg.agit.konect.domain.club.dto.ClubTagsResponse; import gg.agit.konect.domain.club.dto.ClubsResponse; import gg.agit.konect.domain.club.enums.ClubPositionGroup; import gg.agit.konect.domain.club.model.Club; @@ -51,6 +54,8 @@ import gg.agit.konect.domain.club.model.ClubRecruitment; import gg.agit.konect.domain.club.model.ClubRecruitmentImage; import gg.agit.konect.domain.club.model.ClubSummaryInfo; +import gg.agit.konect.domain.club.model.ClubTag; +import gg.agit.konect.domain.club.model.ClubTagMap; import gg.agit.konect.domain.club.repository.ClubApplyAnswerRepository; import gg.agit.konect.domain.club.repository.ClubApplyQuestionRepository; import gg.agit.konect.domain.club.repository.ClubApplyRepository; @@ -59,6 +64,8 @@ import gg.agit.konect.domain.club.repository.ClubQueryRepository; import gg.agit.konect.domain.club.repository.ClubRecruitmentRepository; import gg.agit.konect.domain.club.repository.ClubRepository; +import gg.agit.konect.domain.club.repository.ClubTagMapRepository; +import gg.agit.konect.domain.club.repository.ClubTagRepository; import gg.agit.konect.domain.user.model.User; import gg.agit.konect.domain.user.repository.UserRepository; import gg.agit.konect.global.exception.CustomException; @@ -84,6 +91,8 @@ public class ClubService { private final ClubApplyAnswerRepository clubApplyAnswerRepository; private final UserRepository userRepository; private final BankRepository bankRepository; + private final ClubTagRepository clubTagRepository; + private final ClubTagMapRepository clubTagMapRepository; public ClubsResponse getClubs(ClubCondition condition, Integer userId) { User user = userRepository.getById(userId); @@ -102,11 +111,12 @@ public ClubDetailResponse getClubDetail(Integer clubId, Integer userId) { ClubMember president = clubMembers.getPresident(); Integer memberCount = clubMembers.getCount(); ClubRecruitment recruitment = club.getClubRecruitment(); + List clubTagMaps = clubTagMapRepository.findAllByClubId(clubId); boolean isMember = clubMembers.contains(userId); Boolean isApplied = isMember || clubApplyRepository.existsByClubIdAndUserId(clubId, userId); - return ClubDetailResponse.of(club, memberCount, recruitment, president, isMember, isApplied); + return ClubDetailResponse.of(club, memberCount, recruitment, president, clubTagMaps, isMember, isApplied); } @Transactional @@ -140,7 +150,7 @@ public ClubDetailResponse createClub(Integer userId, ClubCreateRequest request) } @Transactional - public ClubDetailResponse updateClub(Integer clubId, Integer userId, ClubUpdateRequest request) { + public void updateProfile(Integer clubId, Integer userId, ClubProfileUpdateRequest request) { userRepository.getById(userId); Club club = clubRepository.getById(clubId); @@ -148,16 +158,53 @@ public ClubDetailResponse updateClub(Integer clubId, Integer userId, ClubUpdateR throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); } - club.update( - request.name(), - request.description(), - request.imageUrl(), - request.location(), - request.clubCategory(), - request.introduce() - ); + club.updateProfile(request.introduce(), request.imageUrl()); + + clubTagMapRepository.deleteByClubId(clubId); + + List tags = clubTagRepository.findAllByIdIn(request.tagIds()); + if (tags.size() != request.tagIds().size()) { + throw CustomException.of(NOT_FOUND_CLUB); + } + + List tagMaps = tags.stream() + .map(tag -> ClubTagMap.builder() + .club(club) + .tag(tag) + .build()) + .toList(); + + clubTagMapRepository.saveAll(tagMaps); + } + + @Transactional + public void updateDetails(Integer clubId, Integer userId, ClubDetailUpdateRequest request) { + userRepository.getById(userId); + Club club = clubRepository.getById(clubId); + + if (!hasClubManageAccess(clubId, userId, MANAGER_ALLOWED_GROUPS)) { + throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); + } + + club.updateDetails(request.location(), request.introduce()); + } + + @Transactional + public void updateBasicInfo(Integer clubId, Integer userId, ClubBasicInfoUpdateRequest request) { + userRepository.getById(userId); + Club club = clubRepository.getById(clubId); + + // TODO: 어드민 권한 체크 로직 추가 필요 (현재는 미구현) + // if (!isAdmin(userId)) { + // throw CustomException.of(FORBIDDEN_CLUB_MANAGER_ACCESS); + // } + + club.updateBasicInfo(request.name(), request.clubCategory()); + } - return getClubDetail(clubId, userId); + public ClubTagsResponse getTags() { + List tags = clubTagRepository.findAll(); + return ClubTagsResponse.from(tags); } public ClubMembershipsResponse getJoinedClubs(Integer userId) { From b2e7bd0293e6bd2c1fc68b00d66578d4d08f0165 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Thu, 22 Jan 2026 16:10:44 +0900 Subject: [PATCH 16/17] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src.zip | Bin 215486 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src.zip diff --git a/src.zip b/src.zip deleted file mode 100644 index 51e5e8d91e5a603e733c53ffe9863ec6719ec18e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215486 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

7I5bkOkmU*swIP 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 AfDuYjPc9Lfrl5lq+hG*SpX2(3DI` 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 z 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 No&d@_(9}Pg{{g`Am5KlW From 9a4c6b309c08974ba6ae5402881726a18f5a2f0a Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Thu, 22 Jan 2026 16:46:37 +0900 Subject: [PATCH 17/17] =?UTF-8?q?fix:=20=ED=83=9C=EA=B7=B8=20Repository=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EB=B6=88=EA=B0=80=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/club/repository/ClubTagMapRepository.java | 2 -- .../agit/konect/domain/club/service/ClubService.java | 11 +++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubTagMapRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubTagMapRepository.java index bc5ca897..6c7017bd 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubTagMapRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubTagMapRepository.java @@ -17,6 +17,4 @@ public interface ClubTagMapRepository extends Repository clubTagMaps); } diff --git a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java index 3b1aaa82..99571b11 100644 --- a/src/main/java/gg/agit/konect/domain/club/service/ClubService.java +++ b/src/main/java/gg/agit/konect/domain/club/service/ClubService.java @@ -167,14 +167,13 @@ public void updateProfile(Integer clubId, Integer userId, ClubProfileUpdateReque throw CustomException.of(NOT_FOUND_CLUB); } - List tagMaps = tags.stream() - .map(tag -> ClubTagMap.builder() + tags.forEach(tag -> { + ClubTagMap tagMap = ClubTagMap.builder() .club(club) .tag(tag) - .build()) - .toList(); - - clubTagMapRepository.saveAll(tagMaps); + .build(); + clubTagMapRepository.save(tagMap); + }); } @Transactional