From 14798b8cbd925651a3c982cc20057a42f210ac1d Mon Sep 17 00:00:00 2001 From: Rinjae Date: Thu, 30 Jul 2026 19:47:23 +0900 Subject: [PATCH] =?UTF-8?q?Q&A/=EC=A0=9C=ED=9C=B4/=EB=AC=B8=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20-=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?=EB=8B=A8=EC=88=9C=ED=99=94=20-=20API=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20GW=20=EC=B2=98=EB=A6=AC=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EA=B4=80=EB=A0=A8=20DB=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../portal/apprequest/entity/AppRequest.java | 5 ++ .../DjbApistatusIncidentApiRepository.java | 7 +++ .../DjbApistatusIncidentRepository.java | 29 +++++++++ ...jbApistatusIncidentTimelineRepository.java | 6 ++ .../event/PartnershipCreatedEvent.java | 60 ------------------ .../qna/event/InquiryCommentCreatedEvent.java | 56 ----------------- .../portal/qna/event/InquiryCreatedEvent.java | 63 ------------------- 7 files changed, 47 insertions(+), 179 deletions(-) delete mode 100644 src/main/java/com/eactive/apim/portal/partnership/event/PartnershipCreatedEvent.java delete mode 100644 src/main/java/com/eactive/apim/portal/qna/event/InquiryCommentCreatedEvent.java delete mode 100644 src/main/java/com/eactive/apim/portal/qna/event/InquiryCreatedEvent.java diff --git a/src/main/java/com/eactive/apim/portal/apprequest/entity/AppRequest.java b/src/main/java/com/eactive/apim/portal/apprequest/entity/AppRequest.java index 0150efe..f96b732 100644 --- a/src/main/java/com/eactive/apim/portal/apprequest/entity/AppRequest.java +++ b/src/main/java/com/eactive/apim/portal/apprequest/entity/AppRequest.java @@ -68,6 +68,11 @@ public class AppRequest implements com.eactive.eai.data.Data { @Column(name = "reason") private String reason; + //DELETE 승인 시 admin 이 선택한 GW 처리방식. null=차단(BLOCK)과 동일 + @Enumerated(EnumType.STRING) + @Column(name = "gw_action", length = 10) + private GwAction gwAction; + @Column(name = "app_description", length = 500) private String appDescription; diff --git a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentApiRepository.java b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentApiRepository.java index ef65543..9482594 100644 --- a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentApiRepository.java +++ b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentApiRepository.java @@ -6,6 +6,7 @@ import com.eactive.eai.rms.data.EMSDataSource; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Collection; import java.util.List; @Repository @@ -15,5 +16,11 @@ public interface DjbApistatusIncidentApiRepository List findByIncidentIdOrderByApiId(Long incidentId); + List findByIncidentIdInOrderByIncidentIdAscApiIdAsc(Collection incidentIds); + + List findByApiIdInAndRecoveredAtIsNull(Collection apiIds); + + long countByIncidentIdAndRecoveredAtIsNull(Long incidentId); + void deleteByIncidentId(Long incidentId); } diff --git a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentRepository.java b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentRepository.java index 0e15ec7..92796c2 100644 --- a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentRepository.java +++ b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentRepository.java @@ -1,11 +1,17 @@ package com.eactive.apim.portal.djb.apistatus.incident.repository; import com.eactive.apim.portal.djb.apistatus.incident.entity.DjbApistatusIncident; +import com.eactive.apim.portal.djb.apistatus.incident.entity.IncidentKind; +import com.eactive.apim.portal.djb.apistatus.incident.entity.IncidentState; import com.eactive.eai.rms.data.EMSDataSource; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.Collection; +import java.util.List; import java.util.Optional; @Repository @@ -14,4 +20,27 @@ public interface DjbApistatusIncidentRepository extends JpaRepository, JpaSpecificationExecutor { Optional findByNoticeId(String noticeId); + + Optional findByInterfaceId(String interfaceId); + + List findByKindAndStateNotInOrderByStartedAtDesc( + IncidentKind kind, Collection excludedStates); + + /** + * 특정 API 들에 영향을 주는 미종결 장애. 자동 탐지 시 기존 장애 병합 대상 판별용. + * + *

{@code detectedBy} 로 등록 주체를 한정한다. 자동 탐지는 자동 등록 건에만 영향 API 를 덧붙여야 + * 관리자가 직접 작성한 장애 공지의 내용이 바뀌지 않는다.

+ */ + @Query("SELECT DISTINCT i FROM DjbApistatusIncident i, DjbApistatusIncidentApi a" + + " WHERE a.incidentId = i.incidentId" + + " AND i.kind = :kind" + + " AND i.detectedBy = :detectedBy" + + " AND i.state NOT IN :excludedStates" + + " AND a.apiId IN :apiIds" + + " ORDER BY i.startedAt DESC") + List findOpenByApiIds(@Param("kind") IncidentKind kind, + @Param("detectedBy") String detectedBy, + @Param("excludedStates") Collection excludedStates, + @Param("apiIds") Collection apiIds); } diff --git a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentTimelineRepository.java b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentTimelineRepository.java index ca8dbe4..0adde8c 100644 --- a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentTimelineRepository.java +++ b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentTimelineRepository.java @@ -5,6 +5,7 @@ import com.eactive.eai.rms.data.EMSDataSource; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Collection; import java.util.List; @Repository @@ -14,5 +15,10 @@ public interface DjbApistatusIncidentTimelineRepository List findByIncidentIdOrderByEventAtAsc(Long incidentId); + List findByIncidentIdOrderByEventAtDesc(Long incidentId); + + List findByIncidentIdInAndVisibleYnOrderByEventAtDesc( + Collection incidentIds, String visibleYn); + void deleteByIncidentId(Long incidentId); } diff --git a/src/main/java/com/eactive/apim/portal/partnership/event/PartnershipCreatedEvent.java b/src/main/java/com/eactive/apim/portal/partnership/event/PartnershipCreatedEvent.java deleted file mode 100644 index cb8824a..0000000 --- a/src/main/java/com/eactive/apim/portal/partnership/event/PartnershipCreatedEvent.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.eactive.apim.portal.partnership.event; - -import com.eactive.apim.portal.template.entity.MessageCode; -import com.eactive.apim.portal.template.service.MessageEventHandler; -import com.eactive.apim.portal.template.service.MessageRecipient; -import com.eactive.apim.portal.template.service.MessageSendEvent; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component -public class PartnershipCreatedEvent implements MessageEventHandler { - - public static final MessageCode KEY = MessageCode.PARTNERSHIP_CREATED; - - @Override - public boolean allowAdditionalRecipients() { - return true; - } - - @Override - public MessageSendEvent createEvent(Object source, MessageRecipient recipient, Map params) { - Map requestParams = new HashMap<>(); - String subject = toStr(params.get("bizSubject")); - if (subject.isEmpty()) { - subject = toStr(params.get("subject")); - } - requestParams.put("partnershipId", toStr(params.get("partnershipId"))); - requestParams.put("bizSubject", subject); - requestParams.put("subject", subject); - requestParams.put("writerName", toStr(params.get("writerName"))); - return new MessageSendEvent(source, KEY, recipient, requestParams); - } - - private String toStr(Object value) { - return value == null ? "" : value.toString(); - } - - @Override - public MessageCode getKey() { - return KEY; - } - - @Override - public String getDisplayName() { - return "개선요청/제휴 게시물 등록"; - } - - @Override - public String getDescription() { - return "
사용 가능 변수:

" - + "
- userName: 수신자 이름

" - + "
- userId: 수신자 ID (이메일)

" - + "
- partnershipId: 신청 ID

" - + "
- bizSubject: 신청 제목

" - + "
- subject: 신청 제목 (별칭)

" - + "
- writerName: 작성자 이름

"; - } -} diff --git a/src/main/java/com/eactive/apim/portal/qna/event/InquiryCommentCreatedEvent.java b/src/main/java/com/eactive/apim/portal/qna/event/InquiryCommentCreatedEvent.java deleted file mode 100644 index 27f404d..0000000 --- a/src/main/java/com/eactive/apim/portal/qna/event/InquiryCommentCreatedEvent.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.eactive.apim.portal.qna.event; - -import com.eactive.apim.portal.template.entity.MessageCode; -import com.eactive.apim.portal.template.service.MessageEventHandler; -import com.eactive.apim.portal.template.service.MessageRecipient; -import com.eactive.apim.portal.template.service.MessageSendEvent; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component -public class InquiryCommentCreatedEvent implements MessageEventHandler { - - public static final MessageCode KEY = MessageCode.INQUIRY_COMMENT_CREATED; - - @Override - public MessageCode getKey() { - return KEY; - } - - @Override - public boolean allowAdditionalRecipients() { - return true; - } - - @Override - public String getDisplayName() { - return "Q&A 댓글 등록 알림"; - } - - @Override - public String getDescription() { - return "
사용 가능 변수:

" - + "
- userName: 수신자 이름

" - + "
- userId: 수신자 ID

" - + "
- inquiryId: 문의 ID

" - + "
- inquirySubject: 문의 제목

" - + "
- commentContent: 댓글 본문

" - + "
- writerName: 작성자 이름

"; - } - - @Override - public MessageSendEvent createEvent(Object source, MessageRecipient recipient, Map params) { - Map requestParams = new HashMap<>(); - requestParams.put("inquiryId", toStr(params.get("inquiryId"))); - requestParams.put("inquirySubject", toStr(params.get("inquirySubject"))); - requestParams.put("commentContent", toStr(params.get("commentContent"))); - requestParams.put("writerName", toStr(params.get("writerName"))); - return new MessageSendEvent(source, KEY, recipient, requestParams); - } - - private String toStr(Object value) { - return value == null ? "" : value.toString(); - } -} diff --git a/src/main/java/com/eactive/apim/portal/qna/event/InquiryCreatedEvent.java b/src/main/java/com/eactive/apim/portal/qna/event/InquiryCreatedEvent.java deleted file mode 100644 index 908e225..0000000 --- a/src/main/java/com/eactive/apim/portal/qna/event/InquiryCreatedEvent.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.eactive.apim.portal.qna.event; - -import com.eactive.apim.portal.template.entity.MessageCode; -import com.eactive.apim.portal.template.service.MessageEventHandler; -import com.eactive.apim.portal.template.service.MessageRecipient; -import com.eactive.apim.portal.template.service.MessageSendEvent; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component -public class InquiryCreatedEvent implements MessageEventHandler { - // public static final String KEY = "inquiry_created"; - public static final MessageCode KEY = MessageCode.INQUIRY_CREATED; - - - @Override - public boolean allowAdditionalRecipients() { - return true; - } - - @Override - public MessageSendEvent createEvent(Object source, MessageRecipient recipient, Map params) { - Map requestParams = new HashMap<>(); - String subject = toStr(params.get("inquirySubject")); - if (subject.isEmpty()) { - subject = toStr(params.get("subject")); - } - requestParams.put("inquiryId", toStr(params.get("inquiryId"))); - requestParams.put("inquirySubject", subject); - requestParams.put("subject", subject); - requestParams.put("writerName", toStr(params.get("writerName"))); - return new MessageSendEvent(source, KEY, recipient, requestParams); - } - - private String toStr(Object value) { - return value == null ? "" : value.toString(); - } - - @Override - public MessageCode getKey() { - return KEY; - } - - @Override - public String getDisplayName() { - return "QnA 질문 등록"; - } - - @Override - public String getDescription() { - return "
사용 가능 변수:

" - + "
- userName: 수신자 이름

" - + "
- userId: 수신자 ID (이메일)

" - + "
- inquiryId: 질문 ID

" - + "
- inquirySubject: 질문 제목

" - + "
- subject: 질문 제목 (별칭)

" - + "
- writerName: 작성자 이름

"; - } -} - -