From dd6a9551169d15ca1f35d1c099e2e77302a0fb3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=AF=E1=86=AB=E1=84=8C=E1=85=A1=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=AE=E1=86=AB?= Date: Sun, 1 Sep 2024 14:04:46 +0900 Subject: [PATCH 01/16] =?UTF-8?q?[=E2=99=BB=EF=B8=8F=20refactor/#114]:=20s?= =?UTF-8?q?ignIn=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - signIn 메서드 내 여러 책임을 분리하여 가독성과 재사용성을 향상시켰습니다. - 기존의 조건문을 Optional과 람다 표현식을 활용하여 간결하게 개선했습니다. --- .../service/AuthServiceImpl.java | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java b/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java index 5dc96c3..71b79aa 100644 --- a/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java +++ b/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java @@ -47,22 +47,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 +101,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); From 449eff06be5d8e5e52e18ea1fa71043683b96dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=9C=A4?= <63058347+JungYoonShin@users.noreply.github.com> Date: Tue, 3 Sep 2024 01:27:53 +0900 Subject: [PATCH 02/16] =?UTF-8?q?[=E2=99=BB=EF=B8=8Frefactor/#96]:=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=9E=A9=20color=20enum=20=EB=B0=8F=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terningserver/domain/enums/Color.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) 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() { From 881ffef705418d1025f0acfa7fc640e0817e011f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=AF=E1=86=AB=E1=84=8C=E1=85=A1=E1=86=BC?= =?UTF-8?q?=E1=84=89=E1=85=AE=E1=86=AB?= Date: Tue, 3 Sep 2024 13:58:28 +0900 Subject: [PATCH 03/16] =?UTF-8?q?[=E2=99=BB=EF=B8=8F=20refactor/#120]:=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20Tok?= =?UTF-8?q?enGetRequestDto=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/auth/request/TokenGetRequestDto.java | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 src/main/java/org/terning/terningserver/dto/auth/request/TokenGetRequestDto.java 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(); - } -} From 1841afeff04a765af99ccc183370f3023adb91c6 Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:28:12 +0900 Subject: [PATCH 04/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EA=B0=80=20null?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20=EA=B8=B0=EB=B3=B8=EA=B0=92=20?= =?UTF-8?q?"basic"=EC=9C=BC=EB=A1=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/terning/terningserver/service/AuthServiceImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java b/src/main/java/org/terning/terningserver/service/AuthServiceImpl.java index 71b79aa..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; @@ -149,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); } From 5462a55a3a198709e3af9c75358f2411749ab691 Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:28:28 +0900 Subject: [PATCH 05/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/terning/terningserver/dto/user/request/Empty.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/org/terning/terningserver/dto/user/request/Empty.txt 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 From 2b60bf0d56645a50492759cf7329836c1a5c33b2 Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:28:54 +0900 Subject: [PATCH 06/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terningserver/exception/enums/ErrorMessage.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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..a62914f 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,8 +32,11 @@ 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, "해당 유저가 존재하지 않습니다"), From bd2e82ac79d8fbd145f8d54c9ac540ddb131b2c7 Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:29:27 +0900 Subject: [PATCH 07/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=AC=EB=95=8C,=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=EB=8F=84=20=EA=B0=99=EC=9D=B4=20=EB=B6=88?= =?UTF-8?q?=EB=9F=AC=EC=98=A4=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terningserver/dto/user/response/ProfileResponseDto.java | 2 ++ 1 file changed, 2 insertions(+) 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(); } From 741ee0139848dbc91f5a9c6dd40d89b827cd00b7 Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:30:13 +0900 Subject: [PATCH 08/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EB=A5=BC=20int=20>=20St?= =?UTF-8?q?ring=20=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terningserver/dto/auth/request/SignUpRequestDto.java | 4 ++-- .../dto/auth/request/SignUpWithAuthIdRequestDto.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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) From 1a1acf72d55069b4c7ea7b7e63d1ed5fce7a7720 Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:30:40 +0900 Subject: [PATCH 09/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=88=98=EC=A0=95=20=EC=84=B1=EA=B3=B5=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/terningserver/exception/enums/SuccessMessage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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; From b369a44209e1efd571c6ea669d153d2c0b877571 Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:31:16 +0900 Subject: [PATCH 10/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EB=A5=BC=20int=20>=20St?= =?UTF-8?q?ring=20=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20&=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/terning/terningserver/domain/User.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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; + } } From b90e6a8230190db4cdf0e9f45b85cb1f9f3a697d Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:31:55 +0900 Subject: [PATCH 11/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserProfileController.java | 17 +++++++++---- .../controller/swagger/UserSwagger.java | 10 +++++++- .../terningserver/service/UserService.java | 3 +++ .../service/UserServiceImpl.java | 24 +++++++++++++++++++ 4 files changed, 49 insertions(+), 5 deletions(-) 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/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..659abbe 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,28 @@ 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); + } + } } From 0a8790f1c9fcc6d8b892c3c3857b0a0b0b12ef40 Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:32:32 +0900 Subject: [PATCH 12/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EB=A5=BC=20ENUM=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/enums/ProfileImage.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/org/terning/terningserver/domain/enums/ProfileImage.java 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..495c239 --- /dev/null +++ b/src/main/java/org/terning/terningserver/domain/enums/ProfileImage.java @@ -0,0 +1,28 @@ +package org.terning.terningserver.domain.enums; + +public enum ProfileImage { + BASIC("basic"), + LUCKY("lucky"), + SMART("smart"), + GLASS("glass"), + CALENDAR("calendar"); + + private final String value; + + ProfileImage(String value){ + this.value = value; + } + + public String getValue(){ + return 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); + } +} From 658d44ce0669bfb47e29efe514bacfc3031b7f6e Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 00:32:42 +0900 Subject: [PATCH 13/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/request/ProfileUpdateRequestDto.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/org/terning/terningserver/dto/user/request/ProfileUpdateRequestDto.java 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(); + } +} From 0ae2c9f7d9c4717b0003f2c112235ffd93cf8d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=9C=A4?= <63058347+JungYoonShin@users.noreply.github.com> Date: Thu, 5 Sep 2024 01:43:38 +0900 Subject: [PATCH 14/16] =?UTF-8?q?[=E2=99=BB=EF=B8=8Frefactor/#96]:=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=9E=A9=20=EC=83=89=EC=83=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20api=20=EB=A6=AC=ED=8C=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ScrapController.java | 12 ++++++------ .../scrap/request/CreateScrapRequestDto.java | 2 +- .../scrap/request/UpdateScrapRequestDto.java | 2 +- .../exception/enums/ErrorMessage.java | 2 +- .../repository/scrap/ScrapRepository.java | 2 ++ .../service/ScrapServiceImpl.java | 19 ++++++++++--------- 6 files changed, 21 insertions(+), 18 deletions(-) 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/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/exception/enums/ErrorMessage.java b/src/main/java/org/terning/terningserver/exception/enums/ErrorMessage.java index 8d43209..6234ade 100644 --- a/src/main/java/org/terning/terningserver/exception/enums/ErrorMessage.java +++ b/src/main/java/org/terning/terningserver/exception/enums/ErrorMessage.java @@ -37,7 +37,7 @@ public enum ErrorMessage { 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/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/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)); } } From cb4967b546ab320c9a96d63debb59130e9b4332a Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 10:22:00 +0900 Subject: [PATCH 15/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20Getter=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terningserver/domain/enums/ProfileImage.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/terning/terningserver/domain/enums/ProfileImage.java b/src/main/java/org/terning/terningserver/domain/enums/ProfileImage.java index 495c239..86acb47 100644 --- a/src/main/java/org/terning/terningserver/domain/enums/ProfileImage.java +++ b/src/main/java/org/terning/terningserver/domain/enums/ProfileImage.java @@ -1,5 +1,10 @@ package org.terning.terningserver.domain.enums; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter public enum ProfileImage { BASIC("basic"), LUCKY("lucky"), @@ -9,14 +14,6 @@ public enum ProfileImage { private final String value; - ProfileImage(String value){ - this.value = value; - } - - public String getValue(){ - return value; - } - public static ProfileImage fromValue(String value){ for(ProfileImage image : values()){ if(image.value.equalsIgnoreCase(value)){ From 401f25810d1bbc3a755bc8f9382e479956827c2e Mon Sep 17 00:00:00 2001 From: Willy Date: Thu, 5 Sep 2024 10:22:14 +0900 Subject: [PATCH 16/16] =?UTF-8?q?[=E2=9C=A8feat/#123]=20=EA=B0=9C=ED=96=89?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/terning/terningserver/service/UserServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/terning/terningserver/service/UserServiceImpl.java b/src/main/java/org/terning/terningserver/service/UserServiceImpl.java index 659abbe..a9b4980 100644 --- a/src/main/java/org/terning/terningserver/service/UserServiceImpl.java +++ b/src/main/java/org/terning/terningserver/service/UserServiceImpl.java @@ -42,8 +42,7 @@ public ProfileResponseDto getProfile(Long userId){ @Transactional public void updateProfile(Long userId, ProfileUpdateRequestDto request){ User user = userRepository.findById(userId) - .orElseThrow( - () -> new CustomException(ErrorMessage.NOT_FOUND_USER_EXCEPTION)); + .orElseThrow(() -> new CustomException(ErrorMessage.NOT_FOUND_USER_EXCEPTION)); try{ // 프로필 이미지가 유효하지 않으면 IllegalArgumentException을 던짐