diff --git a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java index 4ff0299..c170e12 100644 --- a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java +++ b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java @@ -16,6 +16,10 @@ public enum BaseResponseMessage { 유저_이름_변경이_완료되었습니다("유저 이름 변경이 완료되었습니다"), 존재하지_않는_유저입니다("존재하지 않는 유저입니다"), 유저_이름의_길이는_1부터_5까지만_가능합니다("유저 이름의 길이는 1부터 5까지만 가능합니다"), + ROLE_필드는_필수입력입니다("ROLE 필드는 필수입력입니다"), + 이메일_형식이_올바르지_못합니다("이메일 형식이 올바르지 못합니다"), + 유저가_성공적으로_인증되었습니다("유저가 성공적으로 인증되었습니다"), + GUEST_유저_토큰이_정상적으로_생성되었습니다("GUEST 유저 토큰이 정상적으로 생성되었습니다"), //jwt error message JWT_토큰_오류입니다("JWT 토큰 오류입니다"), diff --git a/src/main/java/com/neighbors/tohero/application/letter/dto/CreateLetterRequest.java b/src/main/java/com/neighbors/tohero/application/letter/dto/CreateLetterRequest.java new file mode 100644 index 0000000..a4645ef --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/letter/dto/CreateLetterRequest.java @@ -0,0 +1,6 @@ +package com.neighbors.tohero.application.letter.dto; + +public record CreateLetterRequest ( + +){ +} diff --git a/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java b/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java new file mode 100644 index 0000000..41685dd --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java @@ -0,0 +1,15 @@ +package com.neighbors.tohero.application.letter.service; + +import com.neighbors.tohero.application.baseResponse.BaseResponse; +import com.neighbors.tohero.application.letter.dto.CreateLetterRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class LetterService { + + public BaseResponse createLetter(CreateLetterRequest createLetterRequest) { + return null; + } +} diff --git a/src/main/java/com/neighbors/tohero/application/login/dto/OAuthLoginResponse.java b/src/main/java/com/neighbors/tohero/application/login/dto/OAuthLoginResponse.java index 01326bd..eefb649 100644 --- a/src/main/java/com/neighbors/tohero/application/login/dto/OAuthLoginResponse.java +++ b/src/main/java/com/neighbors/tohero/application/login/dto/OAuthLoginResponse.java @@ -1,26 +1,38 @@ package com.neighbors.tohero.application.login.dto; import com.fasterxml.jackson.annotation.JsonInclude; +import com.neighbors.tohero.common.enums.Role; import com.neighbors.tohero.common.jwt.AuthTokens; +import com.neighbors.tohero.domain.domain.user.model.User; import lombok.Builder; import lombok.Data; -@Builder -@Data -public class OAuthLoginResponse { - private boolean isMember; +public record OAuthLoginResponse ( + boolean isMember, - @JsonInclude(JsonInclude.Include.NON_NULL) - private AuthTokens authTokens; + @JsonInclude(JsonInclude.Include.NON_NULL) + UserInfo userInfo, - @JsonInclude(JsonInclude.Include.NON_NULL) - private String email; + @JsonInclude(JsonInclude.Include.NON_NULL) + AuthTokens authTokens, - public static OAuthLoginResponse createSuccessObjFrom(AuthTokens authTokens, String email) { - return OAuthLoginResponse.builder() - .authTokens(authTokens) - .email(email) - .isMember(true) - .build(); + @JsonInclude(JsonInclude.Include.NON_NULL) + String email +){ + public record UserInfo( + long userId, + String nickname, + String email, + Role role + ){ + } + + public static OAuthLoginResponse createNonUserResponse(String email){ + return new OAuthLoginResponse(false, null, null, email); + } + + public static OAuthLoginResponse createExistUserResponse(User user, AuthTokens authTokens){ + UserInfo userInfo = new UserInfo(user.getUserId(), user.getUserName(), user.getEmail(), user.getRole()); + return new OAuthLoginResponse(true, userInfo, authTokens,null); } } diff --git a/src/main/java/com/neighbors/tohero/application/login/service/OAuthService.java b/src/main/java/com/neighbors/tohero/application/login/service/OAuthService.java index e89231f..9cf726c 100644 --- a/src/main/java/com/neighbors/tohero/application/login/service/OAuthService.java +++ b/src/main/java/com/neighbors/tohero/application/login/service/OAuthService.java @@ -5,25 +5,28 @@ import com.neighbors.tohero.application.baseResponse.BaseResponse; import com.neighbors.tohero.application.baseResponse.BaseResponseMessage; import com.neighbors.tohero.application.baseResponse.BaseResponseStatus; -import com.neighbors.tohero.common.enums.Role; +import com.neighbors.tohero.common.exception.user.UserException; import com.neighbors.tohero.common.jwt.AuthTokens; import com.neighbors.tohero.common.jwt.JwtProvider; import com.neighbors.tohero.common.jwt.JwtUserDetails; -import com.neighbors.tohero.domain.domain.login.model.User; -import com.neighbors.tohero.domain.domain.login.service.CreateUser; +import com.neighbors.tohero.domain.domain.user.model.User; +import com.neighbors.tohero.domain.domain.user.service.CreateUser; import com.neighbors.tohero.domain.domain.login.service.oauth.kakao.RequestKakaoInfo; +import com.neighbors.tohero.domain.domain.user.service.GetUser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.util.Optional; + @Slf4j @Service @RequiredArgsConstructor public class OAuthService { private final RequestKakaoInfo requestUserInfo; - private final CreateUser createUser; + private final GetUser getUser; private final JwtProvider jwtProvider; @Value("${oauth.kakao.redirect-uri}") @@ -35,28 +38,37 @@ public class OAuthService { public BaseResponse oAuthKaKaoLoin(String code){ KakaoInfoResponse kakaoInfoResponse = requestUserInfo.requestKakaoInfo(code, redirect_uri); - return afterAuthorizedOauth(kakaoInfoResponse); + return makeOauthResponseDependingOnExist(kakaoInfoResponse); } public BaseResponse oAuthKaKaoLoinLocal(String code){ KakaoInfoResponse kakaoInfoResponse = requestUserInfo.requestKakaoInfo(code, redirect_uri_client); - return afterAuthorizedOauth(kakaoInfoResponse); + return makeOauthResponseDependingOnExist(kakaoInfoResponse); } - private BaseResponse afterAuthorizedOauth(KakaoInfoResponse kakaoInfoResponse){ - User user = User.builder() - .userName(kakaoInfoResponse.getNickname()) - .email(kakaoInfoResponse.getEmail()) - .role(Role.USER) - .build(); - - User createdUser = createUser.createUser(user); - AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.from(createdUser)); + private BaseResponse makeOauthResponseDependingOnExist(KakaoInfoResponse kakaoInfoResponse){ + User matchedUser = null; + AuthTokens authTokens = null; + try{ + matchedUser = getUser.getUserByEmail(kakaoInfoResponse.getEmail()); + authTokens = jwtProvider.createToken(JwtUserDetails.from(matchedUser)); + }catch(UserException e){ + log.error(e.getMessage()); + return returnNonUserResponse(kakaoInfoResponse.getEmail()); + } return new BaseResponse<>( BaseResponseStatus.OK, BaseResponseMessage.로그인_성공했습니다.getMessage(), - OAuthLoginResponse.createSuccessObjFrom(authTokens, kakaoInfoResponse.getEmail()) + OAuthLoginResponse.createExistUserResponse(matchedUser,authTokens) + ); + } + + private BaseResponse returnNonUserResponse(String email){ + return new BaseResponse<>( + BaseResponseStatus.OK, + BaseResponseMessage.존재하지_않는_유저입니다.getMessage(), + OAuthLoginResponse.createNonUserResponse(email) ); } } diff --git a/src/main/java/com/neighbors/tohero/application/user/dto/AuthenticateUserRequest.java b/src/main/java/com/neighbors/tohero/application/user/dto/AuthenticateUserRequest.java new file mode 100644 index 0000000..0745aa9 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/user/dto/AuthenticateUserRequest.java @@ -0,0 +1,22 @@ +package com.neighbors.tohero.application.user.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.neighbors.tohero.common.enums.Role; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import org.hibernate.validator.constraints.Length; + +public record AuthenticateUserRequest ( + @NotNull + Role role, + + @NotBlank + @Length(min = 1, max = 5) + String nickname, + + @JsonInclude(JsonInclude.Include.NON_NULL) + @Email + String email +){ +} diff --git a/src/main/java/com/neighbors/tohero/application/user/dto/AuthenticateUserResponse.java b/src/main/java/com/neighbors/tohero/application/user/dto/AuthenticateUserResponse.java new file mode 100644 index 0000000..503efb3 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/user/dto/AuthenticateUserResponse.java @@ -0,0 +1,30 @@ +package com.neighbors.tohero.application.user.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.neighbors.tohero.common.enums.Role; +import com.neighbors.tohero.common.jwt.AuthTokens; +import com.neighbors.tohero.domain.domain.user.model.User; + +public record AuthenticateUserResponse( + AuthTokens authTokens, + + @JsonInclude(JsonInclude.Include.NON_NULL) + UserInfo userInfo +) { + public record UserInfo( + long userId, + String nickname, + String email, + Role role + ){ + } + + public static AuthenticateUserResponse toUserDTO(AuthTokens authTokens, User user) { + UserInfo userInfo = new UserInfo(user.getUserId(), user.getUserName(), user.getEmail(), user.getRole()); + return new AuthenticateUserResponse(authTokens, userInfo); + } + + public static AuthenticateUserResponse toGuestDTO(AuthTokens authTokens) { + return new AuthenticateUserResponse(authTokens, null); + } +} diff --git a/src/main/java/com/neighbors/tohero/application/user/service/UserService.java b/src/main/java/com/neighbors/tohero/application/user/service/UserService.java index 640796b..5cf626e 100644 --- a/src/main/java/com/neighbors/tohero/application/user/service/UserService.java +++ b/src/main/java/com/neighbors/tohero/application/user/service/UserService.java @@ -3,6 +3,14 @@ import com.neighbors.tohero.application.baseResponse.BaseResponse; import com.neighbors.tohero.application.baseResponse.BaseResponseMessage; import com.neighbors.tohero.application.baseResponse.BaseResponseStatus; +import com.neighbors.tohero.application.user.dto.AuthenticateUserRequest; +import com.neighbors.tohero.application.user.dto.AuthenticateUserResponse; +import com.neighbors.tohero.common.enums.Role; +import com.neighbors.tohero.common.jwt.AuthTokens; +import com.neighbors.tohero.common.jwt.JwtProvider; +import com.neighbors.tohero.common.jwt.JwtUserDetails; +import com.neighbors.tohero.domain.domain.user.model.User; +import com.neighbors.tohero.domain.domain.user.service.CreateUser; import com.neighbors.tohero.domain.domain.user.service.UpdateUser; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,14 +20,42 @@ public class UserService { private final UpdateUser updateUser; + private final CreateUser createUser; + private final JwtProvider jwtProvider; public BaseResponse updateUserName(long userId, String nickname){ updateUser.updateUserName(userId, nickname); - return new BaseResponse( BaseResponseStatus.OK, BaseResponseMessage.유저_이름_변경이_완료되었습니다.getMessage() ); } + + public BaseResponse authenticateUser(AuthenticateUserRequest authenticateUserRequest){ + if(authenticateUserRequest.role() == Role.USER){ + return returnLoginedUserToken(authenticateUserRequest); + } + return returnGuestUserToken(authenticateUserRequest); + } + + private BaseResponse returnLoginedUserToken(AuthenticateUserRequest authenticateUserRequest) { + User createdUser = createUser.createUser(User.toEntity(authenticateUserRequest)); + AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.from(createdUser)); + + return new BaseResponse( + BaseResponseStatus.OK, + BaseResponseMessage.유저가_성공적으로_인증되었습니다.getMessage(), + AuthenticateUserResponse.toUserDTO(authTokens, createdUser) + ); + } + + private BaseResponse returnGuestUserToken(AuthenticateUserRequest authenticateUserRequest) { + AuthTokens authTokens = jwtProvider.createToken(JwtUserDetails.makeGuestJwtDetails(authenticateUserRequest.nickname())); + return new BaseResponse( + BaseResponseStatus.OK, + BaseResponseMessage.GUEST_유저_토큰이_정상적으로_생성되었습니다.getMessage(), + AuthenticateUserResponse.toGuestDTO(authTokens) + ); + } } diff --git a/src/main/java/com/neighbors/tohero/common/config/SecurityConfig.java b/src/main/java/com/neighbors/tohero/common/config/SecurityConfig.java index 2a354a6..087e52b 100644 --- a/src/main/java/com/neighbors/tohero/common/config/SecurityConfig.java +++ b/src/main/java/com/neighbors/tohero/common/config/SecurityConfig.java @@ -41,6 +41,7 @@ public WebSecurityCustomizer webSecurityCustomizer() { "/v3/api-docs/**", "/oauth/kakao/callback", "/oauth/kakao/callback2", + "/user/auth", "/auth/refreshToken", "/address", "/notice/**", diff --git a/src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java b/src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java index f05638d..2cdf9a5 100644 --- a/src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java +++ b/src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java @@ -29,14 +29,15 @@ public class JwtProvider { private long REFRESH_TOKEN_EXPIRED_IN; public AuthTokens createToken(JwtUserDetails jwtUserDetails) { - log.info("JWT key={}", JWT_SECRET_KEY); - Claims claims = Jwts.claims() - .setSubject(jwtUserDetails.getEmail()) - .setIssuer("zipkok"); + .setSubject(jwtUserDetails.getNickname()) + .setIssuer("ToHero"); claims.put("role", jwtUserDetails.getRole()); - claims.put("id", jwtUserDetails.getUserId()); + if(jwtUserDetails.getRole() == Role.USER) { + claims.put("userId", jwtUserDetails.getUserId()); + claims.put("email", jwtUserDetails.getEmail()); + } Date now = new Date(); Date accessTokenExpiredAt = new Date(now.getTime() + JWT_EXPIRED_IN); @@ -118,9 +119,10 @@ public JwtUserDetails getJwtUserDetails(String token) { Claims claims = getBody(token); return JwtUserDetails.builder() - .email(String.valueOf(claims.getSubject())) - .userId(Long.valueOf(claims.get("id").toString())) + .nickname(String.valueOf(claims.getSubject())) .role(Role.valueOf(claims.get("role").toString())) + .email(claims.get("email").toString()) + .userId(Long.parseLong(claims.get("userId").toString())) .build(); } diff --git a/src/main/java/com/neighbors/tohero/common/jwt/JwtUserDetails.java b/src/main/java/com/neighbors/tohero/common/jwt/JwtUserDetails.java index 113fca5..1d0407a 100644 --- a/src/main/java/com/neighbors/tohero/common/jwt/JwtUserDetails.java +++ b/src/main/java/com/neighbors/tohero/common/jwt/JwtUserDetails.java @@ -1,7 +1,7 @@ package com.neighbors.tohero.common.jwt; import com.neighbors.tohero.common.enums.Role; -import com.neighbors.tohero.domain.domain.login.model.User; +import com.neighbors.tohero.domain.domain.user.model.User; import lombok.Builder; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -11,20 +11,23 @@ @Builder public class JwtUserDetails { private final String email; - private final Long userId; + private final String nickname; private final Role role; + private final long userId; public static JwtUserDetails from(User user) { return JwtUserDetails.builder() .email(user.getEmail()) - .userId(user.getUserId()) + .nickname(user.getUserName()) .role(user.getRole()) + .userId(user.getUserId()) .build(); } - public static JwtUserDetails makeGuestJwtDetails() { + public static JwtUserDetails makeGuestJwtDetails(String nickname) { return JwtUserDetails.builder() .role(Role.GUEST) + .nickname(nickname) .build(); } } diff --git a/src/main/java/com/neighbors/tohero/common/security/AuthenticationUtil.java b/src/main/java/com/neighbors/tohero/common/security/AuthenticationUtil.java index d140b41..cfe32db 100644 --- a/src/main/java/com/neighbors/tohero/common/security/AuthenticationUtil.java +++ b/src/main/java/com/neighbors/tohero/common/security/AuthenticationUtil.java @@ -45,7 +45,7 @@ private Optional makeAuthentication(HttpServletRequest reque authentication = UserAuthentication.from(jwtProvider.getJwtUserDetails(token)); } else if (isRequestAvailableToGuest(request)) { log.info("[AuthenticationUtil.makeAuthentication : Guest 권한 부여]"); - authentication = UserAuthentication.makeGuestAuthentication(); +// authentication = UserAuthentication.makeGuestAuthentication(); } if(authentication != null) { diff --git a/src/main/java/com/neighbors/tohero/common/security/UserAuthentication.java b/src/main/java/com/neighbors/tohero/common/security/UserAuthentication.java index 4b7ff05..078aec8 100644 --- a/src/main/java/com/neighbors/tohero/common/security/UserAuthentication.java +++ b/src/main/java/com/neighbors/tohero/common/security/UserAuthentication.java @@ -17,8 +17,8 @@ public static UserAuthentication from(JwtUserDetails jwtUserDetails) { return new UserAuthentication(jwtUserDetails, null, jwtUserDetails.getRole().getAuthority()); } - public static UserAuthentication makeGuestAuthentication() { - return new UserAuthentication(JwtUserDetails.makeGuestJwtDetails(), null, Role.GUEST.getAuthority()); - } +// public static UserAuthentication makeGuestAuthentication() { +// return new UserAuthentication(JwtUserDetails.makeGuestJwtDetails(), null, Role.GUEST.getAuthority()); +// } } diff --git a/src/main/java/com/neighbors/tohero/domain/domain/login/model/User.java b/src/main/java/com/neighbors/tohero/domain/domain/login/model/User.java deleted file mode 100644 index 065d777..0000000 --- a/src/main/java/com/neighbors/tohero/domain/domain/login/model/User.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.neighbors.tohero.domain.domain.login.model; - -import com.neighbors.tohero.common.enums.Role; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -@AllArgsConstructor -public class User { - private Long userId; - private String userName; - private String email; - private Role role; - - public static User of (Long userId, String userName, String email, Role role) { - return new User(userId, userName, email, role); - } -} diff --git a/src/main/java/com/neighbors/tohero/domain/domain/user/model/User.java b/src/main/java/com/neighbors/tohero/domain/domain/user/model/User.java new file mode 100644 index 0000000..e827cae --- /dev/null +++ b/src/main/java/com/neighbors/tohero/domain/domain/user/model/User.java @@ -0,0 +1,29 @@ +package com.neighbors.tohero.domain.domain.user.model; + +import com.neighbors.tohero.application.user.dto.AuthenticateUserRequest; +import com.neighbors.tohero.common.enums.Role; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +@AllArgsConstructor +public class User { + private Long userId; + private String userName; + private String email; + private Role role; + + public static User of (Long userId, String userName, String email, Role role) { + return new User(userId, userName, email, role); + } + + public static User toEntity(AuthenticateUserRequest authenticateUserRequest) { + return User.builder() + .userName(authenticateUserRequest.nickname()) + .email(authenticateUserRequest.email()) + .role(authenticateUserRequest.role()) + .build(); + } +} diff --git a/src/main/java/com/neighbors/tohero/domain/domain/login/service/CreateUser.java b/src/main/java/com/neighbors/tohero/domain/domain/user/service/CreateUser.java similarity index 75% rename from src/main/java/com/neighbors/tohero/domain/domain/login/service/CreateUser.java rename to src/main/java/com/neighbors/tohero/domain/domain/user/service/CreateUser.java index 1988421..48102cd 100644 --- a/src/main/java/com/neighbors/tohero/domain/domain/login/service/CreateUser.java +++ b/src/main/java/com/neighbors/tohero/domain/domain/user/service/CreateUser.java @@ -1,7 +1,7 @@ -package com.neighbors.tohero.domain.domain.login.service; +package com.neighbors.tohero.domain.domain.user.service; import com.neighbors.tohero.common.annotaion.DomainService; -import com.neighbors.tohero.domain.domain.login.model.User; +import com.neighbors.tohero.domain.domain.user.model.User; import com.neighbors.tohero.domain.query.UserRepository; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/neighbors/tohero/domain/domain/user/service/GetUser.java b/src/main/java/com/neighbors/tohero/domain/domain/user/service/GetUser.java new file mode 100644 index 0000000..67fe3b7 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/domain/domain/user/service/GetUser.java @@ -0,0 +1,16 @@ +package com.neighbors.tohero.domain.domain.user.service; + +import com.neighbors.tohero.common.annotaion.DomainService; +import com.neighbors.tohero.domain.domain.user.model.User; +import com.neighbors.tohero.domain.query.UserRepository; +import lombok.RequiredArgsConstructor; + +@DomainService +@RequiredArgsConstructor +public class GetUser { + private final UserRepository userRepository; + + public User getUserByEmail(String email) { + return userRepository.getUserByEmail(email); + } +} diff --git a/src/main/java/com/neighbors/tohero/domain/domain/user/service/UpdateUser.java b/src/main/java/com/neighbors/tohero/domain/domain/user/service/UpdateUser.java index e18f060..b35a4d3 100644 --- a/src/main/java/com/neighbors/tohero/domain/domain/user/service/UpdateUser.java +++ b/src/main/java/com/neighbors/tohero/domain/domain/user/service/UpdateUser.java @@ -1,6 +1,7 @@ package com.neighbors.tohero.domain.domain.user.service; import com.neighbors.tohero.common.annotaion.DomainService; +import com.neighbors.tohero.domain.domain.user.model.User; import com.neighbors.tohero.domain.query.UserRepository; import lombok.RequiredArgsConstructor; @@ -10,7 +11,11 @@ public class UpdateUser { private final UserRepository userRepository; - public void updateUserName(long userId, String nickname) { - userRepository.updateUserName(userId, nickname); + public User updateUserName(long userId, String nickname) { + return userRepository.updateUserName(repo -> repo.findByUserId(userId), nickname); + } + + public User updateUserName(String email, String nickname){ + return userRepository.updateUserName(repo -> repo.findByEmail(email), nickname); } } diff --git a/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java b/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java index f436388..c1e34cf 100644 --- a/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java +++ b/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java @@ -1,8 +1,14 @@ package com.neighbors.tohero.domain.query; -import com.neighbors.tohero.domain.domain.login.model.User; +import com.neighbors.tohero.domain.domain.user.model.User; +import com.neighbors.tohero.infrastructure.entity.UserEntity; +import com.neighbors.tohero.infrastructure.repository.UserEntityRepository; + +import java.util.Optional; +import java.util.function.Function; public interface UserRepository { User createUser(User user); - void updateUserName(long userId, String nickname); + User updateUserName(Function> findUserFunction, String nickname); + User getUserByEmail(String email); } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java b/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java index aca5b10..74718ea 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java @@ -1,6 +1,6 @@ package com.neighbors.tohero.infrastructure.mapper; -import com.neighbors.tohero.domain.domain.login.model.User; +import com.neighbors.tohero.domain.domain.user.model.User; import com.neighbors.tohero.infrastructure.entity.UserEntity; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java index 6e238d2..51627d4 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java @@ -3,7 +3,7 @@ import com.neighbors.tohero.application.baseResponse.BaseResponseMessage; import com.neighbors.tohero.application.baseResponse.BaseResponseStatus; import com.neighbors.tohero.common.exception.user.UserException; -import com.neighbors.tohero.domain.domain.login.model.User; +import com.neighbors.tohero.domain.domain.user.model.User; import com.neighbors.tohero.domain.query.UserRepository; import com.neighbors.tohero.infrastructure.entity.UserEntity; import com.neighbors.tohero.infrastructure.mapper.UserMapper; @@ -11,6 +11,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.util.Optional; +import java.util.function.Function; + @Repository @RequiredArgsConstructor public class UserRepositoryImpl implements UserRepository { @@ -20,25 +23,42 @@ public class UserRepositoryImpl implements UserRepository { @Override public User createUser(User user) { - UserEntity existedUserEntity = userEntityRepository.findByEmail(user.getEmail()); - if (existedUserEntity != null) { - return userMapper.toDomain(existedUserEntity); + try{ + return getUserByEmail(user.getEmail()); + }catch(UserException e){ + UserEntity userEntity = userMapper.toEntity(user); + userEntityRepository.save(userEntity); + + UserEntity createdUserEntity = userEntityRepository.findByEmail(user.getEmail()) + .orElseThrow(() -> new UserException( + BaseResponseStatus.NO_RESULT, + BaseResponseMessage.존재하지_않는_유저입니다.getMessage() + ));; + return userMapper.toDomain(createdUserEntity); } - UserEntity userEntity = userMapper.toEntity(user); - userEntityRepository.save(userEntity); - UserEntity createdUserEntity = userEntityRepository.findByEmail(user.getEmail()); - return userMapper.toDomain(createdUserEntity); } @Override - public void updateUserName(long userId, String nickname) { - UserEntity matchedUserEntity = userEntityRepository.findByUserId(userId) + public User updateUserName(Function> findUserFunction, String nickname) { + UserEntity matchedUserEntity = findUserFunction.apply(userEntityRepository) .orElseThrow(() -> new UserException( BaseResponseStatus.BAD_REQUEST, BaseResponseMessage.존재하지_않는_유저입니다.getMessage() )); matchedUserEntity.changeNickname(nickname); - userEntityRepository.save(matchedUserEntity); + UserEntity userEntity = userEntityRepository.save(matchedUserEntity); + return userMapper.toDomain(userEntity); + } + + @Override + public User getUserByEmail(String email) { + UserEntity userEntity = userEntityRepository.findByEmail(email) + .orElseThrow(() -> new UserException( + BaseResponseStatus.NO_RESULT, + BaseResponseMessage.존재하지_않는_유저입니다.getMessage() + )); + + return userMapper.toDomain(userEntity); } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/repository/UserEntityRepository.java b/src/main/java/com/neighbors/tohero/infrastructure/repository/UserEntityRepository.java index 2598d13..50c9688 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/repository/UserEntityRepository.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/repository/UserEntityRepository.java @@ -9,6 +9,6 @@ @Repository public interface UserEntityRepository extends JpaRepository { boolean existsByEmail(String email); - UserEntity findByEmail(String email); + Optional findByEmail(String email); Optional findByUserId(long userId); } diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/LetterController.java b/src/main/java/com/neighbors/tohero/presentation/controller/LetterController.java new file mode 100644 index 0000000..1f58541 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/presentation/controller/LetterController.java @@ -0,0 +1,26 @@ +package com.neighbors.tohero.presentation.controller; + +import com.neighbors.tohero.application.baseResponse.BaseResponse; +import com.neighbors.tohero.application.letter.dto.CreateLetterRequest; +import com.neighbors.tohero.application.letter.service.LetterService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("") +public class LetterController { + + private final LetterService letterService; + + @PostMapping("/letter") + public ResponseEntity createLetter(@RequestBody @Validated CreateLetterRequest createLetterRequest) { + return ResponseEntity.ok() + .body(letterService.createLetter(createLetterRequest)); + } +} diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/TestController.java b/src/main/java/com/neighbors/tohero/presentation/controller/TestController.java new file mode 100644 index 0000000..d1d2831 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/presentation/controller/TestController.java @@ -0,0 +1,18 @@ +package com.neighbors.tohero.presentation.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/") +public class TestController { + @GetMapping("/test") + public String test(@RequestParam String code) { + System.out.println(code); + return code; + } +} diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/UserController.java b/src/main/java/com/neighbors/tohero/presentation/controller/UserController.java index e1a3168..1106b71 100644 --- a/src/main/java/com/neighbors/tohero/presentation/controller/UserController.java +++ b/src/main/java/com/neighbors/tohero/presentation/controller/UserController.java @@ -1,6 +1,7 @@ package com.neighbors.tohero.presentation.controller; import com.neighbors.tohero.application.baseResponse.BaseResponse; +import com.neighbors.tohero.application.user.dto.AuthenticateUserRequest; import com.neighbors.tohero.application.user.dto.UpdateUserName; import com.neighbors.tohero.application.user.service.UserService; import com.neighbors.tohero.common.jwt.JwtUserDetails; @@ -11,9 +12,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -31,4 +30,11 @@ public ResponseEntity updateUserName( return ResponseEntity.ok() .body(userService.updateUserName(jwtUserDetail.getUserId(), updateUserName.nickname())); } + + @Operation(summary = "유저 API", description = "사용자 인증 API입니다.") + @PostMapping("/user/auth") + public ResponseEntity authenticateUser(@RequestBody @Validated AuthenticateUserRequest authenticateUserRequest){ + return ResponseEntity.ok() + .body(userService.authenticateUser(authenticateUserRequest)); + } } diff --git a/src/main/java/com/neighbors/tohero/presentation/exception_handler/DTOFieldExceptionControllerAdvice.java b/src/main/java/com/neighbors/tohero/presentation/exception_handler/DTOFieldExceptionControllerAdvice.java index 7f1d2d6..367370f 100644 --- a/src/main/java/com/neighbors/tohero/presentation/exception_handler/DTOFieldExceptionControllerAdvice.java +++ b/src/main/java/com/neighbors/tohero/presentation/exception_handler/DTOFieldExceptionControllerAdvice.java @@ -14,8 +14,7 @@ import java.util.HashMap; import java.util.Map; -import static com.neighbors.tohero.application.baseResponse.BaseResponseMessage.유저_이름의_길이는_1부터_5까지만_가능합니다; -import static com.neighbors.tohero.application.baseResponse.BaseResponseMessage.주소_검색_쿼리의_길이는_1부터_50까지만_가능합니다; +import static com.neighbors.tohero.application.baseResponse.BaseResponseMessage.*; @Priority(0) @RestControllerAdvice @@ -27,6 +26,8 @@ public DTOFieldExceptionControllerAdvice() { fieldErrorMapper = new HashMap<>(); fieldErrorMapper.put("nickname", 유저_이름의_길이는_1부터_5까지만_가능합니다); fieldErrorMapper.put("searchAddress", 주소_검색_쿼리의_길이는_1부터_50까지만_가능합니다); + fieldErrorMapper.put("role", ROLE_필드는_필수입력입니다); + fieldErrorMapper.put("email", 이메일_형식이_올바르지_못합니다); } @ResponseStatus(HttpStatus.BAD_REQUEST)