From 1319eebd5cc5d39eddb69768ee589898432191c8 Mon Sep 17 00:00:00 2001 From: MinkeySon <126847381+MinkeySon@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:25:21 +0900 Subject: [PATCH 1/8] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20($dto,=20domain)=20add?= =?UTF-8?q?=20constructure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gagubackend/auth/domain/StarReview.java | 9 ++++ .../auth/dto/request/RequestSaveUserDto.java | 4 ++ .../auth/dto/response/ResponseAuthDto.java | 13 ++++- .../auth/dto/response/ResponseProfileDto.java | 9 ++++ .../response/ResponseWorkShopDetailsDto.java | 7 +++ .../gagubackend/chat/domain/ChatContents.java | 7 +++ .../dto/request/RequestChatContentsDto.java | 6 ++- .../chat/dto/response/ResponseChatDto.java | 51 ++++++++++++++++++- 8 files changed, 102 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/gagu/gagubackend/auth/domain/StarReview.java b/src/main/java/org/gagu/gagubackend/auth/domain/StarReview.java index 2365c78..890d366 100644 --- a/src/main/java/org/gagu/gagubackend/auth/domain/StarReview.java +++ b/src/main/java/org/gagu/gagubackend/auth/domain/StarReview.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import lombok.*; +import org.gagu.gagubackend.auth.dto.request.RequestSaveUserDto; import org.gagu.gagubackend.global.domain.BaseTimeEntity; import java.math.BigDecimal; @@ -35,4 +36,12 @@ public class StarReview extends BaseTimeEntity { @OneToOne @JoinColumn private User workshop; // 공방 일대일 대응 + + public StarReview(RequestSaveUserDto dto, User user){ + this.workshopName = dto.getNickName(); + this.starsAverage = BigDecimal.valueOf(0.0); + this.sum = new BigDecimal(0); + this.count = BigInteger.valueOf(0); + this.workshop = user; + } } diff --git a/src/main/java/org/gagu/gagubackend/auth/dto/request/RequestSaveUserDto.java b/src/main/java/org/gagu/gagubackend/auth/dto/request/RequestSaveUserDto.java index cadb1b9..456980c 100644 --- a/src/main/java/org/gagu/gagubackend/auth/dto/request/RequestSaveUserDto.java +++ b/src/main/java/org/gagu/gagubackend/auth/dto/request/RequestSaveUserDto.java @@ -20,4 +20,8 @@ public class RequestSaveUserDto { private String FCMToken; private String resourceId; private boolean useAble; + + public void updateNickname(String nickname){ + this.nickName = nickname; + } } diff --git a/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseAuthDto.java b/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseAuthDto.java index 5e1722d..e6ec647 100644 --- a/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseAuthDto.java +++ b/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseAuthDto.java @@ -1,18 +1,29 @@ package org.gagu.gagubackend.auth.dto.response; import lombok.*; +import org.gagu.gagubackend.auth.domain.User; import org.gagu.gagubackend.global.domain.CommonResponse; +import org.gagu.gagubackend.global.security.JwtTokenProvider; +import org.springframework.beans.factory.annotation.Autowired; @Getter -@Setter @NoArgsConstructor @AllArgsConstructor @ToString @Builder public class ResponseAuthDto { + private String accessToken; private String nickname; private String name; private String resourceId; private CommonResponse status; + + public ResponseAuthDto(User user, String accessToken){ + this.accessToken = accessToken; + this.nickname = user.getNickName(); + this.name = user.getName(); + this.resourceId = user.getResourceId(); + this.status = CommonResponse.success(); + } } \ No newline at end of file diff --git a/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseProfileDto.java b/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseProfileDto.java index dc3117c..3f25d99 100644 --- a/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseProfileDto.java +++ b/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseProfileDto.java @@ -1,6 +1,7 @@ package org.gagu.gagubackend.auth.dto.response; import lombok.*; +import org.gagu.gagubackend.auth.domain.User; @Getter @Setter @@ -15,4 +16,12 @@ public class ResponseProfileDto { private String loginTypeLogo; private String profileUrl; private String address; + + public ResponseProfileDto(User user){ + this.profileUrl = user.getProfileUrl(); + this.name = user.getName(); + this.email = user.getEmail(); + this.address = user.getAddress(); + this.nickname = user.getNickName(); + } } diff --git a/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseWorkShopDetailsDto.java b/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseWorkShopDetailsDto.java index 07bba58..838d494 100644 --- a/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseWorkShopDetailsDto.java +++ b/src/main/java/org/gagu/gagubackend/auth/dto/response/ResponseWorkShopDetailsDto.java @@ -1,6 +1,7 @@ package org.gagu.gagubackend.auth.dto.response; import lombok.*; +import org.gagu.gagubackend.auth.domain.User; @Getter @Setter @@ -12,4 +13,10 @@ public class ResponseWorkShopDetailsDto { private String workshopName; private String address; private String description; + + public ResponseWorkShopDetailsDto(User user){ + this.workshopName = user.getNickName(); + this.description = user.getProfileMessage(); + this.address = user.getAddress(); + } } diff --git a/src/main/java/org/gagu/gagubackend/chat/domain/ChatContents.java b/src/main/java/org/gagu/gagubackend/chat/domain/ChatContents.java index 5202a91..506f9d1 100644 --- a/src/main/java/org/gagu/gagubackend/chat/domain/ChatContents.java +++ b/src/main/java/org/gagu/gagubackend/chat/domain/ChatContents.java @@ -31,4 +31,11 @@ public class ChatContents { @ManyToOne @JoinColumn private User sender; + + public ChatContents(String sendTime, String message, Long chatRoomId, User sender){ + this.sendTime = sendTime; + this.message = message; + this.chatRoomId = chatRoomId; + this.sender = sender; + } } diff --git a/src/main/java/org/gagu/gagubackend/chat/dto/request/RequestChatContentsDto.java b/src/main/java/org/gagu/gagubackend/chat/dto/request/RequestChatContentsDto.java index 2c9a365..5c40357 100644 --- a/src/main/java/org/gagu/gagubackend/chat/dto/request/RequestChatContentsDto.java +++ b/src/main/java/org/gagu/gagubackend/chat/dto/request/RequestChatContentsDto.java @@ -17,8 +17,12 @@ public class RequestChatContentsDto { @AllArgsConstructor @Builder public static class EstimateInfo{ - private String template; private Long estimateId; + private String furnitureName; + private String furniture2DUrl; + private String furnitureGlbUrl; + private String furnitureGltfUrl; + private String createdDate; public EstimateInfo(){} } @Getter diff --git a/src/main/java/org/gagu/gagubackend/chat/dto/response/ResponseChatDto.java b/src/main/java/org/gagu/gagubackend/chat/dto/response/ResponseChatDto.java index 8a5d683..9d230ed 100644 --- a/src/main/java/org/gagu/gagubackend/chat/dto/response/ResponseChatDto.java +++ b/src/main/java/org/gagu/gagubackend/chat/dto/response/ResponseChatDto.java @@ -1,13 +1,60 @@ package org.gagu.gagubackend.chat.dto.response; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; +import org.gagu.gagubackend.estimate.domain.Estimate; +import org.gagu.gagubackend.global.domain.enums.MessageType; @Getter @AllArgsConstructor @ToString @Builder public class ResponseChatDto { - private String contents; + private MessageType type; + private ChatContentInfo chatContentInfo; + private EstimateInfo estimateInfo; private String nickName; private String time; + + @Getter + @Builder + public static class ChatContentInfo { + private String contents; + + public ChatContentInfo() { + } + + public ChatContentInfo(String contents) { + this.contents = contents; + } + } + @Getter + @AllArgsConstructor + @Builder + public static class EstimateInfo{ + private Long estimateId; + private String furnitureName; + private String furniture2DUrl; + private String furnitureGlbUrl; + private String furnitureGltfUrl; + private String createdDate; + private String description; + private String price; + private String makerName; + + public EstimateInfo(Estimate estimate){ + this.estimateId = estimate.getId(); + this.furnitureName = estimate.getFurnitureName(); + this.furniture2DUrl = estimate.getFurniture2DUrl(); + this.furnitureGlbUrl = estimate.getFurnitureGlbUrl(); + this.furnitureGltfUrl = estimate.getFurnitureGltfUrl(); + this.createdDate = estimate.getCreatedDate(); + this.price = estimate.getPrice(); + this.makerName = estimate.getMakerName(); + this.description = estimate.getDescription(); + } + public EstimateInfo(){} + } } From 66138434830ce04d07f85ecc3a4d06cf5a5339a4 Mon Sep 17 00:00:00 2001 From: MinkeySon <126847381+MinkeySon@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:26:27 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=E2=9A=A1=20($repository)=20add=20custom=20?= =?UTF-8?q?querydsl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/repository/UserRepository.java | 2 - .../custom/UserRepositoryCustom.java | 37 ++++++++++++++++++ .../custom/impl/UserRepositoryCustomImpl.java | 39 +++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gagu/gagubackend/auth/repository/UserRepository.java b/src/main/java/org/gagu/gagubackend/auth/repository/UserRepository.java index aab969e..7d8816b 100644 --- a/src/main/java/org/gagu/gagubackend/auth/repository/UserRepository.java +++ b/src/main/java/org/gagu/gagubackend/auth/repository/UserRepository.java @@ -9,11 +9,9 @@ public interface UserRepository extends JpaRepository, UserRepositoryCustom { User findByEmailAndLoginType(String name, String loginType); User findByResourceIdAndLoginType(String resourceId, String loginType); - List findAllByEmailAndLoginType(String email, String loginType); User findByEmailAndNickName(String email, String nickName); User findByNickName(String nickname); boolean existsByNickName(String nickname); - boolean existsByNickNameAndLoginType(String nickname, String loginType); boolean existsByResourceIdAndLoginType(String resourceId, String loginType); boolean existsByEmailAndNickName(String email, String nickname); } diff --git a/src/main/java/org/gagu/gagubackend/auth/repository/custom/UserRepositoryCustom.java b/src/main/java/org/gagu/gagubackend/auth/repository/custom/UserRepositoryCustom.java index 562b221..764816f 100644 --- a/src/main/java/org/gagu/gagubackend/auth/repository/custom/UserRepositoryCustom.java +++ b/src/main/java/org/gagu/gagubackend/auth/repository/custom/UserRepositoryCustom.java @@ -2,8 +2,45 @@ import org.gagu.gagubackend.auth.domain.User; +import java.util.List; import java.util.Optional; public interface UserRepositoryCustom { + /** + * 닉네임으로 유저 조회 + * @param nickname + * @return Optional + */ Optional findUserByNickname(String nickname); + + /** + * 공방 회원가입 여부 확인 + * @param nickname + * @param loginType + * @return Optional + */ + Optional checkWorkshopExist(String nickname, String loginType); + + /** + * 공방 조회 시 중복 된 이메일 존재하여 List 반환 + * @param email + * @param type + * @return Optional + */ + Optional> findWorkshops(String email, String type); + + /** + * 소셜 로그인 유저 조회 + * @param resourceId + * @param loginType + * @return user + */ + Optional checkSocialUserExist(String resourceId, String loginType); + + /** + * 페이지에서 공방 id 값으로 조회 + * @param id + * @return user + */ + Optional findWorkshopById(Long id); } diff --git a/src/main/java/org/gagu/gagubackend/auth/repository/custom/impl/UserRepositoryCustomImpl.java b/src/main/java/org/gagu/gagubackend/auth/repository/custom/impl/UserRepositoryCustomImpl.java index a56ed87..95b519b 100644 --- a/src/main/java/org/gagu/gagubackend/auth/repository/custom/impl/UserRepositoryCustomImpl.java +++ b/src/main/java/org/gagu/gagubackend/auth/repository/custom/impl/UserRepositoryCustomImpl.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; @Service @@ -29,4 +30,42 @@ public Optional findUserByNickname(String nickname) { .where(qUser.nickName.eq(nickname)) .fetchOne()); } + + @Override + public Optional checkWorkshopExist(String nickname, String loginType) { + QUser qUser = QUser.user; + return Optional.ofNullable(jpaQueryFactory.select(qUser) + .from(qUser) + .where(qUser.nickName.eq(nickname).and(qUser.loginType.eq(loginType))) + .fetchOne()); + } + + @Override + public Optional> findWorkshops(String email, String type) { + QUser qUser = QUser.user; + + return Optional.ofNullable(jpaQueryFactory.select(qUser) + .from(qUser) + .where(qUser.email.eq(email).and(qUser.loginType.eq(type))) + .fetch()); + } + + @Override + public Optional checkSocialUserExist(String resourceId, String loginType) { + QUser qUser = QUser.user; + return Optional.ofNullable(jpaQueryFactory.select(qUser) + .from(qUser) + .where(qUser.resourceId.eq(resourceId).and(qUser.loginType.eq(loginType))) + .fetchOne()); + } + + @Override + public Optional findWorkshopById(Long id) { + QUser qUser = QUser.user; + + return Optional.ofNullable(jpaQueryFactory.select(qUser) + .from(qUser) + .where(qUser.id.eq(id)) + .fetchOne()); + } } From 9057e45daf0ffce78fcb238a8ada7d031019aac7 Mon Sep 17 00:00:00 2001 From: MinkeySon <126847381+MinkeySon@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:28:29 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=F0=9F=9A=91=20($user)=20add=20constraint?= =?UTF-8?q?=20profile=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gagu/gagubackend/auth/domain/User.java | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/gagu/gagubackend/auth/domain/User.java b/src/main/java/org/gagu/gagubackend/auth/domain/User.java index 61ca84f..6f20732 100644 --- a/src/main/java/org/gagu/gagubackend/auth/domain/User.java +++ b/src/main/java/org/gagu/gagubackend/auth/domain/User.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import lombok.*; +import org.gagu.gagubackend.auth.dto.request.RequestSaveUserDto; import org.gagu.gagubackend.chat.domain.ChatRoomMember; import org.gagu.gagubackend.global.domain.BaseTimeEntity; import org.hibernate.annotations.ColumnDefault; @@ -13,6 +14,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -49,7 +51,7 @@ public class User extends BaseTimeEntity implements UserDetails { @Column(nullable = false) private String email; - @Column(nullable = false) + @Column(nullable = false, length = 8000) private String profileUrl; @Column(nullable = false) @@ -106,4 +108,51 @@ public boolean isCredentialsNonExpired() { public boolean isEnabled() { return true; } + + public void regularUpdate(String email, String resourceId, String fcm){ + this.email = email; + this.resourceId = resourceId; + this.FCMToken = fcm; + } + public void profileUpdate(String fileUrl){ + this.profileUrl = fileUrl; + } + public void infoUpdate(String address, String nickname){ + this.address = address; + this.nickName = nickname; + } + public void addressUpdate(String address){ + this.address = address; + } + public void workshopFCMUpdate(String fcm){ + this.FCMToken = fcm; + } + + public User(RequestSaveUserDto dto, String role){ + this.name = dto.getName(); + this.nickName = dto.getNickName(); + this.password = dto.getPassword(); + this.phoneNumber = dto.getPhoneNumber(); + this.email = dto.getEmail(); + this.profileUrl = dto.getProfileUrl(); + this.loginType = dto.getLoginType(); + this.profileMessage = dto.getProfileMessage(); + this.FCMToken = dto.getFCMToken(); + this.useAble = dto.isUseAble(); + this.roles = Collections.singletonList(role); + } + public User(RequestSaveUserDto dto, String nickname, String role){ + this.name = dto.getName(); + this.resourceId = dto.getResourceId(); + this.nickName = nickname; + this.password = dto.getPassword(); + this.phoneNumber = dto.getPhoneNumber(); + this.email = dto.getEmail(); + this.profileUrl = dto.getProfileUrl(); + this.loginType = dto.getLoginType(); + this.profileMessage = dto.getProfileMessage(); + this.FCMToken = dto.getFCMToken(); + this.useAble = dto.isUseAble(); + this.roles = Collections.singletonList(role); + } } From 597970b06fef8ec31260a8843b2d7d245a7cdbe6 Mon Sep 17 00:00:00 2001 From: MinkeySon <126847381+MinkeySon@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:29:19 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20($=20auth)=20refact=20?= =?UTF-8?q?auth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/controller/AuthController.java | 26 +- .../auth/dao/impl/AuthDAOImpl.java | 555 ++++++++---------- .../gagubackend/auth/service/AuthService.java | 3 +- .../auth/service/impl/AuthServiceImpl.java | 20 +- 4 files changed, 271 insertions(+), 333 deletions(-) diff --git a/src/main/java/org/gagu/gagubackend/auth/controller/AuthController.java b/src/main/java/org/gagu/gagubackend/auth/controller/AuthController.java index 38f0707..a0cf307 100644 --- a/src/main/java/org/gagu/gagubackend/auth/controller/AuthController.java +++ b/src/main/java/org/gagu/gagubackend/auth/controller/AuthController.java @@ -3,6 +3,7 @@ import com.amazonaws.Response; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.ObjectMetadata; +import com.fasterxml.jackson.core.JsonProcessingException; import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.PostConstruct; import jakarta.servlet.http.HttpServletRequest; @@ -56,14 +57,14 @@ public void init() { @Operation(summary = "구글 소셜 로그인 콜백 컨트롤러 입니다.") @GetMapping("/google/callback") - public ResponseEntity getGoogleAuthorizeCode(@RequestParam("code") String authorizeCode, String type){ + public ResponseEntity getGoogleAuthorizeCode(@RequestParam("code") String authorizeCode, String type) throws JsonProcessingException { type = "google"; log.info("[google login] authorizeCode : {}", authorizeCode); return authService.signIn(authorizeCode, type); } @Operation(summary = "카카오 소셜 로그인 콜백 컨트롤러 입니다.") @GetMapping("/kakao/callback") - public ResponseEntity getKaKaoAuthorizeCode(@RequestParam("code") String authorizeCode, String type){ + public ResponseEntity getKaKaoAuthorizeCode(@RequestParam("code") String authorizeCode, String type) throws JsonProcessingException { type = "kakao"; log.info("[kakao login] authorizeCode : {}", authorizeCode); return authService.signIn(authorizeCode, type); @@ -72,6 +73,11 @@ public ResponseEntity getKaKaoAuthorizeCode(@RequestParam("code") String auth @PostMapping("/google/sign") public ResponseEntity googleSign(@RequestBody RequestOauthSignDto requestOauthSignDto){ String type = "google"; + + if(requestOauthSignDto.getProfileUrl().length() > 8000){ + return ResultCode.TOO_LONG_FILENAME.toResponseEntity(); + } + return authService.normalSignIn(requestOauthSignDto, type); } @Operation(summary = "카카오 소셜 로그인 컨트롤러 입니다.") @@ -79,21 +85,30 @@ public ResponseEntity googleSign(@RequestBody RequestOauthSignDto requestOaut public ResponseEntity kaKaoSign(@RequestBody RequestOauthSignDto requestOauthSignDto){ log.info("[kakao login] dto : {}", requestOauthSignDto); String type = "kakao"; + + if(requestOauthSignDto.getProfileUrl().length() > 8000){ + return ResultCode.TOO_LONG_FILENAME.toResponseEntity(); + } + return authService.normalSignIn(requestOauthSignDto, type); } @Operation(summary = "일반 회원가입 컨트롤러 입니다.") @PostMapping("/general/sign-up") public ResponseEntity generalSignUp(@RequestBody RequestGeneralSignUpDto requestGeneralSignUpDto){ - String type = "general"; + String type = "GENERAL"; + + if(requestGeneralSignUpDto.getProfileUrl().length() > 8000){ + return ResultCode.TOO_LONG_FILENAME.toResponseEntity(); + } return authService.generalSingUp(requestGeneralSignUpDto, type); } @Operation(summary = "일반 로그인 컨트롤러 입니다.") @PostMapping("/general/sign-in") public ResponseEntity generalSignIn(@RequestBody RequestGeneralSignDto requestGeneralSignDto){ - String type = "general"; + String type = "GENERAL"; return authService.generalSignIn(requestGeneralSignDto, type); } - @Operation(summary = "사용자 프로필 사진 업로드", description = "사용자가 회원가입 시 프로필을 업로드합니다.") + @Operation(summary = "공방 관계자 프로필 업로드", description = "회원가입 시 사용자 프로필을 업로드합니다.") @PostMapping("/profile-upload") public ResponseEntity uploadFile( @RequestParam("file") MultipartFile file){ @@ -146,7 +161,6 @@ public ResponseEntity sendOne(@RequestBody RequestPhoneNumber requestPhoneNum return ResultCode.BAD_REQUEST.toResponseEntity(); } - Message message = new Message(); message.setFrom(MESSAGE_SENDER); diff --git a/src/main/java/org/gagu/gagubackend/auth/dao/impl/AuthDAOImpl.java b/src/main/java/org/gagu/gagubackend/auth/dao/impl/AuthDAOImpl.java index 7dc10e4..6a9838d 100644 --- a/src/main/java/org/gagu/gagubackend/auth/dao/impl/AuthDAOImpl.java +++ b/src/main/java/org/gagu/gagubackend/auth/dao/impl/AuthDAOImpl.java @@ -18,8 +18,6 @@ import org.gagu.gagubackend.estimate.domain.Estimate; import org.gagu.gagubackend.estimate.repository.EstimateRepository; import org.gagu.gagubackend.global.config.RedisConfig; -import org.gagu.gagubackend.global.domain.CommonResponse; -import org.gagu.gagubackend.global.domain.enums.LoginType; import org.gagu.gagubackend.global.domain.enums.ResultCode; import org.gagu.gagubackend.global.security.JwtTokenProvider; import org.gagu.gagubackend.auth.domain.User; @@ -27,13 +25,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.Authentication; import org.springframework.security.crypto.argon2.Argon2PasswordEncoder; import org.springframework.stereotype.Component; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.Collections; +import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -57,319 +52,262 @@ public class AuthDAOImpl implements AuthDAO { private String googleLoginLogo; @Value("${login.type.general.logo}") private String generalLoginLogo; + @Override public ResponseEntity generalLogin(RequestSaveUserDto requestSaveUserDto) { - if (requestSaveUserDto.getLoginType().equals(LoginType.GENERAL.toString())) { // 공방관계자 회원가입 일 경우 - if (checkWorkshopExist(requestSaveUserDto.getNickName(), requestSaveUserDto.getLoginType())) { // 이미 공방관계자 계정이 있는 경우 - log.info("[auth] user is exist! user : {}", requestSaveUserDto.getNickName()); - - User user = userRepository.findByNickName(requestSaveUserDto.getNickName()); // 공방 관계자 - if (user.isEnabled()) { - log.error("[auth] nick name is duplicated!"); - return ResultCode.DUPLICATE_NICKNAME.toResponseEntity(); + String logIntType = requestSaveUserDto.getLoginType(); + String email = requestSaveUserDto.getEmail(); + String nickName = requestSaveUserDto.getNickName(); + + switch(logIntType){ + case "GENERAL": + Optional optionalWorkshop= userRepository.checkWorkshopExist(nickName,logIntType); + if (optionalWorkshop.isPresent()) { // 이미 공방관계자 계정이 있는 경우 + log.info("[GENERAL-LOGIN] workshop is exist! user : {}", nickName); + + User user = optionalWorkshop.get(); + if (user.isEnabled()) { + log.error("[GENERAL-LOGIN] workshop name is duplicated!"); + return ResultCode.DUPLICATE_NICKNAME.toResponseEntity(); + } else { + return ResultCode.DELETED_USER.toResponseEntity(); + } + } else { - return ResultCode.DELETED_USER.toResponseEntity(); - } + /** + * 새 공방 추가 + */ + log.info("[GENERAL-LOGIN] new workshop!"); + log.warn("[GENERAL-LOGIN] saving workshop..."); + try { + User user = new User(requestSaveUserDto, "ROLE_WORKSHOP"); + userRepository.save(user); - } else { // 새 유저 - log.info("[sign up] new user!"); - log.warn("[sign up] saving user..."); - try { - User user = User.builder() - .name(requestSaveUserDto.getName()) - .nickName(requestSaveUserDto.getNickName()) - .password(requestSaveUserDto.getPassword()) - .phoneNumber(requestSaveUserDto.getPhoneNumber()) - .email(requestSaveUserDto.getEmail()) - .profileUrl(requestSaveUserDto.getProfileUrl()) - .loginType(requestSaveUserDto.getLoginType()) - .profileMessage(requestSaveUserDto.getProfileMessage()) - .FCMToken(requestSaveUserDto.getFCMToken()) - .useAble(requestSaveUserDto.isUseAble()) - .roles(Collections.singletonList("ROLE_WORKSHOP")) - .build(); - userRepository.save(user); + log.info("[GENERAL-LOGIN] saving review count table.."); - log.info("[auth] saving review count table.."); + starReviewRepository.save(new StarReview(requestSaveUserDto, user)); - StarReview starReview = StarReview.builder() - .workshopName(requestSaveUserDto.getNickName()) - .starsAverage(BigDecimal.valueOf(0.0)) - .sum(new BigDecimal(0)) - .count(BigInteger.valueOf(0)) - .workshop(user) - .build(); + log.info("[GENERAL-LOGIN] save review count table success!"); + log.info("[GENERAL-LOGIN] save user success!"); - starReviewRepository.save(starReview); + String refreshToken = jwtTokenProvider.createRefreshToken(email, nickName); - log.info("[auth] save review count table success!"); + try{ + redisConfig.putRefreshToken(nickName,refreshToken); // put {nickname : token} redis + log.info("[GENERAL-LOGIN-SOCIAL] put token to redis success!"); + }catch (Exception e){ + log.error("[GENERAL-LOGIN-SOCIAL] redis server has wrong"); + e.printStackTrace(); + } - log.info("[sign up] save user success!"); + log.info("[GENERAL-LOGIN] put token to redis success!"); - String refreshToken = jwtTokenProvider.createRefreshToken(user.getEmail(), user.getNickName()); - log.info("[auth] refresh token : {}", refreshToken); - - redisConfig.redisTemplate().opsForValue().set(user.getNickName(), - refreshToken, - jwtTokenProvider.getExpireTime(refreshToken).getTime() - System.currentTimeMillis(), - TimeUnit.MILLISECONDS - ); // put {nickname : token} redis - - log.info("[auth] put token to redis success!"); - - return ResponseEntity.status(ResultCode.OK.getCode()) - .body(ResponseAuthDto.builder() - .accessToken(jwtTokenProvider.createAccessToken(user.getEmail(), user.getNickName(), user.getRoles())) - .nickname(user.getNickName()) - .name(user.getName()) - .status(CommonResponse.success()) - .build()); - } catch (DataIntegrityViolationException e) { - e.printStackTrace(); - log.error("[auth] fail to save user"); - return ResultCode.BAD_REQUEST.toResponseEntity(); + return ResponseEntity.ok().body(new ResponseAuthDto(user, + jwtTokenProvider.createAccessToken(user.getEmail(),user.getNickName(), user.getRoles()))); + + } catch (DataIntegrityViolationException e) { + e.printStackTrace(); + log.error("[GENERAL-LOGIN] fail to save user"); + return ResultCode.BAD_REQUEST.toResponseEntity(); + } } - } - } else { // 소셜 로그인일 경우 - if (checkUserExist(requestSaveUserDto.getResourceId(), requestSaveUserDto.getLoginType())) { // 소셜 로그인 구매자 조회 - log.info("[social auth] user is exist!"); - User user = userRepository.findByResourceIdAndLoginType(requestSaveUserDto.getResourceId(), requestSaveUserDto.getLoginType()); - if (user.isEnabled()) { - log.info("[social auth] user is available"); - - if(!user.getEmail().equals(requestSaveUserDto.getEmail())){ - user.setEmail(requestSaveUserDto.getEmail()); + default: + String resourceId = requestSaveUserDto.getResourceId(); + log.info("[GENERAL-LOGIN-SOCIAL] resource id : {}", resourceId); + Optional optionalUser = userRepository.checkSocialUserExist(resourceId, logIntType); + if (optionalUser.isPresent()) { // 소셜 로그인 구매자 조회 + log.info("[GENERAL-LOGIN-SOCIAL] user is exist!"); + User user = optionalUser.get(); + if (user.isEnabled()) { + log.info("[GENERAL-LOGIN-SOCIAL] user is available"); + + /** + * 주기적인 업데이트가 필요한 email, fcm token 정보 업데이트 + */ + user.regularUpdate(email, resourceId, requestSaveUserDto.getFCMToken()); + log.info("[GENERAL-LOGIN-SOCIAL] update regular user data complete!"); + userRepository.save(user); + + String refreshToken = jwtTokenProvider.createRefreshToken(user.getEmail(), user.getNickName()); + try{ + redisConfig.putRefreshToken(user.getNickName(), refreshToken); // put {nickname : token} redis + log.info("[GENERAL-LOGIN-SOCIAL] put token to redis success!"); + }catch (Exception e){ + log.error("[GENERAL-LOGIN-SOCIAL] redis server has wrong"); + e.printStackTrace(); + } + + log.info("[GENERAL-LOGIN-SOCIAL] success to social login!"); + + return ResponseEntity.ok().body(new ResponseAuthDto(user, + jwtTokenProvider.createAccessToken(user.getEmail(),user.getNickName(), user.getRoles()))); + } else { + return ResultCode.DELETED_USER.toResponseEntity(); } + } else { // 새로운 유저 + log.info("[GENERAL-LOGIN-SOCIAL] new user!"); + String newNickname = nicknameDAO.generateNickName(); - user.setResourceId(requestSaveUserDto.getResourceId()); - - String refreshToken = jwtTokenProvider.createRefreshToken(user.getEmail(), user.getNickName()); - - redisConfig.redisTemplate().opsForValue().set(user.getNickName(), - refreshToken, - jwtTokenProvider.getExpireTime(refreshToken).getTime() - System.currentTimeMillis(), - TimeUnit.MILLISECONDS - ); // put {nickname : token} redis - - log.info("[workshop auth] update user fcm token!"); - user.setFCMToken(requestSaveUserDto.getFCMToken()); - userRepository.save(user); // user 로그인 시 FCM 토큰 업데이트 - - log.info("[social auth] put token to redis success!"); + if (!(userRepository.existsByNickName(newNickname))) { + log.info("[GENERAL-LOGIN-SOCIAL] nickname : {}", newNickname); - log.info("[social auth] success to social login!"); + User user = new User(requestSaveUserDto, newNickname,"ROLE_USER"); + userRepository.save(user); - return ResponseEntity.status(ResultCode.OK.getCode()) - .body(ResponseAuthDto.builder() - .accessToken(jwtTokenProvider.createAccessToken(user.getEmail(), user.getNickName(), user.getRoles())) - .nickname(user.getNickName()) - .resourceId(user.getResourceId()) - .name(user.getName()) - .status(CommonResponse.success()) - .build()); + String refreshToken = jwtTokenProvider.createRefreshToken(email, newNickname); + redisConfig.putRefreshToken(newNickname, refreshToken); // put {nickname : token} redis + log.info("[GENERAL-LOGIN-SOCIAL] put token to redis success!"); - } else { - return ResultCode.DELETED_USER.toResponseEntity(); + return ResponseEntity.ok().body(new ResponseAuthDto(user, + jwtTokenProvider.createAccessToken(user.getEmail(),user.getNickName(), user.getRoles()))); + } + return ResponseEntity.status(ResultCode.FAIL.getCode()).body("알 수 없는 원인 때문에 회원가입에 실패하였습니다. 관리자에게 문의해주세요."); } - } else { // 새로운 유저 - log.info("[social auth] new user!"); - - String nickname = nicknameDAO.generateNickName(); - - if (!(userRepository.existsByNickName(nickname))) { - log.info("[social auth] nickname : {}", nickname); - - User user = User.builder() - .name(requestSaveUserDto.getName()) - .nickName(nickname) - .resourceId(requestSaveUserDto.getResourceId()) - .password(requestSaveUserDto.getPassword()) - .phoneNumber(requestSaveUserDto.getPhoneNumber()) - .email(requestSaveUserDto.getEmail()) - .profileUrl(requestSaveUserDto.getProfileUrl()) - .loginType(requestSaveUserDto.getLoginType()) - .FCMToken(requestSaveUserDto.getFCMToken()) - .useAble(requestSaveUserDto.isUseAble()) - .roles(Collections.singletonList("ROLE_USER")) - .build(); + } + } - userRepository.save(user); + @Override + public ResponseEntity workshopLogin(RequestGeneralSignDto requestGeneralSignDto, String type) { + Argon2PasswordEncoder encoder = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); - String refreshToken = jwtTokenProvider.createRefreshToken(user.getEmail(), user.getNickName()); + Optional> optionalUsers = userRepository.findWorkshops(requestGeneralSignDto.getEmail(), type); + log.info("[WORKSHOP-LOGIN] user email : {}, type : {}",requestGeneralSignDto.getEmail(), type); - log.info("[social auth] refresh token : {}", refreshToken); + if(optionalUsers.isEmpty()){ + return ResultCode.NOT_FOUND_USER.toResponseEntity(); + }else{ + List userList = optionalUsers.get(); - redisConfig.redisTemplate().opsForValue().set(user.getNickName(), - refreshToken, - jwtTokenProvider.getExpireTime(refreshToken).getTime() - System.currentTimeMillis(), - TimeUnit.MILLISECONDS - ); // put {nickname : token} redis + if(userList.size() > 1){ // 공방 관계자 중 동일한 이메일, 로그인 타입이 있을 때 + log.info("[WORKSHOP-LOGIN] duplicate email.. check user password.."); - log.info("[social auth] put token to redis success!"); + for(User user : userList){ + String password = user.getPassword(); + if (encoder.matches(requestGeneralSignDto.getPassword(), password)){ // 패스워드, 이메일 일치하는 계정 찾았을 때 + log.info("[WORKSHOP-LOGIN] check user password success!"); + String email = user.getEmail(); + String nickname = user.getNickName(); - return ResponseEntity.status(ResultCode.OK.getCode()) - .body(ResponseAuthDto.builder() - .accessToken(jwtTokenProvider.createAccessToken(user.getEmail(), user.getNickName(), user.getRoles())) - .nickname(user.getNickName()) - .name(user.getName()) - .resourceId(user.getResourceId()) - .status(CommonResponse.success()) - .build()); - } - return ResponseEntity.status(ResultCode.FAIL.getCode()).body("알 수 없는 원인 때문에 회원가입에 실패하였습니다. 관리자에게 문의해주세요."); - } - } - } + user.workshopFCMUpdate(requestGeneralSignDto.getFCMToken()); + userRepository.save(user); + log.info("[WORKSHOP-LOGIN] update user fcm token!"); - @Override - public ResponseEntity workshopLogin(RequestGeneralSignDto requestGeneralSignDto, String type) { - Argon2PasswordEncoder encoder = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); - List userList = userRepository.findAllByEmailAndLoginType(requestGeneralSignDto.getEmail(), type); - - if(userList.size() > 1){ // 공방 관계자 중 동일한 이메일, 로그인 타입이 있을 때 - log.info("[workshop auth] duplicate email.. check user password.."); - for(User tmp : userList){ - String password = tmp.getPassword(); - if (encoder.matches(requestGeneralSignDto.getPassword(),password)){ // 패스워드, 이메일 일치하는 계정 찾았을 때 - log.info("[workshop auth] check user password success!"); - - log.info("[workshop auth] update user fcm token!"); - tmp.setFCMToken(requestGeneralSignDto.getFCMToken()); - userRepository.save(tmp); - - String refreshToken = jwtTokenProvider.createRefreshToken(tmp.getEmail(), tmp.getNickName()); - - redisConfig.redisTemplate().opsForValue().set(tmp.getNickName(), - refreshToken, - jwtTokenProvider.getExpireTime(refreshToken).getTime() - System.currentTimeMillis(), - TimeUnit.MILLISECONDS - ); // put {nickname : token} redis - - log.info("[workshop auth] put token to redis success!"); - - return ResponseEntity.status(ResultCode.OK.getCode()) - .body(ResponseAuthDto.builder() - .accessToken(jwtTokenProvider.createAccessToken(tmp.getEmail(), tmp.getNickName(),tmp.getRoles())) - .nickname(tmp.getNickName()) - .name(tmp.getName()) - .status(CommonResponse.success()) - .build()); - } - } // 비밀번호가 일치하지 않을 때 - log.error("[workshop auth] password is unmatched"); - return ResultCode.PASSWORD_NOT_MATCH.toResponseEntity(); + String refreshToken = jwtTokenProvider.createRefreshToken(email, nickname); - }else{ // 공방관계자 계정이 유일 할 때 - log.info("[workshop auth] no duplicate email! check user password"); - User user = userList.get(0); - String password = user.getPassword(); + redisConfig.putRefreshToken(nickname, refreshToken); // put {nickname : token} redis; // put {nickname : token} redis - if(encoder.matches(requestGeneralSignDto.getPassword(), password)){ - log.info("[workshop auth] check user password success!"); + log.info("[WORKSHOP-LOGIN] put token to redis success!"); - log.info("[workshop auth] update user fcm token!"); - user.setFCMToken(requestGeneralSignDto.getFCMToken()); - userRepository.save(user); + return ResponseEntity.ok() + .body(new ResponseAuthDto(user, + jwtTokenProvider.createAccessToken(user.getEmail(),user.getNickName(), user.getRoles()))); + } + } // 비밀번호가 일치하지 않을 때 + log.error("[WORKSHOP-LOGIN] password is unmatched"); + return ResultCode.PASSWORD_NOT_MATCH.toResponseEntity(); + + }else{ // 공방관계자 계정이 유일 할 때 + log.info("[WORKSHOP-LOGIN] no duplicate email! check user password"); + log.info("[WORKSHOP-LOGIN] userList: {}", userList); + User user = userList.get(0); + String password = user.getPassword(); + String nickname = user.getNickName(); + + if(!encoder.matches(requestGeneralSignDto.getPassword(), password)) { + return ResponseEntity.status(ResultCode.PASSWORD_NOT_MATCH.getCode()) + .body(ResultCode.PASSWORD_NOT_MATCH.getMessage()); + } + log.info("[WORKSHOP-LOGIN] check user password success!"); - String refreshToken = jwtTokenProvider.createRefreshToken(user.getEmail(), user.getNickName()); + user.workshopFCMUpdate(requestGeneralSignDto.getFCMToken()); + userRepository.save(user); + log.info("[WORKSHOP-LOGIN] update user fcm token!"); - log.info("[workshop auth] refresh token : {}", refreshToken); + String refreshToken = jwtTokenProvider.createRefreshToken(user.getEmail(), user.getNickName()); - redisConfig.redisTemplate().opsForValue().set(user.getNickName(), - refreshToken, - jwtTokenProvider.getExpireTime(refreshToken).getTime() - System.currentTimeMillis(), - TimeUnit.MILLISECONDS - ); // put {nickname : token} redis + redisConfig.putRefreshToken(nickname, refreshToken); // put {nickname : token} redis; - log.info("[workshop auth] put token to redis success!"); + log.info("[WORKSHOP-LOGIN] put token to redis success!"); - return ResponseEntity.status(ResultCode.OK.getCode()) - .body(ResponseAuthDto.builder() - .accessToken(jwtTokenProvider.createAccessToken(user.getEmail(), user.getNickName(),user.getRoles())) - .nickname(user.getNickName()) - .name(user.getName()) - .status(CommonResponse.success()) - .build()); - }else{ - return ResponseEntity.status(ResultCode.PASSWORD_NOT_MATCH.getCode()) - .body(ResultCode.PASSWORD_NOT_MATCH.getMessage()); + return ResponseEntity.ok() + .body(new ResponseAuthDto(user, + jwtTokenProvider.createAccessToken(user.getEmail(),user.getNickName(), user.getRoles()))); + } } } - } @Override public ResponseEntity changeUserProfile(String nickname, String fileUrl) { - log.info("[change profile] file url : {}", fileUrl); - User user = userRepository.findByNickName(nickname); - if(!(user == null)){ - String profileUrl = user.getProfileUrl(); - if(profileUrl.equals(fileUrl)){ - return ResponseEntity.status(ResultCode.DUPLICATE_PROFILE.getCode()).body(ResultCode.DUPLICATE_PROFILE.getMessage()); - }else{ + log.info("[CHANGE-USER-PROFILE] file url : {}", fileUrl); + Optional optionalUser = userRepository.findUserByNickname(nickname); + + checkUserData(optionalUser); - user.setProfileUrl(fileUrl); + User user = optionalUser.get(); + + String profileUrl = user.getProfileUrl(); + if(profileUrl.equals(fileUrl)){ + return ResultCode.DUPLICATE_PROFILE.toResponseEntity(); + }else{ + user.profileUpdate(fileUrl); + try{ userRepository.save(user); - return ResponseEntity.ok("정상적으로 프로필이 변경되었습니다."); + }catch (DataIntegrityViolationException e){ + log.error("[CHANGE-USER-PROFILE] Data integrity violation: {}", e.getMessage()); + return ResponseEntity.badRequest().body("프로필 URL의 길이가 너무 깁니다."); } + return ResponseEntity.ok("정상적으로 프로필이 변경되었습니다."); } - return ResponseEntity.status(ResultCode.NOT_FOUND_USER.getCode()).body(ResultCode.NOT_FOUND_USER.getMessage()); } @Override public ResponseEntity checkUserProfile(String nickname) { - log.info("[auth] check user by nickname"); - User user = userRepository.findByNickName(nickname); - - if(user == null){ - return ResponseEntity.status(ResultCode.NOT_FOUND_USER.getCode()).body(ResultCode.NOT_FOUND_USER.getMessage()); - }else if (!user.isEnabled()){ - return ResponseEntity.status(ResultCode.DELETED_USER.getCode()).body(ResultCode.DELETED_USER.getMessage()); - }else{ - ResponseProfileDto responseProfileDto = new ResponseProfileDto(); - responseProfileDto.setProfileUrl(user.getProfileUrl()); - responseProfileDto.setName(user.getName()); - responseProfileDto.setEmail(user.getEmail()); - responseProfileDto.setAddress(user.getAddress()); - responseProfileDto.setNickname(nickname); - switch (user.getLoginType()){ - case "GOOGLE": - responseProfileDto.setLoginTypeLogo(googleLoginLogo); - return ResponseEntity.ok(responseProfileDto); - case "KAKAO": - responseProfileDto.setLoginTypeLogo(kaKaoLoginLogo); - return ResponseEntity.ok(responseProfileDto); - case "GENERAL": - responseProfileDto.setLoginTypeLogo(generalLoginLogo); - return ResponseEntity.ok(responseProfileDto); - } + log.info("[CHECK-USER-PROFILE] check user by nickname"); + Optional optionalUser = userRepository.findUserByNickname(nickname); + + checkUserData(optionalUser); + + User user = optionalUser.get(); + ResponseProfileDto responseProfileDto = new ResponseProfileDto(user); + + switch (user.getLoginType()){ + case "GOOGLE": + responseProfileDto.setLoginTypeLogo(googleLoginLogo); + return ResponseEntity.ok(responseProfileDto); + case "KAKAO": + responseProfileDto.setLoginTypeLogo(kaKaoLoginLogo); + return ResponseEntity.ok(responseProfileDto); + default: + responseProfileDto.setLoginTypeLogo(generalLoginLogo); + return ResponseEntity.ok(responseProfileDto); } - return null; } @Override public ResponseEntity saveUserAddress(RequestAddressDto requestAddressDto, String nickname) { - log.info("[auth] saving {}'s address...",nickname); - User user = userRepository.findByNickName(nickname); - if(user == null){ - return ResultCode.NOT_FOUND_USER.toResponseEntity(); - }else{ - try{ - user.setAddress(requestAddressDto.getAddress()); - userRepository.save(user); - log.info("[auth] successfully save address!"); - return ResultCode.OK.toResponseEntity(); - }catch (Exception e){ - log.error("[auth] fail to save address!"); - e.printStackTrace(); - return ResultCode.FAIL.toResponseEntity(); - } + log.info("[SAVE-USER-ADDRESS] saving {}'s address...",nickname); + Optional optionalUser = userRepository.findUserByNickname(nickname); + + checkUserData(optionalUser); + + try{ + User user = optionalUser.get(); + user.addressUpdate(requestAddressDto.getAddress()); + userRepository.save(user); + log.info("[SAVE-USER-ADDRESS] successfully save address!"); + return ResultCode.OK.toResponseEntity(); + }catch (Exception e){ + log.error("[SAVE-USER-ADDRESS] fail to save address!"); + e.printStackTrace(); + return ResultCode.FAIL.toResponseEntity(); } } + @Override public ResponseEntity deleteToken(String token){ String nickName = jwtTokenProvider.getUserNickName(token); - log.info("[auth] logout user name : {}", nickName); + log.info("[DELETE-TOKEN] logout user name : {}", nickName); if (redisConfig.redisTemplate().opsForValue().get(nickName)!=null){ // refresh token 이 있을 경우 @@ -387,59 +325,43 @@ public ResponseEntity deleteToken(String token){ @Override public ResponseEntity saveUserInfo(RequestChangeUserInfoDto requestChangeUserInfoDto, String nickname) { - log.info("[auth] checking user...."); - User user = userRepository.findByNickName(nickname); - if(user == null){ - log.error("[auth] not found user!"); - return ResultCode.NOT_FOUND_USER.toResponseEntity(); - }else{ - if(!(user.isEnabled())){ - log.error("[auth] deleted user!"); - return ResultCode.DELETED_USER.toResponseEntity(); + log.info("[SAVE-USER-INFO] checking user...."); + Optional optionalUser = userRepository.findUserByNickname(nickname); + + checkUserData(optionalUser); + + try{ + User user = optionalUser.get(); + log.info("[SAVE-USER-INFO] changing user info.."); + user.infoUpdate(requestChangeUserInfoDto.getAddress(), requestChangeUserInfoDto.getNickname()); + + userRepository.save(user); + + if(user.getRoles().get(0).equals("ROLE_WORKSHOP")){ + updateWorkshopName(nickname, requestChangeUserInfoDto.getNickname()); }else{ - try{ - log.info("[auth] user is founded! checking user profile.."); - log.info("[auth] changing user info.."); - user.setAddress(requestChangeUserInfoDto.getAddress()); - user.setNickName(requestChangeUserInfoDto.getNickname()); - - log.info("[auth] user role : {}", user.getRoles()); - - userRepository.save(user); - - if(user.getRoles().get(0).equals("ROLE_WORKSHOP")){ - updateWorkshopName(nickname, requestChangeUserInfoDto.getNickname()); - }else{ - updateUserNickName(nickname, requestChangeUserInfoDto.getNickname()); - } - - log.info("[auth] update user info successfully!"); - return ResultCode.OK.toResponseEntity(); - }catch (Exception e){ - e.printStackTrace(); - return ResultCode.FAIL.toResponseEntity(); - } + updateUserNickName(nickname, requestChangeUserInfoDto.getNickname()); } + + log.info("[SAVE-USER-INFO] update user info successfully!"); + return ResultCode.OK.toResponseEntity(); + }catch (Exception e){ + e.printStackTrace(); + return ResultCode.FAIL.toResponseEntity(); } } @Override public ResponseEntity getWorkShopDetails(Long id) { - User user = userRepository.findById(id).get(); - if(user == null){ - log.info("[WORKSHOP-DETAILS] no user!"); - return ResultCode.NOT_FOUND_USER.toResponseEntity(); - }else{ - ResponseWorkShopDetailsDto dto = ResponseWorkShopDetailsDto.builder() - .workshopName(user.getNickName()) - .description(user.getProfileMessage()) - .address(user.getAddress()) - .build(); - log.info("[WORKSHOP-DETAILS] found workshop successfully!"); - return ResponseEntity.ok(dto); - } + Optional optionalUser = userRepository.findWorkshopById(id); + + checkUserData(optionalUser); + + log.info("[WORKSHOP-DETAILS] found workshop successfully!"); + return ResponseEntity.ok(new ResponseWorkShopDetailsDto(optionalUser.get())); } + @Override public Optional getUserByNickname(String nickname) { return userRepository.findUserByNickname(nickname); @@ -457,6 +379,18 @@ private void updateUserNickName(String nickname, String changeNickname){ }).collect(Collectors.toList()); } + private ResponseEntity checkUserData(Optional optionalUser){ + if(optionalUser.isEmpty()){ + log.error("[]"); + return ResultCode.NOT_FOUND_USER.toResponseEntity(); + } + User user = optionalUser.get(); + if(!user.isEnabled()){ + return ResultCode.DELETED_USER.toResponseEntity(); + } + return null; + } + private void updateWorkshopName(String nickname, String changeNickname){ log.info("[auth] update chat room workshop name...."); @@ -491,11 +425,4 @@ private void updateWorkshopName(String nickname, String changeNickname){ }).collect(Collectors.toList()); log.info("[auth] update success!"); } - - private boolean checkUserExist(String resourceId, String loginType){ - return userRepository.existsByResourceIdAndLoginType(resourceId, loginType); - } - private boolean checkWorkshopExist(String nickname, String loginType){ - return userRepository.existsByNickNameAndLoginType(nickname,loginType); - } } diff --git a/src/main/java/org/gagu/gagubackend/auth/service/AuthService.java b/src/main/java/org/gagu/gagubackend/auth/service/AuthService.java index 143c162..26162ec 100644 --- a/src/main/java/org/gagu/gagubackend/auth/service/AuthService.java +++ b/src/main/java/org/gagu/gagubackend/auth/service/AuthService.java @@ -1,5 +1,6 @@ package org.gagu.gagubackend.auth.service; +import com.fasterxml.jackson.core.JsonProcessingException; import org.gagu.gagubackend.auth.dto.request.*; import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; @@ -11,7 +12,7 @@ public interface AuthService { * @param type * @return */ - ResponseEntity signIn(String authorizeCode, String type); + ResponseEntity signIn(String authorizeCode, String type) throws JsonProcessingException; /** * 소셜 로그인 api 사용 x * @param requestOauthSignDto diff --git a/src/main/java/org/gagu/gagubackend/auth/service/impl/AuthServiceImpl.java b/src/main/java/org/gagu/gagubackend/auth/service/impl/AuthServiceImpl.java index 757548d..0a8d281 100644 --- a/src/main/java/org/gagu/gagubackend/auth/service/impl/AuthServiceImpl.java +++ b/src/main/java/org/gagu/gagubackend/auth/service/impl/AuthServiceImpl.java @@ -2,6 +2,7 @@ import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.ObjectMetadata; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; @@ -58,7 +59,7 @@ public class AuthServiceImpl implements AuthService { @Override - public ResponseEntity signIn(String authorizeCode, String type) { + public ResponseEntity signIn(String authorizeCode, String type) throws JsonProcessingException { switch (type){ case "kakao": log.info("[kakao login] issue a authorizecode"); @@ -76,7 +77,7 @@ public ResponseEntity signIn(String authorizeCode, String type) { HttpEntity> kakaoTokenRequest = new HttpEntity<>(params, headers); - try{ + ResponseEntity response = restTemplate.exchange( kakaoAccessTokenUrl, HttpMethod.POST, @@ -93,12 +94,6 @@ public ResponseEntity signIn(String authorizeCode, String type) { return authDAO.generalLogin(requestSignUpDto); - }catch (Exception e){ - log.warn("[kakao login] fail authorizecode issued"); - return ResponseEntity.status(ResultCode.PASSWORD_NOT_MATCH.getCode()) - .body(CommonResponse.fail(ResultCode.PASSWORD_NOT_MATCH)); - } - case "google": log.info("[google login] issue a authorizecode"); objectMapper = new ObjectMapper(); @@ -116,16 +111,16 @@ public ResponseEntity signIn(String authorizeCode, String type) { HttpEntity> googleRequest = new HttpEntity<>(params, headers); - ResponseEntity response = restTemplate.postForEntity(googleAccessTokenUrl,googleRequest,String.class); + response = restTemplate.postForEntity(googleAccessTokenUrl,googleRequest,String.class); log.info("[google login] authorizecode issued successfully"); try{ - Map responseMap = objectMapper.readValue(response.getBody(), new TypeReference>() {}); - String accessToken = (String) responseMap.get("access_token"); + responseMap = objectMapper.readValue(response.getBody(), new TypeReference>() {}); + accessToken = (String) responseMap.get("access_token"); log.info("[google login] access token issued successfully"); log.info("[google login] accessToken : {}",accessToken); log.warn("[google login] get user info"); - RequestSaveUserDto requestSignUpDto = getGoogleUserInfo(accessToken); + requestSignUpDto = getGoogleUserInfo(accessToken); return authDAO.generalLogin(requestSignUpDto); }catch (Exception e){ @@ -289,6 +284,7 @@ private RequestSaveUserDto getKakaoUserInfo(String accessToken){ .name((String) kakaoAccount.get("name")) .nickName(null) .password(getRandomPassword()) + .resourceId("1234") .phoneNumber((String) kakaoAccount.get("phone_number")) .email((String)kakaoAccount.get("email")) .profileUrl((String) profile.get("profile_image_url")) From 1555d08e3cbf0431bf4aea4d0996488afc8b1bca Mon Sep 17 00:00:00 2001 From: MinkeySon <126847381+MinkeySon@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:30:02 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=E2=9A=A1=20($=20redis)=20add=20pushing=20t?= =?UTF-8?q?oken=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gagu/gagubackend/global/config/RedisConfig.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/org/gagu/gagubackend/global/config/RedisConfig.java b/src/main/java/org/gagu/gagubackend/global/config/RedisConfig.java index d3f5d1e..e03f04b 100644 --- a/src/main/java/org/gagu/gagubackend/global/config/RedisConfig.java +++ b/src/main/java/org/gagu/gagubackend/global/config/RedisConfig.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.gagu.gagubackend.global.security.JwtTokenProvider; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -11,11 +12,15 @@ import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; import org.springframework.data.redis.serializer.StringRedisSerializer; +import java.util.Date; +import java.util.concurrent.TimeUnit; + @RequiredArgsConstructor @Configuration @EnableRedisRepositories @Slf4j public class RedisConfig { + private final JwtTokenProvider jwtTokenProvider; @Value("${spring.redis.host}") private String host; @@ -37,4 +42,12 @@ public RedisTemplate redisTemplate() { redisTemplate.setConnectionFactory(redisConnectionFactory()); return redisTemplate; } + + public void putRefreshToken(String nickname, String refreshToken){ + Date expireTime = jwtTokenProvider.getExpireTime(refreshToken); + redisTemplate().opsForValue().set(nickname, + refreshToken, + expireTime.getTime() - System.currentTimeMillis(), + TimeUnit.MILLISECONDS); + } } From 0907272a5077773019c8abbf83235a871627f31c Mon Sep 17 00:00:00 2001 From: MinkeySon <126847381+MinkeySon@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:30:46 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=E2=9C=A8=20($=20global)=20add=20file=20exc?= =?UTF-8?q?eption=20result=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/gagu/gagubackend/global/domain/enums/ResultCode.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/gagu/gagubackend/global/domain/enums/ResultCode.java b/src/main/java/org/gagu/gagubackend/global/domain/enums/ResultCode.java index 0488fda..572758d 100644 --- a/src/main/java/org/gagu/gagubackend/global/domain/enums/ResultCode.java +++ b/src/main/java/org/gagu/gagubackend/global/domain/enums/ResultCode.java @@ -15,6 +15,7 @@ public enum ResultCode { DUPLICATE_USER(400,"이미 계정이 존재합니다"), DUPLICATE_CHATROOM(400,"이미 채팅방이 존재합니다."), NOT_IN_STORAGE(404, "스토리지에 저장되어 있지 않습니다."), + TOO_LONG_FILENAME(400, "파일명이 너무 깁니다. 다른 이름으로 변경해주세요. (영어 파일명을 추천드립니다)"), BAD_REQUEST(400, "요청값이 잘못 됐습니다."), TOKEN_IS_NULL(400, "토큰 값이 누락됐습니다."), NO_AUTHORIZE_NUMBER(400, "인증번호가 누락됐습니다."), From 19f7adbad2fb5ae85d7426e86e344d18d58dd8b4 Mon Sep 17 00:00:00 2001 From: MinkeySon <126847381+MinkeySon@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:31:40 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=F0=9F=92=A1=20($=20global)=20remove=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/gagu/gagubackend/global/security/JwtTokenProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/gagu/gagubackend/global/security/JwtTokenProvider.java b/src/main/java/org/gagu/gagubackend/global/security/JwtTokenProvider.java index a68a705..ee216a6 100644 --- a/src/main/java/org/gagu/gagubackend/global/security/JwtTokenProvider.java +++ b/src/main/java/org/gagu/gagubackend/global/security/JwtTokenProvider.java @@ -40,7 +40,7 @@ public String createAccessToken(String email,String nickName, List roles } public String createRefreshToken(String email, String nickName){ - log.info("[JwtTokenProvider] create refresh token : {}", email); + log.info("[JwtTokenProvider] creating refresh token.."); String token = createToken(email, nickName,new ArrayList<>(), refreshTokenValidTime); token = "Bearer " + token; log.info("[JwtTokenProvider] create refresh token success"); From 712b81d9bb11ee12173ddc29b841446c7dba05d0 Mon Sep 17 00:00:00 2001 From: MinkeySon <126847381+MinkeySon@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:32:25 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=E2=9A=A1=20($=20chat)=20change=20payload?= =?UTF-8?q?=20field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/dao/impl/ChatDAOImpl.java | 68 +++++++++++-------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/gagu/gagubackend/chat/dao/impl/ChatDAOImpl.java b/src/main/java/org/gagu/gagubackend/chat/dao/impl/ChatDAOImpl.java index 2a11512..e94474b 100644 --- a/src/main/java/org/gagu/gagubackend/chat/dao/impl/ChatDAOImpl.java +++ b/src/main/java/org/gagu/gagubackend/chat/dao/impl/ChatDAOImpl.java @@ -23,6 +23,7 @@ import org.gagu.gagubackend.estimate.repository.EstimateRepository; import org.gagu.gagubackend.global.domain.enums.ResultCode; import org.gagu.gagubackend.global.exception.ChatRoomNotFoundException; +import org.gagu.gagubackend.global.exception.NotFoundUserException; import org.gagu.gagubackend.global.exception.NotMemberException; import org.gagu.gagubackend.auth.domain.User; import org.gagu.gagubackend.auth.dto.request.RequestUserInfoDto; @@ -155,27 +156,30 @@ public ResponseEntity deleteChatRoom(Long roomId, String nickname) { @Override public ResponseChatDto saveMessage(RequestChatContentsDto requestChatContentsDto, Long roomId, String nickname) { - User user = userRepository.findByNickName(nickname); - log.info("[chat] sender : {}", user.getNickName()); - - // 저장되는 채팅 내역 - ChatContents chatContents = ChatContents.builder() - .sendTime(timeService.makeTimeTemplate()) - .sender(user) - .message(requestChatContentsDto.getChatContentsInfo().getContents()) - .chatRoomId(roomId) - .build(); - - // 실제 전송되는 메세지 - ResponseChatDto responseChatDto = ResponseChatDto.builder() - .contents(chatContents.getMessage()) - .nickName(user.getNickName()) - .time(chatContents.getSendTime()) - .build(); - - chatContentsRepository.save(chatContents); - - return responseChatDto; + Optional userOptional = userRepository.findUserByNickname(nickname); + if(userOptional.isPresent()){ + String contents = requestChatContentsDto.getChatContentsInfo().getContents(); + User user = userOptional.get(); + // 저장되는 채팅 내역 + ChatContents chatContents = new ChatContents(timeService.makeTimeTemplate(), + contents, + roomId, + user); + + // 실제 전송되는 메세지 + ResponseChatDto responseChatDto = ResponseChatDto.builder() + .type(requestChatContentsDto.getType()) + .chatContentInfo(new ResponseChatDto.ChatContentInfo(contents)) + .nickName(user.getNickName()) + .time(chatContents.getSendTime()) + .build(); + + chatContentsRepository.save(chatContents); + + return responseChatDto; + }else{ + throw new NotFoundUserException(); + } } @Override @@ -281,13 +285,18 @@ public Optional getChatRoomMember(String nickname, Long id) { @Override public ResponseChatDto askEstimate(RequestChatContentsDto message, String nickname) { - RequestChatContentsDto.EstimateInfo estimateInfo = message.getEstimateInfo(); + Optional estimateOptional = estimateRepository.findEstimateById(message.getEstimateInfo().getEstimateId()); + if(estimateOptional.isPresent()){ - return ResponseChatDto.builder() - .contents(estimateInfo.getTemplate()) - .nickName(nickname) - .time(timeService.makeTimeTemplate()) - .build(); + return ResponseChatDto.builder() + .type(message.getType()) + .estimateInfo(new ResponseChatDto.EstimateInfo(estimateOptional.get())) + .nickName(nickname) + .time(timeService.makeTimeTemplate()) + .build(); + }else{ + throw new NullPointerException("견적서를 찾을 수 없습니다."); + } } @Override @@ -301,13 +310,14 @@ public ResponseChatDto completeEstimate(RequestChatContentsDto message, String n estimateRepository.save(estimate); return ResponseChatDto.builder() - .contents(estimateInfo.getTemplate()) + .type(message.getType()) + .estimateInfo(new ResponseChatDto.EstimateInfo(estimateOptional.get())) .nickName(nickname) .time(timeService.makeTimeTemplate()) .build(); }else{ log.error("[CHAT-DAO-IMPL] fail to get estimate info!"); - throw new NullPointerException(); + throw new NullPointerException("견적서를 찾을 수 없습니다."); } }