Skip to content

Commit

Permalink
Merge branch 'develop' into feature/f-lab-edu#61-swagger
Browse files Browse the repository at this point in the history
  • Loading branch information
donsonioc2010 committed Oct 21, 2022
2 parents 846bf97 + 1ae8b07 commit e86dd49
Show file tree
Hide file tree
Showing 16 changed files with 283 additions and 146 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@

import com.nooblol.global.exception.ExceptionMessage;
import com.nooblol.global.utils.SessionUtils;
import com.nooblol.user.utils.LetterConstants;
import java.util.Arrays;
import com.nooblol.user.utils.LetterType;
import javax.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
Expand Down Expand Up @@ -36,8 +35,7 @@ public void letterTypeValidation(JoinPoint jp, String type) throws Throwable {
}

private boolean typeValid(String type) {
return Arrays.stream(LetterConstants.LETTER_DELETE_TYPE_ARR)
.anyMatch(constantType -> constantType.equals(type));
return LetterType.isExistsType(type);
}

private String getSessionInUserId(JoinPoint jp) {
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/com/nooblol/global/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.nooblol.global.config;

import com.nooblol.global.utils.enumhandle.EnumConvertFactoryUtils;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {

@Override
protected void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new EnumConvertFactoryUtils());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.nooblol.global.utils.enumhandle;


import java.util.Arrays;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;

/**
* 소문자로 EnumType이 들어오는 경우 대문자로 치환해서 타입을 전달해 주기 위한 셋팅
* <p>
* Reference : https://kapentaz.github.io/java/spring/Enum-and-@RequestParam-in-Spring/#
*/
public class EnumConvertFactoryUtils implements
ConverterFactory<String, Enum<? extends EnumConvertUtils>> {

@Override
public <T extends Enum<? extends EnumConvertUtils>> Converter<String, T> getConverter(
Class<T> targetType) {
return new StringToEnumConvertUtils<>(targetType);
}

private static final class StringToEnumConvertUtils<T extends Enum<? extends EnumConvertUtils>> implements
Converter<String, T> {

private final Class<T> enumType;
private final boolean constantEnum;

public StringToEnumConvertUtils(Class<T> enumType) {
this.enumType = enumType;
this.constantEnum = Arrays.stream(enumType.getInterfaces())
.anyMatch(i -> i == EnumConvertUtils.class);
}

@Override
public T convert(String source) {
if (source.isEmpty()) {
return null;
}

source = source.toUpperCase();

T[] constants = enumType.getEnumConstants();
for (T c : constants) {
if (constantEnum && c.name().equals(source.trim())) {
return c;
}
}
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.nooblol.global.utils.enumhandle;

public interface EnumConvertUtils {

}
20 changes: 15 additions & 5 deletions src/main/java/com/nooblol/user/controller/LetterController.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import com.nooblol.user.dto.LetterSearchDto;
import com.nooblol.user.service.LetterService;
import com.nooblol.user.utils.LetterConstants;
import com.nooblol.user.utils.LetterStatus;
import com.nooblol.user.utils.LetterType;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
Expand Down Expand Up @@ -73,13 +75,13 @@ public ResponseDto getLetter(
@LetterTypeValidation
@GetMapping("/list/{type}")
public ResponseDto getLetterToList(
@PathVariable String type,
@PathVariable LetterType type,
@RequestParam(value = "page", required = false, defaultValue = "0") int pageNum,
@RequestParam(value = "limit", required = false, defaultValue = "30") int limitNum,
HttpSession session
) {
LetterSearchDto searchParameterDto = makeLetterListSearchDto(
SessionUtils.getSessionUserId(session), pageNum, limitNum, type.toUpperCase()
SessionUtils.getSessionUserId(session), pageNum, limitNum, type
);

//Data 가 Null인경우 CommonUtils에선 NotFound로 보내버려서 직접 설정함.
Expand Down Expand Up @@ -115,7 +117,7 @@ public ResponseDto insertLetter(
@LetterTypeValidation
@DeleteMapping("/{type}/{letterId}")
public ResponseDto deleteLetter(
@PathVariable @NotBlank(message = LetterConstants.LETTER_TYPE_NULL) String type,
@PathVariable @NotBlank(message = LetterConstants.LETTER_TYPE_NULL) LetterType type,
@PathVariable @NotNull(message = LetterConstants.LETTER_ID_NULL) int letterId,
HttpSession session
) {
Expand All @@ -139,11 +141,19 @@ public ResponseDto deleteLetter(
* @return
*/
private LetterSearchDto makeLetterListSearchDto(
String userId, int pageNum, int limitNum, String type
String userId, int pageNum, int limitNum, LetterType type
) {
String searchListStr = "";
for (int i = 0; i < LetterStatus.SEARCH_STATUS_ARR.length; i++) {
searchListStr += "\'" + LetterStatus.SEARCH_STATUS_ARR[i] + "\'";
if (i != LetterStatus.SEARCH_STATUS_ARR.length - 1) {
searchListStr += ",";
}
}

return LetterSearchDto.builder()
.userId(userId)
.statusArr(LetterConstants.LETTER_LIST_SEARCH_STATUS_ARR)
.statusArr(searchListStr)
.pageNum(pageNum * limitNum)
.limitNum(limitNum)
.letterType(type)
Expand Down
8 changes: 5 additions & 3 deletions src/main/java/com/nooblol/user/dto/LetterDto.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.nooblol.user.dto;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.nooblol.user.utils.LetterStatus;
import com.nooblol.user.utils.LetterType;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand All @@ -24,13 +26,13 @@ public class LetterDto {

private String toUserId;

private int toStatus;
private LetterStatus toStatus;

private String fromUserId;

private int fromStatus;
private LetterStatus fromStatus;

private LocalDateTime createdAt;

private String type;
private LetterType type;
}
5 changes: 3 additions & 2 deletions src/main/java/com/nooblol/user/dto/LetterSearchDto.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.nooblol.user.dto;

import com.nooblol.user.utils.LetterType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -15,11 +16,11 @@ public class LetterSearchDto {

private String userId;

private int[] statusArr;
private String statusArr;

private int pageNum;

private int limitNum;

private String letterType;
private LetterType letterType;
}
89 changes: 53 additions & 36 deletions src/main/java/com/nooblol/user/service/impl/LetterServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@
import com.nooblol.user.mapper.LetterMapper;
import com.nooblol.user.service.LetterService;
import com.nooblol.user.service.UserInfoService;
import com.nooblol.user.utils.LetterConstants;
import com.nooblol.user.utils.LetterStatus;
import com.nooblol.user.utils.LetterType;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import javax.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -38,43 +36,31 @@ public LetterDto getLetter(int letterId, HttpSession session) {
throw new IllegalArgumentException(ExceptionMessage.NO_DATA);
}

if (!ObjectUtils.isEmpty(letterDto) &&
!(letterReqUserId.equals(letterDto.getToUserId()) ||
letterReqUserId.equals(letterDto.getFromUserId()))
) {
if (!isHaveGetLetterAuth(letterDto, letterReqUserId)) {
throw new IllegalArgumentException(ExceptionMessage.FORBIDDEN);
}

//발송자인 경우에는 먼저 return
if (letterReqUserId.equals(letterDto.getFromUserId())) {
if (isReqUserLetterTypeFrom(letterDto, letterReqUserId)) {
return letterDto;
}
//수신자의 경우 읽지 않았으면 Update
if (letterDto.getToStatus() == LetterConstants.LETTER_STATUS_UNREAD) {
letterDto.setToStatus(LetterConstants.LETTER_STATUS_READ);
updateLetterStatus(
letterDto.getLetterId(),
LetterConstants.LETTER_STATUS_READ,
LetterConstants.LETTER_TYPE_TO,
session
);
if (LetterStatus.UNREAD.equals(letterDto.getToStatus())) {
letterDto.setToStatus(LetterStatus.READ);
updateLetterStatus(letterDto.getLetterId(), LetterStatus.READ, LetterType.TO, session);
}

return letterDto;
}

@Override
public List<LetterDto> getLetterListByUserId(LetterSearchDto letterSearchDto) {
if (LetterConstants.LETTER_TYPE_TO.equals(letterSearchDto.getLetterType())) {
return Optional.ofNullable(
letterMapper.selectLetterListByUserIdAndTypeTo(letterSearchDto)
).orElse(new ArrayList<LetterDto>());
if (LetterType.TO.equals(letterSearchDto.getLetterType())) {
return letterMapper.selectLetterListByUserIdAndTypeTo(letterSearchDto);
}

if (LetterConstants.LETTER_TYPE_FROM.equals(letterSearchDto.getLetterType())) {
return Optional.ofNullable(
letterMapper.selectLetterListByUserIdAndTypeFrom(letterSearchDto)
).orElse(new ArrayList<LetterDto>());
if (LetterType.FROM.equals(letterSearchDto.getLetterType())) {
return letterMapper.selectLetterListByUserIdAndTypeFrom(letterSearchDto);
}

throw new IllegalArgumentException(ExceptionMessage.BAD_REQUEST);
Expand All @@ -88,19 +74,17 @@ public boolean insertLetter(LetterInsertRequestDto requestDto, HttpSession sessi
}

//실제 수신자가 존재하지 않는지 여부 확인
if (Optional
.ofNullable(userInfoService.selectUserInfoByUserId(requestDto.getToUserId()))
.isEmpty()) {
if (ObjectUtils.isEmpty(userInfoService.selectUserInfoByUserId(requestDto.getToUserId()))) {
throw new IllegalArgumentException(ExceptionMessage.NOT_FOUND);
}

LetterDto insertLetter = LetterDto.builder()
.letterTitle(requestDto.getLetterTitle())
.letterContent(requestDto.getLetterContent())
.toUserId(requestDto.getToUserId())
.toStatus(LetterConstants.LETTER_STATUS_UNREAD)
.toStatus(LetterStatus.UNREAD)
.fromUserId(fromUserId)
.fromStatus(LetterConstants.LETTER_STATUS_READ)
.fromStatus(LetterStatus.READ)
.createdAt(LocalDateTime.now())
.build();

Expand All @@ -111,7 +95,7 @@ public boolean insertLetter(LetterInsertRequestDto requestDto, HttpSession sessi
public boolean deleteLetter(LetterDto letterDto, HttpSession session) {
return updateLetterStatus(
letterDto.getLetterId(),
LetterConstants.LETTER_STATUS_DELETE,
LetterStatus.DELETE,
letterDto.getType(),
session
);
Expand All @@ -127,11 +111,9 @@ public boolean deleteLetter(LetterDto letterDto, HttpSession session) {
* @return
*/
private boolean updateLetterStatus(
int letterId, int status, String letterType, HttpSession session
int letterId, LetterStatus status, LetterType letterType, HttpSession session
) {
letterType = letterType.toUpperCase();

if (LetterConstants.LETTER_TYPE_TO.equals(letterType)) {
if (LetterType.TO.equals(letterType)) {
return letterMapper.updateLetterToStatusByLetterIdAndToUserId(
LetterDto.builder()
.letterId(letterId)
Expand All @@ -141,7 +123,7 @@ private boolean updateLetterStatus(
) > 0;
}

if (LetterConstants.LETTER_TYPE_FROM.equals(letterType)) {
if (LetterType.FROM.equals(letterType)) {
return letterMapper.updateLetterFromStatusByLetterIdAndFromUserId(
LetterDto.builder()
.letterId(letterId)
Expand All @@ -154,4 +136,39 @@ private boolean updateLetterStatus(
//LetterConstants에 없는 Type(수신 또는 발신이 아닌경우) Exception
throw new IllegalArgumentException(ExceptionMessage.BAD_REQUEST);
}


/**
* 해당 쪽지가 발송자 또는 수신자인지 여부 확인
*
* @param letterDto
* @param reqUserId
* @return
*/
private boolean isHaveGetLetterAuth(LetterDto letterDto, String reqUserId) {
return isReqUserLetterTypeTo(letterDto, reqUserId) ||
isReqUserLetterTypeFrom(letterDto, reqUserId);
}

/**
* 요청자가 쪽지의 수신자가 맞는지 확인
*
* @param letterDto
* @param reqUserId
* @return
*/
private boolean isReqUserLetterTypeTo(LetterDto letterDto, String reqUserId) {
return reqUserId.equals(letterDto.getToUserId());
}

/**
* 요청자가 쪽지의 발송자가 맞는지 확인
*
* @param letterDto
* @param reqUserId
* @return
*/
private boolean isReqUserLetterTypeFrom(LetterDto letterDto, String reqUserId) {
return reqUserId.equals(letterDto.getFromUserId());
}
}
26 changes: 4 additions & 22 deletions src/main/java/com/nooblol/user/utils/LetterConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,32 +6,14 @@ private LetterConstants() {
}

public static final String LETTER_ID_NULL = "쪽지의 ID값이 입력되지 않았습니다.";

public static final String LETTER_TITLE_NULL = "제목이 입력되지 않았습니다.";

public static final String LETTER_CONTENT_NULL = "내용이 입력되지 않았습니다.";

public static final String LETTER_TO_USER_ID_NULL = "받는 사용자의 ID가 입력되지 않았습니다.";

public static final String LETTER_TYPE_NULL = "쪽지의 타입이 발송자인지, 수신자인지가 입력되지 않았습니다.";

public static final String LETTER_USER_ID_NULL = "사용자 ID가 입력되지 않았습니다.";

//Delete Type
public static final String LETTER_TYPE_FROM = "FROM"; //발송자
public static final String LETTER_TYPE_TO = "TO"; //수신자
public static final String[] LETTER_DELETE_TYPE_ARR = {
LETTER_TYPE_FROM, LETTER_TYPE_TO
};


//ToStatus, FromStatus Value
public static final int LETTER_STATUS_READ = 1;
public static final int LETTER_STATUS_UNREAD = 2;
public static final int LETTER_STATUS_DELETE = 9;

public static final int[] LETTER_LIST_SEARCH_STATUS_ARR = {
LETTER_STATUS_READ, LETTER_STATUS_UNREAD
};

public static final int[] LETTER_LIST_STATUS_ALL_ARR = {
LETTER_STATUS_READ, LETTER_STATUS_UNREAD, LETTER_STATUS_DELETE
};

}
Loading

0 comments on commit e86dd49

Please sign in to comment.