33import com .be .sportizebe .domain .chat .service .ChatRoomService ;
44import com .be .sportizebe .domain .club .dto .request .ClubCreateRequest ;
55import com .be .sportizebe .domain .club .dto .request .ClubUpdateRequest ;
6+ import com .be .sportizebe .domain .club .dto .response .ClubImageResponse ;
67import com .be .sportizebe .domain .club .dto .response .ClubResponse ;
78import com .be .sportizebe .domain .club .entity .Club ;
89import com .be .sportizebe .domain .club .entity .ClubMember ;
910import com .be .sportizebe .domain .club .exception .ClubErrorCode ;
1011import com .be .sportizebe .domain .club .repository .ClubMemberRepository ;
1112import com .be .sportizebe .domain .club .repository .ClubRepository ;
12- import com .be .sportizebe .domain .user .entity .SportType ;
1313import com .be .sportizebe .domain .user .entity .User ;
1414import com .be .sportizebe .global .exception .CustomException ;
15+ import com .be .sportizebe .global .s3 .enums .PathName ;
16+ import com .be .sportizebe .global .s3 .service .S3Service ;
1517import lombok .RequiredArgsConstructor ;
1618import org .springframework .stereotype .Service ;
1719import org .springframework .transaction .annotation .Transactional ;
20+ import org .springframework .web .multipart .MultipartFile ;
1821
1922@ Service
2023@ RequiredArgsConstructor
@@ -24,16 +27,23 @@ public class ClubServiceImpl implements ClubService {
2427 private final ClubRepository clubRepository ;
2528 private final ChatRoomService chatRoomService ;
2629 private final ClubMemberRepository clubMemberRepository ;
30+ private final S3Service s3Service ;
2731
2832 @ Override
2933 @ Transactional
30- public ClubResponse createClub (ClubCreateRequest request , User user ) {
34+ public ClubResponse createClub (ClubCreateRequest request , MultipartFile image , User user ) {
3135 if (clubRepository .existsByName (request .name ())) {
3236 throw new CustomException (ClubErrorCode .CLUB_NAME_DUPLICATED );
3337 }
3438
39+ // 이미지가 있으면 S3에 업로드
40+ String clubImageUrl = null ;
41+ if (image != null && !image .isEmpty ()) {
42+ clubImageUrl = s3Service .uploadFile (PathName .CLUB , image );
43+ }
44+
3545 // 동호회 엔티티 생성
36- Club club = request .toEntity (user );
46+ Club club = request .toEntity (user , clubImageUrl );
3747 clubRepository .save (club );
3848
3949 // 동호회 멤버 테이블에 방장(동호회 생성자) 추가
@@ -56,6 +66,7 @@ public ClubResponse updateClub(Long clubId, ClubUpdateRequest request, User user
5666 Club club = clubRepository .findById (clubId )
5767 .orElseThrow (() -> new CustomException (ClubErrorCode .CLUB_NOT_FOUND ));
5868
69+ // 동호회 방장만 수정 가능하도록 검증
5970 if (club .getLeader ().getId () != user .getId ()) {
6071 throw new CustomException (ClubErrorCode .CLUB_UPDATE_DENIED );
6172 }
@@ -72,4 +83,29 @@ public ClubResponse updateClub(Long clubId, ClubUpdateRequest request, User user
7283
7384 return ClubResponse .from (club );
7485 }
86+
87+ @ Override
88+ @ Transactional
89+ public ClubImageResponse updateClubImage (Long clubId , MultipartFile image , User user ) {
90+ Club club = clubRepository .findById (clubId )
91+ .orElseThrow (() -> new CustomException (ClubErrorCode .CLUB_NOT_FOUND ));
92+
93+ // 동호회 방장만 수정 가능하도록 검증
94+ if (club .getLeader ().getId () != user .getId ()) {
95+ throw new CustomException (ClubErrorCode .CLUB_UPDATE_DENIED );
96+ }
97+
98+ // 기존 이미지가 있으면 S3에서 삭제
99+ if (club .getClubImage () != null ) {
100+ s3Service .deleteFile (club .getClubImage ());
101+ }
102+
103+ // 새 이미지 S3에 업로드
104+ String clubImageUrl = s3Service .uploadFile (PathName .CLUB , image );
105+
106+ // 동호회 이미지 URL 업데이트
107+ club .updateClubImage (clubImageUrl );
108+
109+ return ClubImageResponse .from (clubImageUrl );
110+ }
75111}
0 commit comments