diff --git a/src/main/java/life/mosu/mosuserver/domain/examapplication/repository/ExamApplicationJpaRepository.java b/src/main/java/life/mosu/mosuserver/domain/examapplication/repository/ExamApplicationJpaRepository.java index 24f394f2..a4699c70 100644 --- a/src/main/java/life/mosu/mosuserver/domain/examapplication/repository/ExamApplicationJpaRepository.java +++ b/src/main/java/life/mosu/mosuserver/domain/examapplication/repository/ExamApplicationJpaRepository.java @@ -89,9 +89,9 @@ Optional findExamTicketInfoProjectionById( FROM ExamApplicationJpaEntity ea JOIN PaymentJpaEntity p ON p.examApplicationId = ea.id LEFT JOIN RefundJpaEntity r ON r.examApplicationId = ea.id - WHERE p.paymentStatus = 'DONE' - AND (r IS NULL OR r.refundStatus = 'DONE') + WHERE (p.paymentStatus = 'DONE' OR r.refundStatus = 'DONE') AND ea.applicationId IN :applicationIds + AND ea.deleted = false """) List findByApplicationIdIn(List applicationIds); diff --git a/src/main/java/life/mosu/mosuserver/global/util/IpUtil.java b/src/main/java/life/mosu/mosuserver/global/util/IpUtil.java index 7a62b56c..2c87a4e3 100644 --- a/src/main/java/life/mosu/mosuserver/global/util/IpUtil.java +++ b/src/main/java/life/mosu/mosuserver/global/util/IpUtil.java @@ -1,48 +1,62 @@ package life.mosu.mosuserver.global.util; import jakarta.servlet.http.HttpServletRequest; -import java.net.InetAddress; -import java.net.UnknownHostException; +import java.util.List; +import java.util.Arrays; +import java.util.stream.Stream; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.experimental.UtilityClass; @UtilityClass public class IpUtil { - public static String getClientIp(HttpServletRequest request) throws UnknownHostException { - String ip = request.getHeader("X-Forwarded-For"); + private static final List IP_HEADERS = Arrays.asList( + "X-Forwarded-For", + "Proxy-Client-IP", + "WL-Proxy-Client-IP", + "HTTP_CLIENT_IP", + "HTTP_X_FORWARDED_FOR", + "X-Real-IP" + ); + + public static String getClientIp(HttpServletRequest request) { + String ip = IP_HEADERS.stream() + .map(request::getHeader) + .filter(IpUtil::isValidIp) + .findFirst() + .orElse(request.getRemoteAddr()); + + String proxiedIp = resolveProxiedIp(ip); + return Loopback.resolve(proxiedIp); + } + private static String resolveProxiedIp(String ip) { if (ip != null && ip.contains(",")) { - ip = ip.split(",")[0].trim(); + return ip.split(",")[0].trim(); } + return ip; + } - if (isInvalidIp(ip)) { - ip = request.getHeader("Proxy-Client-IP"); - } - if (isInvalidIp(ip)) { - ip = request.getHeader("WL-Proxy-Client-IP"); - } - if (isInvalidIp(ip)) { - ip = request.getHeader("HTTP_CLIENT_IP"); - } - if (isInvalidIp(ip)) { - ip = request.getHeader("HTTP_X_FORWARDED_FOR"); - } - if (isInvalidIp(ip)) { - ip = request.getHeader("X-Real-IP"); - } - if (isInvalidIp(ip)) { - ip = request.getRemoteAddr(); - } + private static boolean isValidIp(String ip) { + return ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip); + } - if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) { - InetAddress inetAddress = InetAddress.getLocalHost(); - ip = inetAddress.getHostName() + "/" + inetAddress.getHostAddress(); - } + @RequiredArgsConstructor + @Getter + private enum Loopback { + V4("127.0.0.1"), + V6("0:0:0:0:0:0:0:1"); - return ip; - } + private final String address; - private static boolean isInvalidIp(String ip) { - return ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip); + public static boolean isLoopback(String ip) { + return Arrays.stream(Loopback.values()) + .anyMatch(loopback -> loopback.getAddress().equals(ip)); + } + public static String resolve(String ip) { + return isLoopback(ip) ? "localhost" : ip; + } } } \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/presentation/inquiry/dto/InquiryCreateRequest.java b/src/main/java/life/mosu/mosuserver/presentation/inquiry/dto/InquiryCreateRequest.java index d3b4a7ba..35f2109b 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/inquiry/dto/InquiryCreateRequest.java +++ b/src/main/java/life/mosu/mosuserver/presentation/inquiry/dto/InquiryCreateRequest.java @@ -17,6 +17,8 @@ public record InquiryCreateRequest( @Size(max = 1000, message = "본문은 최대 1000자까지 입력 가능합니다.") @Schema(description = "문의 내용", example = "포인트는 어떻게 사용하나요?") @NotNull String content, + + @Size(max = 3, message = "첨부파일은 최대 3개까지 첨부할 수 있습니다.") List attachments ) {