Skip to content

Commit

Permalink
Merge pull request #80 from studio-recoding/feat-profile-put
Browse files Browse the repository at this point in the history
[🚀feat] 프로필(닉네임, 사진) 업데이트
  • Loading branch information
JeonHaeseung authored May 19, 2024
2 parents 6069006 + 6ed5745 commit 5e54fe7
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 17 deletions.
10 changes: 5 additions & 5 deletions src/main/java/Ness/Backend/domain/profile/ProfileController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@


import Ness.Backend.domain.member.entity.Member;
import Ness.Backend.domain.profile.dto.request.PatchNicknameDto;
import Ness.Backend.domain.profile.dto.request.PutProfileDto;
import Ness.Backend.domain.profile.dto.request.PatchPersonaDto;
import Ness.Backend.domain.profile.dto.response.GetProfileDto;
import Ness.Backend.global.auth.AuthUser;
Expand All @@ -26,10 +26,10 @@ public GetProfileDto userLogin(@AuthUser Member member) {
return profileService.getProfile(member.getId(), member.getEmail());
}

@PatchMapping("/nickname")
@Operation(summary = "프로필 닉네임 변경 API", description = "사용자의 ID로 프로필 닉네임을 변경하는 API 입니다.")
public ResponseEntity<Long> patchNickname(@AuthUser Member member, @RequestBody PatchNicknameDto patchNicknameDto) {
Long profileId = profileService.updateNickname(member.getId(), patchNicknameDto.getNickname());
@PutMapping("")
@Operation(summary = "프로필 변경 API", description = "프로필 닉네임과 사진을 모두 변경하는 API 입니다.")
public ResponseEntity<Long> patchProfile(@AuthUser Member member, @RequestBody PutProfileDto putProfileDto) {
Long profileId = profileService.updateProfile(member.getId(), putProfileDto);
return new ResponseEntity<>(profileId, HttpStatusCode.valueOf(200));
}

Expand Down
19 changes: 16 additions & 3 deletions src/main/java/Ness/Backend/domain/profile/ProfileService.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package Ness.Backend.domain.profile;

import Ness.Backend.domain.member.entity.Member;
import Ness.Backend.domain.profile.dto.request.PutProfileDto;
import Ness.Backend.domain.profile.dto.response.GetProfileDto;
import Ness.Backend.domain.profile.entity.PersonaType;
import Ness.Backend.domain.profile.entity.Profile;
import Ness.Backend.infra.s3.S3Service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
Expand All @@ -15,10 +17,12 @@
@Slf4j
public class ProfileService {
private final ProfileRepository profileRepository;
public Long updateNickname(Long memberId, String nickname) {
private final S3Service s3Service;

public Long updateProfile(Long memberId, PutProfileDto putProfileDto){
//JPA 변경 감지 사용
Profile profile = profileRepository.findProfileByMember_Id(memberId);
profile.updateNickname(nickname);
profile.updateProfile(putProfileDto.getNickname(), putProfileDto.getKey());

//결과로 profile의 ID 반환
return profile.getId();
Expand All @@ -38,7 +42,7 @@ public GetProfileDto getProfile(Long memberId, String email) {
Profile profile = profileRepository.findProfileByMember_Id(memberId);
GetProfileDto getProfileDto = GetProfileDto.builder()
.id(profile.getId())
.pictureUrl(profile.getPictureUrl())
.pictureUrl(createPictureUrl(memberId, profile))
.nickname(profile.getNickname())
.name(profile.getName())
.isEmailActive(profile.getIsEmailActive())
Expand All @@ -48,4 +52,13 @@ public GetProfileDto getProfile(Long memberId, String email) {

return getProfileDto;
}

/* S3에 사진이 있다면 presigned URL로 보내주고, 없다면 OAuth 로그인으로 생성된 프로필 사진 보내주기 */
private String createPictureUrl(Long memberId, Profile profile){
if(profile.getPictureKey() == null){
return profile.getPictureUrl();
}
return s3Service.getGetS3Url(memberId,
profile.getPictureKey()).getPreSignedUrl();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@

@Data
@NoArgsConstructor
public class PatchNicknameDto {
public class PutProfileDto {
@Schema(description = "업데이트할 사용자 닉네임", example = "홍길동")
private String nickname;

@Schema(description = "업데이트할 사용자 프로필 키 경로", example = "untitle.png")
private String key;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ public class Profile {

private String pictureUrl;

private String pictureKey;

private String nickname;

private String name;
Expand All @@ -31,8 +33,11 @@ public class Profile {
@JoinColumn(name = "member_id")
private Member member;

public void updateNickname(String nickname){
public void updateProfile(String nickname, String pictureKey){
this.nickname = nickname;
if(pictureKey != null){
this.pictureKey = pictureKey;
}
}

public void updateMailActive(Boolean isEmailActive){
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/Ness/Backend/infra/s3/S3Controller.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ public class S3Controller {

@GetMapping(value = "/posturl")
@Operation(summary = "post용 presigned url 생성", description = "post용 presigned url을 만드는 API 입니다.")
public ResponseEntity<GetS3UrlDto> getPostS3Url(@AuthUser Member member) {
GetS3UrlDto getS3UrlDto = s3Service.getPostS3Url(member.getId());
public ResponseEntity<GetS3UrlDto> getPostS3Url(@AuthUser Member member, String filename) {
GetS3UrlDto getS3UrlDto = s3Service.getPostS3Url(member.getId(), filename);
return new ResponseEntity<>(getS3UrlDto, HttpStatusCode.valueOf(200));
}

@GetMapping(value = "/geturl")
@Operation(summary = "get용 presigned url 생성", description = "post용 presigned url을 만드는 API 입니다.")
@Operation(summary = "get용 presigned url 생성", description = "get용 presigned url을 만드는 API 입니다.")
public ResponseEntity<GetS3UrlDto> getGetS3Url(@AuthUser Member member, @RequestParam String key) {
GetS3UrlDto getS3UrlDto = s3Service.getGetS3Url(member.getId(), key);
return new ResponseEntity<>(getS3UrlDto, HttpStatusCode.valueOf(200));
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/Ness/Backend/infra/s3/S3Service.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,23 @@ public class S3Service {
private String bucket;

@Transactional(readOnly = true)
public GetS3UrlDto getPostS3Url(Long memberId) {
public GetS3UrlDto getPostS3Url(Long memberId, String filename) {
// filename 설정하기(profile 경로 + 멤버ID + 랜덤 값)
String fileName = "profile/" + memberId + "/" + UUID.randomUUID();
String key = "profile/" + memberId + "/" + UUID.randomUUID() + "/" + filename;

// url 유효기간 설정하기(1시간)
Date expiration = getExpiration();

// presigned url 생성하기
GeneratePresignedUrlRequest generatePresignedUrlRequest =
getPostGeneratePresignedUrlRequest(fileName, expiration);
getPostGeneratePresignedUrlRequest(key, expiration);

URL url = amazonS3Client.generatePresignedUrl(generatePresignedUrlRequest);

// return
return GetS3UrlDto.builder()
.preSignedUrl(url.toExternalForm())
.key(fileName)
.key(key)
.build();
}

Expand Down
1 change: 1 addition & 0 deletions src/main/java/Ness/Backend/infra/s3/dto/GetS3UrlDto.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package Ness.Backend.infra.s3.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;


Expand Down

0 comments on commit 5e54fe7

Please sign in to comment.