From 49e5a4e678473c3249d0fe08a26567208ccb4ff0 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Wed, 22 Jan 2025 14:50:35 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat(presentation)=20:=20=EA=B3=B5=EC=9C=A0?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=B6=94=EC=B2=9C=EC=9D=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B0=9C=EA=B8=89=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/GetRecommenderCodeResponse.java | 4 +++ .../sharing/service/SharingService.java | 16 +++++++++++ .../controller/SharingController.java | 27 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 src/main/java/com/neighbors/tohero/application/sharing/dto/GetRecommenderCodeResponse.java create mode 100644 src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java create mode 100644 src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java diff --git a/src/main/java/com/neighbors/tohero/application/sharing/dto/GetRecommenderCodeResponse.java b/src/main/java/com/neighbors/tohero/application/sharing/dto/GetRecommenderCodeResponse.java new file mode 100644 index 0000000..0e8d30a --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/sharing/dto/GetRecommenderCodeResponse.java @@ -0,0 +1,4 @@ +package com.neighbors.tohero.application.sharing.dto; + +public record GetRecommenderCodeResponse() { +} diff --git a/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java new file mode 100644 index 0000000..f79531f --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java @@ -0,0 +1,16 @@ +package com.neighbors.tohero.application.sharing.service; + +import com.neighbors.tohero.application.baseResponse.BaseResponse; +import com.neighbors.tohero.application.sharing.dto.GetRecommenderCodeResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class SharingService { + + public BaseResponse getRecommenderCode(long userId){ + return null; + } + +} diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java new file mode 100644 index 0000000..6626165 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java @@ -0,0 +1,27 @@ +package com.neighbors.tohero.presentation.controller; + +import com.neighbors.tohero.application.baseResponse.BaseResponse; +import com.neighbors.tohero.application.sharing.service.SharingService; +import com.neighbors.tohero.common.jwt.JwtUserDetails; +import io.swagger.v3.oas.annotations.Parameter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/sharing") +public class SharingController { + + private final SharingService sharingService; + + public ResponseEntity getRecommenderCode( + @Parameter(hidden=true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail + ){ + return ResponseEntity.ok() + .body(sharingService.getRecommenderCode(jwtUserDetail.getUserId())); + } + +} From dca0ce3005479741fa18bdc0c6a587286be8a81d Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Wed, 22 Jan 2025 15:10:44 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat=20:=20=EC=B6=94=EC=B2=9C=EC=9D=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=83=9D=EC=84=B1=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20entity,=20domain=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baseResponse/BaseResponseMessage.java | 5 ++- .../dto/GetRecommenderCodeResponse.java | 4 ++- .../sharing/service/SharingService.java | 33 +++++++++++++++++-- .../tohero/domain/domain/user/model/User.java | 10 ++++-- .../infrastructure/entity/UserEntity.java | 10 +++++- .../infrastructure/mapper/UserMapper.java | 3 +- .../controller/SharingController.java | 2 +- 7 files changed, 58 insertions(+), 9 deletions(-) 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 d04ab71..d1a98a1 100644 --- a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java +++ b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java @@ -53,7 +53,10 @@ public enum BaseResponseMessage { //news 뉴스_조회가_성공했습니다("뉴스 조회가 성공했습니다"), - 뉴스_조회가_실패했습니다("뉴스 조회가 실패했습니다"); + 뉴스_조회가_실패했습니다("뉴스 조회가 실패했습니다"), + + //sharing + 추천인_코드_생성이_정상실행_되었습니다("추천인 코드 생성이 정상실행 되었습니다"); private final String message; diff --git a/src/main/java/com/neighbors/tohero/application/sharing/dto/GetRecommenderCodeResponse.java b/src/main/java/com/neighbors/tohero/application/sharing/dto/GetRecommenderCodeResponse.java index 0e8d30a..3746741 100644 --- a/src/main/java/com/neighbors/tohero/application/sharing/dto/GetRecommenderCodeResponse.java +++ b/src/main/java/com/neighbors/tohero/application/sharing/dto/GetRecommenderCodeResponse.java @@ -1,4 +1,6 @@ package com.neighbors.tohero.application.sharing.dto; -public record GetRecommenderCodeResponse() { +public record GetRecommenderCodeResponse( + String recommenderCode +) { } diff --git a/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java index f79531f..a3b880f 100644 --- a/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java +++ b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java @@ -1,16 +1,45 @@ package com.neighbors.tohero.application.sharing.service; 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.sharing.dto.GetRecommenderCodeResponse; +import com.neighbors.tohero.domain.domain.user.model.User; +import com.neighbors.tohero.domain.domain.user.service.GetUser; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.Arrays; +import java.util.List; + @Service @RequiredArgsConstructor public class SharingService { - public BaseResponse getRecommenderCode(long userId){ - return null; + private final GetUser getUser; + + public BaseResponse getRecommenderCode(String userEmail){ + User user = getUser.getUserByEmail(userEmail); + + String recommenderCode = createRecommenderCode(user); + + return new BaseResponse<>( + BaseResponseStatus.OK, + BaseResponseMessage.추천인_코드_생성이_정상실행_되었습니다.getMessage(), + new GetRecommenderCodeResponse(recommenderCode) + ); + } + + private String createRecommenderCode(User user){ + String recommenderEmailsDividedBySlash = user.getRecommenders(); + List recommenderEmails = Arrays.stream(recommenderEmailsDividedBySlash.split("/")).toList(); + recommenderEmails.add(user.getEmail()); + + if (recommenderEmails.size() > 5) { + recommenderEmails.remove(0); + } + + return String.join("/", recommenderEmails); } } 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 index e827cae..bfe2c5c 100644 --- 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 @@ -14,9 +14,10 @@ public class User { private String userName; private String email; private Role role; + private String recommenders; - public static User of (Long userId, String userName, String email, Role role) { - return new User(userId, userName, email, role); + public static User of (Long userId, String userName, String email, Role role, String recommenders) { + return new User(userId, userName, email, role, recommenders); } public static User toEntity(AuthenticateUserRequest authenticateUserRequest) { @@ -26,4 +27,9 @@ public static User toEntity(AuthenticateUserRequest authenticateUserRequest) { .role(authenticateUserRequest.role()) .build(); } + + public String getRecommenders() { + if(recommenders == null) return ""; + return recommenders; + } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java b/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java index 2c8a9fc..d7344bc 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java @@ -26,6 +26,9 @@ public class UserEntity extends BaseEntity { @Column(name = "role", nullable = false) private Role role; + @Column(name = "recommenders", nullable = false) + private String recommenders; + public UserEntity() { } @@ -44,6 +47,11 @@ public static UserEntity returnNewObjectOf(String nickName, String email, Role r } public static UserEntity from(User user) { - return new UserEntity(user.getUserId(), user.getUserName(), user.getEmail(), user.getRole()); + return new UserEntity(user.getUserId(), user.getUserName(), user.getEmail(), user.getRole(),user.getRecommenders()); + } + + public String getRecommenders() { + if(recommenders == null) return ""; + return recommenders; } } 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 6f227d0..f877454 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java @@ -24,7 +24,8 @@ public User toDomain(UserEntity userEntity){ userEntity.getUserId(), userEntity.getNickName(), userEntity.getEmail(), - userEntity.getRole() + userEntity.getRole(), + userEntity.getRecommenders() ); } } diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java index 6626165..f2f42e0 100644 --- a/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java +++ b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java @@ -21,7 +21,7 @@ public ResponseEntity getRecommenderCode( @Parameter(hidden=true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail ){ return ResponseEntity.ok() - .body(sharingService.getRecommenderCode(jwtUserDetail.getUserId())); + .body(sharingService.getRecommenderCode(jwtUserDetail.getEmail())); } } From 5cd37e540ba78d9a2e6437c69f8740b7faa03092 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Wed, 22 Jan 2025 15:38:08 +0900 Subject: [PATCH 3/5] =?UTF-8?q?hotfix=20:=20DB=20=EC=B6=94=EC=B2=9C?= =?UTF-8?q?=EC=9D=B8=20null=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tohero/application/sharing/service/SharingService.java | 6 ++++-- .../neighbors/tohero/infrastructure/entity/UserEntity.java | 2 +- .../tohero/presentation/controller/SharingController.java | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java index a3b880f..e47b741 100644 --- a/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java +++ b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java @@ -32,14 +32,16 @@ public BaseResponse getRecommenderCode(String userEm private String createRecommenderCode(User user){ String recommenderEmailsDividedBySlash = user.getRecommenders(); - List recommenderEmails = Arrays.stream(recommenderEmailsDividedBySlash.split("/")).toList(); + List recommenderEmails = new java.util.ArrayList<>(List.of(recommenderEmailsDividedBySlash.split("/"))); recommenderEmails.add(user.getEmail()); if (recommenderEmails.size() > 5) { recommenderEmails.remove(0); } - return String.join("/", recommenderEmails); + return String + .join("/", recommenderEmails) + .replaceAll("^/+", ""); } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java b/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java index d7344bc..bba8124 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java @@ -26,7 +26,7 @@ public class UserEntity extends BaseEntity { @Column(name = "role", nullable = false) private Role role; - @Column(name = "recommenders", nullable = false) + @Column(name = "recommenders", nullable = true) private String recommenders; public UserEntity() { diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java index f2f42e0..44cda52 100644 --- a/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java +++ b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java @@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor; 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.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -17,6 +18,7 @@ public class SharingController { private final SharingService sharingService; + @GetMapping("/recommenderCode") public ResponseEntity getRecommenderCode( @Parameter(hidden=true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail ){ From 8cf2e3341d05e1b691138fdd541f2e28f792bf49 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Wed, 22 Jan 2025 15:47:16 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat=20:=20=EC=B6=94=EC=B2=9C=EC=9D=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EB=A5=BC=20jwt=20token=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sharing/service/SharingService.java | 9 ++++--- .../tohero/common/jwt/JwtProvider.java | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java index e47b741..57818cc 100644 --- a/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java +++ b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java @@ -4,12 +4,12 @@ import com.neighbors.tohero.application.baseResponse.BaseResponseMessage; import com.neighbors.tohero.application.baseResponse.BaseResponseStatus; import com.neighbors.tohero.application.sharing.dto.GetRecommenderCodeResponse; +import com.neighbors.tohero.common.jwt.JwtProvider; import com.neighbors.tohero.domain.domain.user.model.User; import com.neighbors.tohero.domain.domain.user.service.GetUser; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.Arrays; import java.util.List; @Service @@ -17,6 +17,7 @@ public class SharingService { private final GetUser getUser; + private final JwtProvider jwtProvider; public BaseResponse getRecommenderCode(String userEmail){ User user = getUser.getUserByEmail(userEmail); @@ -39,9 +40,11 @@ private String createRecommenderCode(User user){ recommenderEmails.remove(0); } - return String - .join("/", recommenderEmails) + String recommenderEmailsWithUserEmailDividedBySlash = + String.join("/", recommenderEmails) .replaceAll("^/+", ""); + + return jwtProvider.createRecommenderCode(user.getEmail(), recommenderEmailsWithUserEmailDividedBySlash); } } 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 9069bb0..3a4d8a9 100644 --- a/src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java +++ b/src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java @@ -60,6 +60,25 @@ public AuthTokens createToken(JwtUserDetails jwtUserDetails) { return AuthTokens.of(accessToken, refreshToken, JWT_EXPIRED_IN, REFRESH_TOKEN_EXPIRED_IN); } + public String createRecommenderCode(String userEmail, String recommenderEmails){ + Claims claims = Jwts.claims() + .setSubject(userEmail) + .setIssuer("ToHero"); + + Date now = new Date(); + claims.put("recommenderEmails", recommenderEmails); + claims.put("issueTime", now); + + Date accessTokenExpiredAt = new Date(now.getTime() + JWT_EXPIRED_IN); + + return Jwts.builder() + .setClaims(claims) + .setIssuedAt(now) + .setExpiration(accessTokenExpiredAt) + .signWith(SignatureAlgorithm.HS256, JWT_SECRET_KEY) + .compact(); + } + public boolean isExpiredToken(String token) throws JwtInvalidTokenException { log.info("[JwtTokenProvider.isExpiredToken] token={}", token); try { @@ -132,6 +151,11 @@ public JwtUserDetails getJwtUserDetails(String token) { } + public String getRecommenderEmails(String token) { + Claims claims = getBody(token); + return claims.get("recommenderEmails").toString(); + } + public JwtUserDetails getGuestJwtUserDetails(String token) { Claims claims = getBody(token); From 0e7406158f4dc0cca08ce8a24f59b15381eae5f7 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Wed, 22 Jan 2025 15:49:15 +0900 Subject: [PATCH 5/5] =?UTF-8?q?docs=20:=20=EA=B3=B5=EC=9C=A0=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20API=20swagger=20=EC=84=A4=EB=AA=85=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 --- .../tohero/presentation/controller/SharingController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java index 44cda52..b675430 100644 --- a/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java +++ b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java @@ -3,6 +3,7 @@ import com.neighbors.tohero.application.baseResponse.BaseResponse; import com.neighbors.tohero.application.sharing.service.SharingService; import com.neighbors.tohero.common.jwt.JwtUserDetails; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -18,6 +19,7 @@ public class SharingController { private final SharingService sharingService; + @Operation(summary = "공유하기 API", description = "공유하기 메시지보낼 때 사용할 추천인 코드를 생성해주는 API입니다.") @GetMapping("/recommenderCode") public ResponseEntity getRecommenderCode( @Parameter(hidden=true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail