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 new file mode 100644 index 0000000..3746741 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/sharing/dto/GetRecommenderCodeResponse.java @@ -0,0 +1,6 @@ +package com.neighbors.tohero.application.sharing.dto; + +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 new file mode 100644 index 0000000..57818cc --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java @@ -0,0 +1,50 @@ +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.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.List; + +@Service +@RequiredArgsConstructor +public class SharingService { + + private final GetUser getUser; + private final JwtProvider jwtProvider; + + 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 = new java.util.ArrayList<>(List.of(recommenderEmailsDividedBySlash.split("/"))); + recommenderEmails.add(user.getEmail()); + + if (recommenderEmails.size() > 5) { + recommenderEmails.remove(0); + } + + 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); 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..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,6 +26,9 @@ public class UserEntity extends BaseEntity { @Column(name = "role", nullable = false) private Role role; + @Column(name = "recommenders", nullable = true) + 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 new file mode 100644 index 0000000..b675430 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java @@ -0,0 +1,31 @@ +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.Operation; +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.GetMapping; +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; + + @Operation(summary = "공유하기 API", description = "공유하기 메시지보낼 때 사용할 추천인 코드를 생성해주는 API입니다.") + @GetMapping("/recommenderCode") + public ResponseEntity getRecommenderCode( + @Parameter(hidden=true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail + ){ + return ResponseEntity.ok() + .body(sharingService.getRecommenderCode(jwtUserDetail.getEmail())); + } + +}