Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,10 @@ public enum BaseResponseMessage {

//news
뉴스_조회가_성공했습니다("뉴스 조회가 성공했습니다"),
뉴스_조회가_실패했습니다("뉴스 조회가 실패했습니다");
뉴스_조회가_실패했습니다("뉴스 조회가 실패했습니다"),

//sharing
추천인_코드_생성이_정상실행_되었습니다("추천인 코드 생성이 정상실행 되었습니다");

private final String message;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.neighbors.tohero.application.sharing.dto;

public record GetRecommenderCodeResponse(
String recommenderCode
) {
}
Original file line number Diff line number Diff line change
@@ -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<GetRecommenderCodeResponse> 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<String> 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);
}

}
24 changes: 24 additions & 0 deletions src/main/java/com/neighbors/tohero/common/jwt/JwtProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -26,4 +27,9 @@ public static User toEntity(AuthenticateUserRequest authenticateUserRequest) {
.role(authenticateUserRequest.role())
.build();
}

public String getRecommenders() {
if(recommenders == null) return "";
return recommenders;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
}

Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public User toDomain(UserEntity userEntity){
userEntity.getUserId(),
userEntity.getNickName(),
userEntity.getEmail(),
userEntity.getRole()
userEntity.getRole(),
userEntity.getRecommenders()
);
}
}
Original file line number Diff line number Diff line change
@@ -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<BaseResponse> getRecommenderCode(
@Parameter(hidden=true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail
){
return ResponseEntity.ok()
.body(sharingService.getRecommenderCode(jwtUserDetail.getEmail()));
}

}
Loading