From 060b5be0dcd03c855c168b7c721c25718c7146f5 Mon Sep 17 00:00:00 2001 From: daeunkwak Date: Wed, 9 Aug 2023 13:38:58 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domains/image/service/ImageService.java | 17 +++++++++++ .../member/controller/MemberController.java | 28 ++++++++++++++++++- .../MemberProfileUpdateRequestDto.java | 25 +++++++++++++++++ .../domains/member/service/MemberService.java | 9 ++++++ .../java/com/cmc/global/s3/S3Uploader.java | 14 ++++++++++ .../src/main/java/com/cmc/member/Member.java | 17 +++++++++++ 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 cider-api/src/main/java/com/cmc/domains/member/dto/request/MemberProfileUpdateRequestDto.java diff --git a/cider-api/src/main/java/com/cmc/domains/image/service/ImageService.java b/cider-api/src/main/java/com/cmc/domains/image/service/ImageService.java index cf43e41..d9ab3b4 100644 --- a/cider-api/src/main/java/com/cmc/domains/image/service/ImageService.java +++ b/cider-api/src/main/java/com/cmc/domains/image/service/ImageService.java @@ -8,9 +8,11 @@ import com.cmc.domains.challenge.repository.ChallengeRepository; import com.cmc.domains.image.certify.repository.CertifyImageRepository; import com.cmc.domains.image.certifyExample.repository.CertifyExampleImageRepository; +import com.cmc.domains.member.repository.MemberRepository; import com.cmc.global.s3.S3Uploader; import com.cmc.image.certify.CertifyImage; import com.cmc.image.certifyExample.CertifyExampleImage; +import com.cmc.member.Member; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,6 +32,7 @@ public class ImageService { private final CertifyRepository certifyRepository; private final CertifyExampleImageRepository certifyExampleImageRepository; private final CertifyImageRepository certifyImageRepository; + private final MemberRepository memberRepository; // 챌린지 인증 성공 예시 사진 업로드 @@ -75,6 +78,14 @@ public List uploadCertifyImages(List certifyImages, return certifyImageList; } + // 멤버 프로필 이미지 업데이트 + public void updateProfileImage(MultipartFile profileImage, Long memberId) throws IOException { + + Member member = findMemberOrThrow(memberId); + String imageUrl = s3Uploader.s3UploadOfProfileImage(member, profileImage); + member.updateProfileImage(imageUrl); + } + private Challenge findChallengeOrThrow(Long challengeId){ return challengeRepository.findById(challengeId).orElseThrow(() -> { @@ -93,4 +104,10 @@ public List getCertifyImage(Challenge challenge) { return certifyExampleImageRepository.findCertifyImage(challenge.getChallengeId()); } + + private Member findMemberOrThrow(Long memberId) { + return memberRepository.findById(memberId).orElseThrow(() -> { + throw new BadRequestException("요청한 멤버는 존재하지 않습니다."); + }); + } } diff --git a/cider-api/src/main/java/com/cmc/domains/member/controller/MemberController.java b/cider-api/src/main/java/com/cmc/domains/member/controller/MemberController.java index e169f69..9be55f9 100644 --- a/cider-api/src/main/java/com/cmc/domains/member/controller/MemberController.java +++ b/cider-api/src/main/java/com/cmc/domains/member/controller/MemberController.java @@ -1,6 +1,8 @@ package com.cmc.domains.member.controller; import com.cmc.common.response.CommonResponse; +import com.cmc.domains.image.service.ImageService; +import com.cmc.domains.member.dto.request.MemberProfileUpdateRequestDto; import com.cmc.domains.member.dto.request.MemberUpdateReqDto; import com.cmc.domains.member.dto.response.*; import com.cmc.domains.member.dto.response.mypage.MyActivityInfoResponseDto; @@ -15,9 +17,12 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.Random; @@ -29,11 +34,12 @@ public class MemberController { private final MemberService memberService; + private final ImageService imageService; @Tag(name = "members", description = "멤버 API") @Operation(summary = "멤버 업데이트") @PatchMapping(value = "") - public ResponseEntity updateTeam(@Parameter(hidden = true) @RequestMemberId Long memberId, @Valid @RequestBody MemberUpdateReqDto request) { + public ResponseEntity updateMember(@Parameter(hidden = true) @RequestMemberId Long memberId, @Valid @RequestBody MemberUpdateReqDto request) { Member member = memberService.updateMember(memberId, request.getMemberGender(), request.getMemberBirth(), request.getInterestChallenge()); return ResponseEntity.ok(MemberUpdateResDto.from(member)); @@ -47,6 +53,26 @@ public ResponseEntity getMe(@Parameter(hidden = true) @Reques return ResponseEntity.ok(MemberResponseDto.from(memberService.find(memberId))); } + @Tag(name = "myPage", description = "마이페이지 API") + @Operation(summary = "프로필 수정 api") + @PatchMapping(value = "/profile") + public ResponseEntity updateProfileImage(@Parameter(hidden = true) @RequestMemberId Long memberId, + @Valid @RequestBody MemberProfileUpdateRequestDto request) { + + memberService.updateProfile(request.getMemberName(), request.getMemberIntro(), memberId); + return ResponseEntity.ok(CommonResponse.from("프로필 수정이 완료되었습니다.")); + } + + @Tag(name = "myPage", description = "마이페이지 API") + @Operation(summary = "프로필 이미지 수정 api") + @PatchMapping(value = "/profile/image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public ResponseEntity updateProfileImage(@Parameter(hidden = true) @RequestMemberId Long memberId, + @RequestPart(value = "profileImage") MultipartFile profileImage) throws IOException { + + imageService.updateProfileImage(profileImage, memberId); + return ResponseEntity.ok(CommonResponse.from("프로필 이미지 수정이 완료되었습니다.")); + } + @Tag(name = "members", description = "멤버 API") @GetMapping(value = "/nicknames") @Operation(summary = "닉네임 랜덤 생성 api") diff --git a/cider-api/src/main/java/com/cmc/domains/member/dto/request/MemberProfileUpdateRequestDto.java b/cider-api/src/main/java/com/cmc/domains/member/dto/request/MemberProfileUpdateRequestDto.java new file mode 100644 index 0000000..e0e5016 --- /dev/null +++ b/cider-api/src/main/java/com/cmc/domains/member/dto/request/MemberProfileUpdateRequestDto.java @@ -0,0 +1,25 @@ +package com.cmc.domains.member.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.validation.annotation.Validated; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Validated +public class MemberProfileUpdateRequestDto { + + @NotNull + @Schema(description = "멤버 이름", example = "건조한모래의사막", required=true) + private String memberName; + + @NotNull + @Schema(description = "멤버 소개", example = "안녕하세요", required=true) + private String memberIntro; +} diff --git a/cider-api/src/main/java/com/cmc/domains/member/service/MemberService.java b/cider-api/src/main/java/com/cmc/domains/member/service/MemberService.java index aaede8a..ffadb99 100644 --- a/cider-api/src/main/java/com/cmc/domains/member/service/MemberService.java +++ b/cider-api/src/main/java/com/cmc/domains/member/service/MemberService.java @@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; @Service @Transactional @@ -39,6 +40,14 @@ public Member find(Long memberId) { return memberRepository.findById(memberId).orElseThrow(() -> new BadRequestException("해당하는 멤버를 찾을 수 없습니다.")); } + // 프로필 업데이트 + public void updateProfile(String memberName, String memberIntro, Long memberId) { + + Member member = findMemberOrThrow(memberId); + member.updateName(memberName); + member.updateIntro(memberIntro); + } + private Member findMemberOrThrow(Long memberId) { return memberRepository.findById(memberId).orElseThrow(() -> { throw new BadRequestException("요청한 멤버는 존재하지 않습니다."); diff --git a/cider-api/src/main/java/com/cmc/global/s3/S3Uploader.java b/cider-api/src/main/java/com/cmc/global/s3/S3Uploader.java index 533ccfa..5d72a1d 100644 --- a/cider-api/src/main/java/com/cmc/global/s3/S3Uploader.java +++ b/cider-api/src/main/java/com/cmc/global/s3/S3Uploader.java @@ -9,6 +9,7 @@ import com.cmc.challenge.Challenge; import com.cmc.image.Image; import com.cmc.image.certify.CertifyImage; +import com.cmc.member.Member; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -89,6 +90,19 @@ private String s3UploadOfCertifyImage(Certify certify, MultipartFile multipartFi return s3Upload(folderPath, fileName, multipartFile); } + // 프로필 이미지 업로드 + public String s3UploadOfProfileImage(Member member, MultipartFile profileImage) throws IOException{ + + //폴더 경로 + String folderPath = "profile"; + + //파일 이름 + String frontName = String.valueOf(member.getMemberId()); + String fileName = createFileName(frontName, profileImage.getOriginalFilename()); + + return s3Upload(folderPath, fileName, profileImage); + } + /** * S3 업로드 diff --git a/cider-domain/src/main/java/com/cmc/member/Member.java b/cider-domain/src/main/java/com/cmc/member/Member.java index 262f9a5..45a78ba 100644 --- a/cider-domain/src/main/java/com/cmc/member/Member.java +++ b/cider-domain/src/main/java/com/cmc/member/Member.java @@ -49,6 +49,8 @@ public class Member extends BaseTimeEntity { @Column(name = "member_name", columnDefinition = "VARCHAR(50)") private String memberName; + private String memberIntro; + private String memberBirth; // TODO : memberBirth 타입 점검 private String memberGender; @@ -103,4 +105,19 @@ public void update(String memberGender, String memberBirth, String interestChall this.memberBirth = memberBirth; this.interestChallenge = interestChallenge; } + + public void updateProfileImage(String imageUrl){ + + this.profilePath = imageUrl; + } + + public void updateName(String memberName){ + + this.memberName = memberName; + } + + public void updateIntro(String memberIntro){ + + this.memberIntro = memberIntro; + } }