diff --git a/src/main/java/org/terning/terningserver/controller/ScrapController.java b/src/main/java/org/terning/terningserver/controller/ScrapController.java index 8660801..17d1c93 100644 --- a/src/main/java/org/terning/terningserver/controller/ScrapController.java +++ b/src/main/java/org/terning/terningserver/controller/ScrapController.java @@ -29,20 +29,20 @@ public ResponseEntity createScrap( return ResponseEntity.ok(SuccessResponse.of(SUCCESS_CREATE_SCRAP)); } - @DeleteMapping("/scraps/{scrapId}") + @DeleteMapping("/scraps/{internshipAnnouncementId}") public ResponseEntity deleteScrap( @AuthenticationPrincipal Long userId, - @PathVariable Long scrapId) { - scrapService.deleteScrap(scrapId, userId); + @PathVariable Long internshipAnnouncementId) { + scrapService.deleteScrap(internshipAnnouncementId, userId); return ResponseEntity.ok(SuccessResponse.of(SUCCESS_DELETE_SCRAP)); } - @PatchMapping("/scraps/{scrapId}") + @PatchMapping("/scraps/{internshipAnnouncementId}") public ResponseEntity updateScrapColor( @AuthenticationPrincipal Long userId, - @PathVariable Long scrapId, + @PathVariable Long internshipAnnouncementId, @RequestBody UpdateScrapRequestDto request) { - scrapService.updateScrapColor(scrapId, request, userId); + scrapService.updateScrapColor(internshipAnnouncementId, request, userId); return ResponseEntity.ok(SuccessResponse.of(SUCCESS_UPDATE_SCRAP)); } } diff --git a/src/main/java/org/terning/terningserver/controller/UserProfileController.java b/src/main/java/org/terning/terningserver/controller/UserProfileController.java index e6b032a..57e2a29 100644 --- a/src/main/java/org/terning/terningserver/controller/UserProfileController.java +++ b/src/main/java/org/terning/terningserver/controller/UserProfileController.java @@ -1,18 +1,18 @@ package org.terning.terningserver.controller; import lombok.RequiredArgsConstructor; +import org.apache.coyote.Response; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import org.terning.terningserver.controller.swagger.UserSwagger; +import org.terning.terningserver.dto.user.request.ProfileUpdateRequestDto; import org.terning.terningserver.dto.user.response.ProfileResponseDto; import org.terning.terningserver.exception.dto.SuccessResponse; import org.terning.terningserver.service.UserService; import static org.terning.terningserver.exception.enums.SuccessMessage.SUCCESS_GET_PROFILE; +import static org.terning.terningserver.exception.enums.SuccessMessage.SUCCESS_UPDATE_PROFILE; @RestController @RequiredArgsConstructor @@ -28,4 +28,13 @@ public ResponseEntity> getProfile( ProfileResponseDto profile = userService.getProfile(userId); return ResponseEntity.ok(SuccessResponse.of(SUCCESS_GET_PROFILE, profile)); } + + @PatchMapping("/mypage/profile") + public ResponseEntity updateProfile( + @AuthenticationPrincipal Long userId, + @RequestBody ProfileUpdateRequestDto request + ){ + userService.updateProfile(userId, request); + return ResponseEntity.ok(SuccessResponse.of(SUCCESS_UPDATE_PROFILE)); + } } diff --git a/src/main/java/org/terning/terningserver/controller/swagger/UserSwagger.java b/src/main/java/org/terning/terningserver/controller/swagger/UserSwagger.java index 5575e80..0879bfd 100644 --- a/src/main/java/org/terning/terningserver/controller/swagger/UserSwagger.java +++ b/src/main/java/org/terning/terningserver/controller/swagger/UserSwagger.java @@ -3,6 +3,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.http.ResponseEntity; +import org.terning.terningserver.dto.user.request.ProfileUpdateRequestDto; import org.terning.terningserver.dto.user.response.ProfileResponseDto; import org.terning.terningserver.exception.dto.SuccessResponse; @@ -11,6 +12,13 @@ public interface UserSwagger { @Operation(summary = "마이페이지 > 프로필 정보 불러오기", description = "마이페이지에서 프로필 정보를 불러오는 API") ResponseEntity> getProfile( - Long userId + Long userId ); + + @Operation(summary = "마이페이지 > 프로필 정보 수정하기", description = "마이페이지에서 프로필 정보를 수정하는 API") + ResponseEntity updateProfile( + Long userId, + ProfileUpdateRequestDto request + ); + } diff --git a/src/main/java/org/terning/terningserver/domain/User.java b/src/main/java/org/terning/terningserver/domain/User.java index 4a08c32..4164236 100644 --- a/src/main/java/org/terning/terningserver/domain/User.java +++ b/src/main/java/org/terning/terningserver/domain/User.java @@ -4,6 +4,7 @@ import lombok.*; import org.terning.terningserver.domain.common.BaseTimeEntity; import org.terning.terningserver.domain.enums.AuthType; +import org.terning.terningserver.domain.enums.ProfileImage; import org.terning.terningserver.domain.enums.State; import org.terning.terningserver.exception.CustomException; @@ -37,8 +38,9 @@ public class User extends BaseTimeEntity { // TODO: 특수문자, 첫글자 , 12자리 이내 @Column(length = 12) private String name; // 사용자 이름 - - private Integer profileImage; //유저 아이콘 + + @Enumerated(STRING) + private ProfileImage profileImage; //유저 아이콘 @Enumerated(STRING) private AuthType authType; // 인증 유형 (예: 카카오, 애플) @@ -68,4 +70,10 @@ public void resetRefreshToken() { public void assignFilter(Filter filter) { this.filter = filter; } + + //프로필 수정 메서드 + public void updateProfile(String name, ProfileImage profileImage){ + this.name = name; + this.profileImage = profileImage; + } } diff --git a/src/main/java/org/terning/terningserver/domain/enums/Color.java b/src/main/java/org/terning/terningserver/domain/enums/Color.java index 2545ac4..5925c80 100644 --- a/src/main/java/org/terning/terningserver/domain/enums/Color.java +++ b/src/main/java/org/terning/terningserver/domain/enums/Color.java @@ -8,18 +8,18 @@ @Getter public enum Color { - RED(0, "ED4E54"), - ORANGE1(1, "EE7647"), - ORANGE2(2, "F3A649"), - YELLOW(3, "F5E660"), - GREEN1(4, "C4E953"), - GREEN2(5, "84D558"), - BLUE1(6, "45D0CC"), - BLUE2(7, "4AA9F2"), - PURPLE(8, "9B64E2"), - PINK(9, "F260AC"); + RED("red", "ED4E54"), + ORANGE("orange", "F3A649"), + LIGHT_GREEN("lightgreen", "C4E953"), + MINT("mint", "45D0CC"), + PURPLE("purple", "9B64E2"), + CORAL("coral", "EE7647"), + YELLOW("yellow", "F5E660"), + GREEN("green", "84D558"), + BLUE("blue", "4AA9F2"), + PINK("pink", "F260AC"); - private final int key; + private final String name; private final String value; public String getColorValue() { diff --git a/src/main/java/org/terning/terningserver/domain/enums/ProfileImage.java b/src/main/java/org/terning/terningserver/domain/enums/ProfileImage.java new file mode 100644 index 0000000..86acb47 --- /dev/null +++ b/src/main/java/org/terning/terningserver/domain/enums/ProfileImage.java @@ -0,0 +1,25 @@ +package org.terning.terningserver.domain.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum ProfileImage { + BASIC("basic"), + LUCKY("lucky"), + SMART("smart"), + GLASS("glass"), + CALENDAR("calendar"); + + private final String value; + + public static ProfileImage fromValue(String value){ + for(ProfileImage image : values()){ + if(image.value.equalsIgnoreCase(value)){ + return image; + } + } + throw new IllegalArgumentException("Invalid profile image: " + value); + } +} diff --git a/src/main/java/org/terning/terningserver/dto/auth/request/SignUpRequestDto.java b/src/main/java/org/terning/terningserver/dto/auth/request/SignUpRequestDto.java index b010b96..97ba398 100644 --- a/src/main/java/org/terning/terningserver/dto/auth/request/SignUpRequestDto.java +++ b/src/main/java/org/terning/terningserver/dto/auth/request/SignUpRequestDto.java @@ -9,11 +9,11 @@ @Builder(access = PRIVATE) public record SignUpRequestDto( @NonNull String name, - int profileImage, + String profileImage, @NonNull AuthType authType ) { - public static SignUpRequestDto of(String name, int profileImage, AuthType authType){ + public static SignUpRequestDto of(String name, String profileImage, AuthType authType){ return SignUpRequestDto.builder() .name(name) .profileImage(profileImage) diff --git a/src/main/java/org/terning/terningserver/dto/auth/request/SignUpWithAuthIdRequestDto.java b/src/main/java/org/terning/terningserver/dto/auth/request/SignUpWithAuthIdRequestDto.java index 98674ce..a9ad50a 100644 --- a/src/main/java/org/terning/terningserver/dto/auth/request/SignUpWithAuthIdRequestDto.java +++ b/src/main/java/org/terning/terningserver/dto/auth/request/SignUpWithAuthIdRequestDto.java @@ -10,10 +10,10 @@ public record SignUpWithAuthIdRequestDto( @NonNull String authId, @NonNull String name, - int profileImage, + String profileImage, @NonNull AuthType authType ) { - public static SignUpWithAuthIdRequestDto of(String authId, String name, int profileImage, AuthType authType){ + public static SignUpWithAuthIdRequestDto of(String authId, String name, String profileImage, AuthType authType){ return SignUpWithAuthIdRequestDto.builder() .authId(authId) .name(name) diff --git a/src/main/java/org/terning/terningserver/dto/auth/request/TokenGetRequestDto.java b/src/main/java/org/terning/terningserver/dto/auth/request/TokenGetRequestDto.java deleted file mode 100644 index 7bd4eef..0000000 --- a/src/main/java/org/terning/terningserver/dto/auth/request/TokenGetRequestDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.terning.terningserver.dto.auth.request; - -import lombok.Builder; -import lombok.NonNull; - -import static lombok.AccessLevel.*; - -@Builder(access = PRIVATE) -public record TokenGetRequestDto( - @NonNull String refreshToken -) { - - public static TokenGetRequestDto of(String refreshToken) { - return TokenGetRequestDto.builder() - .refreshToken(refreshToken) - .build(); - } -} diff --git a/src/main/java/org/terning/terningserver/dto/scrap/request/CreateScrapRequestDto.java b/src/main/java/org/terning/terningserver/dto/scrap/request/CreateScrapRequestDto.java index 37fb183..374089d 100644 --- a/src/main/java/org/terning/terningserver/dto/scrap/request/CreateScrapRequestDto.java +++ b/src/main/java/org/terning/terningserver/dto/scrap/request/CreateScrapRequestDto.java @@ -1,7 +1,7 @@ package org.terning.terningserver.dto.scrap.request; public record CreateScrapRequestDto( - int color + String color ) { } diff --git a/src/main/java/org/terning/terningserver/dto/scrap/request/UpdateScrapRequestDto.java b/src/main/java/org/terning/terningserver/dto/scrap/request/UpdateScrapRequestDto.java index 9843b8e..51851df 100644 --- a/src/main/java/org/terning/terningserver/dto/scrap/request/UpdateScrapRequestDto.java +++ b/src/main/java/org/terning/terningserver/dto/scrap/request/UpdateScrapRequestDto.java @@ -1,6 +1,6 @@ package org.terning.terningserver.dto.scrap.request; public record UpdateScrapRequestDto( - int color + String color ) { } diff --git a/src/main/java/org/terning/terningserver/dto/user/request/Empty.txt b/src/main/java/org/terning/terningserver/dto/user/request/Empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/org/terning/terningserver/dto/user/request/ProfileUpdateRequestDto.java b/src/main/java/org/terning/terningserver/dto/user/request/ProfileUpdateRequestDto.java new file mode 100644 index 0000000..9ba7530 --- /dev/null +++ b/src/main/java/org/terning/terningserver/dto/user/request/ProfileUpdateRequestDto.java @@ -0,0 +1,19 @@ +package org.terning.terningserver.dto.user.request; + +import lombok.Builder; +import lombok.NonNull; + +import static lombok.AccessLevel.PRIVATE; + +@Builder(access = PRIVATE) +public record ProfileUpdateRequestDto( + @NonNull String name, + String profileImage +) { + public static ProfileUpdateRequestDto of(String name, String profileImage){ + return ProfileUpdateRequestDto.builder() + .name(name) + .profileImage(profileImage) + .build(); + } +} diff --git a/src/main/java/org/terning/terningserver/dto/user/response/ProfileResponseDto.java b/src/main/java/org/terning/terningserver/dto/user/response/ProfileResponseDto.java index 38de73c..fd1e62b 100644 --- a/src/main/java/org/terning/terningserver/dto/user/response/ProfileResponseDto.java +++ b/src/main/java/org/terning/terningserver/dto/user/response/ProfileResponseDto.java @@ -6,11 +6,13 @@ @Builder public record ProfileResponseDto( String name, + String profileImage, String authType ) { public static ProfileResponseDto of(final User user){ return ProfileResponseDto.builder() .name(user.getName()) + .profileImage(user.getProfileImage().getValue()) // Enum to String .authType(user.getAuthType().name().toUpperCase()) .build(); } diff --git a/src/main/java/org/terning/terningserver/exception/enums/ErrorMessage.java b/src/main/java/org/terning/terningserver/exception/enums/ErrorMessage.java index 8d43209..24134d0 100644 --- a/src/main/java/org/terning/terningserver/exception/enums/ErrorMessage.java +++ b/src/main/java/org/terning/terningserver/exception/enums/ErrorMessage.java @@ -23,7 +23,7 @@ public enum ErrorMessage { FAILED_SIGN_UP_USER_FILTER_CREATION(404, "사용자 필터 생성에 실패하였습니다"), FAILED_SIGN_UP_USER_FILTER_ASSIGNMENT(404, "사용자 필터 연결에 실패하였습니다"), - //스크랩 + // 스크랩 EXISTS_SCRAP_ALREADY(400, "이미 스크랩했습니다."), // 로그 아웃 @@ -32,12 +32,15 @@ public enum ErrorMessage { // 계정 탈퇴 FAILED_WITHDRAW(404, "계정 탈퇴에 실패하였습니다"), + + // 마이페이지 + INVALID_PROFILE_IMAGE(404, "유효하지 않은 프로필 이미지 입니다."), - //404(NotFound) + // 404(NotFound) NOT_FOUND_INTERN_CATEGORY(404, "해당 인턴 공고는 존재하지 않습니다"), NOT_FOUND_INTERN_EXCEPTION(404, "해당 인턴 공고는 존재하지 않습니다"), NOT_FOUND_USER_EXCEPTION(404, "해당 유저가 존재하지 않습니다"), - NOT_FOUND_SCRAP(404, "해당 스크랩 id에 대한 스크랩 정보가 존재하지 않습니다"), + NOT_FOUND_SCRAP(404, "스크랩 정보가 존재하지 않습니다"), FORBIDDEN_DELETE_SCRAP(403, "해당 유저가 스크랩하지 않았으므로 스크랩 취소가 불가합니다"); private final int status; diff --git a/src/main/java/org/terning/terningserver/exception/enums/SuccessMessage.java b/src/main/java/org/terning/terningserver/exception/enums/SuccessMessage.java index 9795043..4f97534 100644 --- a/src/main/java/org/terning/terningserver/exception/enums/SuccessMessage.java +++ b/src/main/java/org/terning/terningserver/exception/enums/SuccessMessage.java @@ -52,8 +52,8 @@ public enum SuccessMessage { SUCCESS_UPDATE_USER_FILTER(200, "필터링 재설정에 성공했습니다"), // My page (마이페이지 화면) - SUCCESS_GET_PROFILE(200, "마이페이지 > 프로필 정보 불러오기를 성공했습니다"); - + SUCCESS_GET_PROFILE(200, "마이페이지 > 프로필 정보 불러오기를 성공했습니다"), + SUCCESS_UPDATE_PROFILE(200, "프로필 수정에 성공했습니다"); private final int status; private final String message; diff --git a/src/main/java/org/terning/terningserver/repository/scrap/ScrapRepository.java b/src/main/java/org/terning/terningserver/repository/scrap/ScrapRepository.java index 16dac45..542f0fd 100644 --- a/src/main/java/org/terning/terningserver/repository/scrap/ScrapRepository.java +++ b/src/main/java/org/terning/terningserver/repository/scrap/ScrapRepository.java @@ -14,6 +14,8 @@ public interface ScrapRepository extends JpaRepository, ScrapReposi // List findByUserIdAndInternshipAnnouncement_Deadline(Long userId, LocalDate deadline); + void deleteByInternshipAnnouncementIdAndUserId(Long internshipId, Long userId); + List findByUserIdAndInternshipAnnouncement_DeadlineBetween(Long userId, LocalDate start, LocalDate end); } diff --git a/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java b/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java index 5dc96c3..3794be4 100644 --- a/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java +++ b/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java @@ -11,6 +11,7 @@ import org.terning.terningserver.domain.Token; import org.terning.terningserver.domain.User; import org.terning.terningserver.domain.enums.Grade; +import org.terning.terningserver.domain.enums.ProfileImage; import org.terning.terningserver.domain.enums.WorkingPeriod; import org.terning.terningserver.dto.auth.request.SignInRequestDto; import org.terning.terningserver.dto.auth.request.SignUpFilterRequestDto; @@ -47,22 +48,10 @@ public class AuthServiceImpl implements AuthService { @Transactional public SignInResponseDto signIn(String authAccessToken, SignInRequestDto request) { String authId = getAuthId(request.authType(), authAccessToken); - Optional userOptional = userRepository.findByAuthIdAndAuthType(authId, request.authType()); - - if (userOptional.isPresent()) { - User user = userOptional.get(); - Token token = getToken(user); - user.updateRefreshToken(token.getRefreshToken()); - return SignInResponseDto.of( - token, - authId, - request.authType(), - user.getId() - ); - } - else { - return SignInResponseDto.of(null, authId, request.authType(), null); - } + + return findUserByAuthIdAndType(authId, request.authType()) + .map(user -> createSignInResponseForExistingUser(user, authId, request.authType())) + .orElseGet(() -> createSignInResponseForNonExistingUser(authId, request.authType())); } @Transactional @@ -113,6 +102,25 @@ public void connectFilterToUser(long userId, long filterId) { userRepository.save(user); } + private Optional findUserByAuthIdAndType(String authId, AuthType authType) { + return userRepository.findByAuthIdAndAuthType(authId, authType); + } + + private SignInResponseDto createSignInResponseForExistingUser(User user, String authId, AuthType authType) { + Token token = getToken(user); + user.updateRefreshToken(token.getRefreshToken()); + return SignInResponseDto.of( + token, + authId, + authType, + user.getId() + ); + } + + private SignInResponseDto createSignInResponseForNonExistingUser(String authId, AuthType authType) { + return SignInResponseDto.of(null, authId, authType, null); + } + private String getAuthId(AuthType authType, String authAccessToken) { return switch (authType) { case APPLE -> appleService.getAppleData(authAccessToken); @@ -142,11 +150,15 @@ private SignUpWithAuthIdRequestDto createSignUpRequestDto(String authId, SignUpR } private User createUser(SignUpWithAuthIdRequestDto requestDto) { + //프로필 이미지가 null일 경우 기본값 "basic"으로 설정 + ProfileImage profileImage = requestDto.profileImage() != null + ? ProfileImage.fromValue(requestDto.profileImage()) : ProfileImage.BASIC; + User user = User.builder() .authId(requestDto.authId()) .name(requestDto.name()) .authType(requestDto.authType()) - .profileImage(requestDto.profileImage()) + .profileImage(profileImage) //String to Enum .build(); return userRepository.save(user); } diff --git a/src/main/java/org/terning/terningserver/service/ScrapServiceImpl.java b/src/main/java/org/terning/terningserver/service/ScrapServiceImpl.java index 9a08170..54516a5 100644 --- a/src/main/java/org/terning/terningserver/service/ScrapServiceImpl.java +++ b/src/main/java/org/terning/terningserver/service/ScrapServiceImpl.java @@ -14,6 +14,7 @@ import org.terning.terningserver.dto.calendar.response.MonthlyListResponseDto; import org.terning.terningserver.dto.user.response.UpcomingScrapResponseDto; import org.terning.terningserver.exception.CustomException; +import org.terning.terningserver.exception.enums.ErrorMessage; import org.terning.terningserver.repository.internship_announcement.InternshipRepository; import org.terning.terningserver.repository.scrap.ScrapRepository; import org.terning.terningserver.repository.user.UserRepository; @@ -135,17 +136,17 @@ public void createScrap(Long internshipAnnouncementId, CreateScrapRequestDto req @Override @Transactional - public void deleteScrap(Long scrapId, Long userId) { - Scrap scrap = findScrap(scrapId); + public void deleteScrap(Long internshipAnnouncementId, Long userId) { + Scrap scrap = findScrap(internshipAnnouncementId, userId); scrap.getInternshipAnnouncement().updateScrapCount(-1); verifyScrapOwner(scrap, userId); - scrapRepository.deleteById(scrapId); + scrapRepository.deleteByInternshipAnnouncementIdAndUserId(internshipAnnouncementId, userId); } @Override @Transactional - public void updateScrapColor(Long scrapId, UpdateScrapRequestDto request, Long userId) { - Scrap scrap = findScrap(scrapId); + public void updateScrapColor(Long internshipAnnouncementId, UpdateScrapRequestDto request, Long userId) { + Scrap scrap = findScrap(internshipAnnouncementId, userId); verifyScrapOwner(scrap, userId); scrap.updateColor(findColor(request.color())); } @@ -157,9 +158,9 @@ private void verifyScrapOwner(Scrap scrap, Long userId) { } } - private Color findColor(int color) { + private Color findColor(String color) { return Arrays.stream(Color.values()) - .filter(c-> c.getKey() == color) + .filter(c-> c.getName().equals(color)) .findAny().get(); } @@ -173,8 +174,8 @@ private User findUser(Long userId) { .orElseThrow(() -> new CustomException(NOT_FOUND_USER_EXCEPTION)); } - private Scrap findScrap(Long scrapId) { - return scrapRepository.findById(scrapId) + private Scrap findScrap(Long internshipAnnouncementId, Long userId) { + return scrapRepository.findByInternshipAnnouncementIdAndUserId(internshipAnnouncementId, userId) .orElseThrow(() -> new CustomException(NOT_FOUND_SCRAP)); } } diff --git a/src/main/java/org/terning/terningserver/service/UserService.java b/src/main/java/org/terning/terningserver/service/UserService.java index a894366..283744b 100644 --- a/src/main/java/org/terning/terningserver/service/UserService.java +++ b/src/main/java/org/terning/terningserver/service/UserService.java @@ -1,9 +1,12 @@ package org.terning.terningserver.service; import org.terning.terningserver.domain.User; +import org.terning.terningserver.dto.user.request.ProfileUpdateRequestDto; import org.terning.terningserver.dto.user.response.ProfileResponseDto; public interface UserService { void deleteUser(User user); ProfileResponseDto getProfile(Long userId); + + void updateProfile(Long userId, ProfileUpdateRequestDto request); } diff --git a/src/main/java/org/terning/terningserver/service/UserServiceImpl.java b/src/main/java/org/terning/terningserver/service/UserServiceImpl.java index 8e9a84e..a9b4980 100644 --- a/src/main/java/org/terning/terningserver/service/UserServiceImpl.java +++ b/src/main/java/org/terning/terningserver/service/UserServiceImpl.java @@ -4,6 +4,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.terning.terningserver.domain.User; +import org.terning.terningserver.domain.enums.ProfileImage; +import org.terning.terningserver.dto.user.request.ProfileUpdateRequestDto; import org.terning.terningserver.exception.CustomException; import org.terning.terningserver.exception.enums.ErrorMessage; import org.terning.terningserver.repository.user.UserRepository; @@ -32,6 +34,27 @@ public ProfileResponseDto getProfile(Long userId){ User user = userRepository.findById(userId).orElseThrow( () -> new CustomException(ErrorMessage.NOT_FOUND_USER_EXCEPTION) ); + return ProfileResponseDto.of(user); } + + @Override + @Transactional + public void updateProfile(Long userId, ProfileUpdateRequestDto request){ + User user = userRepository.findById(userId) + .orElseThrow(() -> new CustomException(ErrorMessage.NOT_FOUND_USER_EXCEPTION)); + + try{ + // 프로필 이미지가 유효하지 않으면 IllegalArgumentException을 던짐 + ProfileImage profileImage = ProfileImage.fromValue(request.profileImage()); + + //프로필 업데이트 + user.updateProfile(request.name(), ProfileImage.fromValue(request.profileImage())); + + userRepository.save(user); + } catch (IllegalArgumentException e){ + // 잘못된 프로필 이미지 값이 오면 CustomException 발생 + throw new CustomException(ErrorMessage.INVALID_PROFILE_IMAGE); + } + } }