Skip to content

Commit 702717d

Browse files
committed
✨Feat: 동호회 정보 수정기능 구현
1 parent 5e17619 commit 702717d

6 files changed

Lines changed: 59 additions & 2 deletions

File tree

src/main/java/com/be/sportizebe/domain/club/controller/ClubController.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.be.sportizebe.domain.club.controller;
22

33
import com.be.sportizebe.domain.club.dto.request.ClubCreateRequest;
4+
import com.be.sportizebe.domain.club.dto.request.ClubUpdateRequest;
45
import com.be.sportizebe.domain.club.dto.response.ClubResponse;
56
import com.be.sportizebe.domain.club.service.ClubServiceImpl;
67
import com.be.sportizebe.domain.user.entity.SportType;
@@ -24,7 +25,7 @@ public class ClubController {
2425

2526
private final ClubServiceImpl clubService;
2627

27-
@PostMapping("/{sportType}")
28+
@PostMapping("")
2829
@Operation(summary = "동호회 생성", description = "종목별 동호회를 생성합니다. 생성한 사용자가 동호회장이 됩니다.")
2930
public ResponseEntity<BaseResponse<ClubResponse>> createClub(
3031
@RequestBody @Valid ClubCreateRequest request,
@@ -33,4 +34,14 @@ public ResponseEntity<BaseResponse<ClubResponse>> createClub(
3334
return ResponseEntity.status(HttpStatus.CREATED)
3435
.body(BaseResponse.success("동호회 생성 성공", response));
3536
}
37+
38+
@PutMapping("/{clubId}")
39+
@Operation(summary = "동호회 수정", description = "동호회 정보를 수정합니다. 동호회장만 수정할 수 있습니다.")
40+
public ResponseEntity<BaseResponse<ClubResponse>> updateClub(
41+
@PathVariable Long clubId,
42+
@RequestBody @Valid ClubUpdateRequest request,
43+
@AuthenticationPrincipal User user) {
44+
ClubResponse response = clubService.updateClub(clubId, request, user);
45+
return ResponseEntity.ok(BaseResponse.success("동호회 수정 성공", response));
46+
}
3647
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.be.sportizebe.domain.club.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
5+
6+
public record ClubUpdateRequest(
7+
@NotBlank(message = "동호회 이름은 필수 입니다.")
8+
@Schema(description = "동호회 이름", example = "축구 동호회") String name,
9+
@Schema(description = "동호회 소개", example = "매주 토요일 축구합니다") String introduce,
10+
@Schema(description = "최대 정원", example = "20") Integer maxMembers) {
11+
}

src/main/java/com/be/sportizebe/domain/club/entity/Club.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,10 @@ public class Club extends BaseTimeEntity {
4343
@OneToMany(mappedBy = "club", cascade = CascadeType.ALL, orphanRemoval = true)
4444
@Builder.Default
4545
private List<ClubMember> members = new ArrayList<>();
46+
47+
public void update(String name, String introduce, Integer maxMembers) {
48+
this.name = name;
49+
this.introduce = introduce;
50+
this.maxMembers = maxMembers;
51+
}
4652
}

src/main/java/com/be/sportizebe/domain/club/exception/ClubErrorCode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
@AllArgsConstructor
1010
public enum ClubErrorCode implements BaseErrorCode {
1111
CLUB_NOT_FOUND("CLUB_001", "동호회를 찾을 수 없습니다.", HttpStatus.NOT_FOUND),
12-
CLUB_NAME_DUPLICATED("CLUB_002", "이미 존재하는 동호회 이름입니다.", HttpStatus.CONFLICT);
12+
CLUB_NAME_DUPLICATED("CLUB_002", "이미 존재하는 동호회 이름입니다.", HttpStatus.CONFLICT),
13+
CLUB_UPDATE_DENIED("CLUB_003", "동호회 수정 권한이 없습니다.", HttpStatus.FORBIDDEN),
14+
CLUB_MAX_MEMBERS_TOO_SMALL("CLUB_004", "최대 정원은 현재 참여 인원보다 적을 수 없습니다.", HttpStatus.BAD_REQUEST);
1315

1416
private final String code;
1517
private final String message;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.be.sportizebe.domain.club.service;
22

33
import com.be.sportizebe.domain.club.dto.request.ClubCreateRequest;
4+
import com.be.sportizebe.domain.club.dto.request.ClubUpdateRequest;
45
import com.be.sportizebe.domain.club.dto.response.ClubResponse;
56
import com.be.sportizebe.domain.user.entity.SportType;
67
import com.be.sportizebe.domain.user.entity.User;
78

89
public interface ClubService {
910
ClubResponse createClub(ClubCreateRequest request, User user); // 동호회 생성
11+
12+
ClubResponse updateClub(Long clubId, ClubUpdateRequest request, User user); // 동호회 수정
1013
}

src/main/java/com/be/sportizebe/domain/club/service/ClubServiceImpl.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.be.sportizebe.domain.chat.service.ChatRoomService;
44
import com.be.sportizebe.domain.club.dto.request.ClubCreateRequest;
5+
import com.be.sportizebe.domain.club.dto.request.ClubUpdateRequest;
56
import com.be.sportizebe.domain.club.dto.response.ClubResponse;
67
import com.be.sportizebe.domain.club.entity.Club;
78
import com.be.sportizebe.domain.club.entity.ClubMember;
@@ -47,4 +48,27 @@ public ClubResponse createClub(ClubCreateRequest request, User user) {
4748

4849
return ClubResponse.from(club);
4950
}
51+
52+
@Override
53+
@Transactional
54+
public ClubResponse updateClub(Long clubId, ClubUpdateRequest request, User user) {
55+
Club club = clubRepository.findById(clubId)
56+
.orElseThrow(() -> new CustomException(ClubErrorCode.CLUB_NOT_FOUND));
57+
58+
if (club.getLeader().getId() != user.getId()) {
59+
throw new CustomException(ClubErrorCode.CLUB_UPDATE_DENIED);
60+
}
61+
62+
if (!club.getName().equals(request.name()) && clubRepository.existsByName(request.name())) {
63+
throw new CustomException(ClubErrorCode.CLUB_NAME_DUPLICATED);
64+
}
65+
66+
if (request.maxMembers() != null && request.maxMembers() < club.getMembers().size()) {
67+
throw new CustomException(ClubErrorCode.CLUB_MAX_MEMBERS_TOO_SMALL);
68+
}
69+
70+
club.update(request.name(), request.introduce(), request.maxMembers());
71+
72+
return ClubResponse.from(club);
73+
}
5074
}

0 commit comments

Comments
 (0)