feat: 카카오톡 반영
parent
9196e6f3c4
commit
8484377f7a
@ -0,0 +1,77 @@
|
|||||||
|
package cokr.xit.ens.modules.kkotalk.service.event;
|
||||||
|
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.transaction.event.TransactionPhase;
|
||||||
|
import org.springframework.transaction.event.TransactionalEventListener;
|
||||||
|
|
||||||
|
import cokr.xit.ens.core.aop.EnsResponseVO;
|
||||||
|
import cokr.xit.ens.core.exception.code.EnsErrCd;
|
||||||
|
import cokr.xit.ens.modules.kkotalk.service.KkoTalkService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class KkoTalkSendEventListener {
|
||||||
|
private final KkoTalkService kkoTalkService;
|
||||||
|
|
||||||
|
@Order(1)
|
||||||
|
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
|
||||||
|
public void sendRealtime(KkoTalkSendRealtimeEvent event) {
|
||||||
|
event.getSendMastIds().stream()
|
||||||
|
.forEach(sendMastId -> {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
sb.append("\n=======================================================")
|
||||||
|
.append("\n[ENS] 카카오톡 인증톡 실시간전송")
|
||||||
|
.append("\n요청ID: " + sendMastId);
|
||||||
|
|
||||||
|
EnsResponseVO responseVO = kkoTalkService.remake(sendMastId);
|
||||||
|
sb.append("\n제작 결과: " + responseVO.toString());
|
||||||
|
if (!EnsErrCd.OK.equals(responseVO.getErrCode())) {
|
||||||
|
sb.append("\n=======================================================");
|
||||||
|
log.info(sb.toString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
responseVO = kkoTalkService.sendBulk(sendMastId);
|
||||||
|
sb.append("\n전송요청 결과: " + responseVO.toString());
|
||||||
|
if (!EnsErrCd.OK.equals(responseVO.getErrCode())) {
|
||||||
|
sb.append("\n=======================================================");
|
||||||
|
log.info(sb.toString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
responseVO = kkoTalkService.statBulk(sendMastId);
|
||||||
|
sb.append("\n상태갱신 결과: " + responseVO.toString())
|
||||||
|
.append("\n=======================================================");
|
||||||
|
log.info(sb.toString());
|
||||||
|
|
||||||
|
if (event.getCallback() != null)
|
||||||
|
event.getCallback().execute();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Async
|
||||||
|
@Order(1)
|
||||||
|
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
|
||||||
|
public void sendReserve(KkoTalkSendReserveEvent event) {
|
||||||
|
event.getSendMastIds().stream()
|
||||||
|
.forEach(sendMastId -> {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
|
||||||
|
EnsResponseVO responseVO = kkoTalkService.remake(sendMastId);
|
||||||
|
sb.append("\n=======================================================")
|
||||||
|
.append("\n[ENS] 카카오톡 인증톡 예약전송")
|
||||||
|
.append("\n요청ID: " + sendMastId)
|
||||||
|
.append("\n제작 결과: " + responseVO.toString())
|
||||||
|
.append("\n=======================================================");
|
||||||
|
log.info(sb.toString());
|
||||||
|
|
||||||
|
if (event.getCallback() != null)
|
||||||
|
event.getCallback().execute();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package cokr.xit.ens.modules.kkotalk.service.event;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import cokr.xit.ens.core.eventlistner.adaptor.EnsAMSCallbackAdaptor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Getter
|
||||||
|
public class KkoTalkSendRealtimeEvent {
|
||||||
|
|
||||||
|
private List<Long> sendMastIds;
|
||||||
|
|
||||||
|
private EnsAMSCallbackAdaptor callback;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package cokr.xit.ens.modules.kkotalk.service.event;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import cokr.xit.ens.core.eventlistner.adaptor.EnsAMSCallbackAdaptor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Getter
|
||||||
|
public class KkoTalkSendReserveEvent {
|
||||||
|
|
||||||
|
private List<Long> sendMastIds;
|
||||||
|
|
||||||
|
private EnsAMSCallbackAdaptor callback;
|
||||||
|
|
||||||
|
}
|
@ -1,93 +0,0 @@
|
|||||||
package cokr.xit.ens.modules.kkotalk.service.support;
|
|
||||||
|
|
||||||
import cokr.xit.ens.modules.kkotalk.model.KkotalkApiDTO;
|
|
||||||
import cokr.xit.ens.modules.kkotalk.model.KkotalkDTO;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <pre>
|
|
||||||
* description : 카카오 페이 전자 문서 발송 요청 인터 페이스
|
|
||||||
* packageName : kr.xit.ens.kakao.talk.service
|
|
||||||
* fileName : IKkopayEltrcDocService
|
|
||||||
* author : julim
|
|
||||||
* date : 2023-04-28
|
|
||||||
* ======================================================================
|
|
||||||
* 변경일 변경자 변경 내용
|
|
||||||
* ----------------------------------------------------------------------
|
|
||||||
* 2023-04-28 julim 최초 생성
|
|
||||||
*
|
|
||||||
* </pre>
|
|
||||||
*/
|
|
||||||
public interface IKkoTalkApiService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <pre>
|
|
||||||
* 모바일웹 연계 문서발송 요청
|
|
||||||
* -.이용기관 서버에서 전자문서 서버로 문서발송 처리를 요청합니다.
|
|
||||||
* </pre>
|
|
||||||
* @param reqDTO KkotalkApiDTO.SendRequest
|
|
||||||
* @return KkotalkApiDTO.SendResponse
|
|
||||||
*/
|
|
||||||
KkotalkDTO.SendResponse requestSend(final KkotalkDTO.SendRequest reqDTO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <pre>
|
|
||||||
* 토큰 유효성 검증(Redirect URL 접속 허용/불허)
|
|
||||||
* </pre>
|
|
||||||
* @param reqDTO KkotalkApiDTO.ValidTokenRequest
|
|
||||||
* @return KkotalkApiDTO.ValidTokenResponse>
|
|
||||||
*/
|
|
||||||
KkotalkApiDTO.ValidTokenResponse validToken(final KkotalkApiDTO.ValidTokenRequest reqDTO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <pre>
|
|
||||||
* 문서 열람 처리 API
|
|
||||||
* -.문서에 대해서 열람 상태로 변경. 사용자가 문서열람 시(OTT 검증 완료 후 페이지 로딩 완료 시점) 반드시 문서 열람 상태 변경 API를 호출해야 함.
|
|
||||||
* -.미 호출 시 아래와 같은 문제 발생
|
|
||||||
* 1)유통증명시스템을 사용하는 경우 해당 API를 호출한 시점으로 열람정보가 등록되어 미 호출 시 열람정보가 등록 되지 않음.
|
|
||||||
* 2)문서상태조회 API(/v1/envelopes/${ENVELOPE_ID}/read) 호출 시 read_at최초 열람시간) 데이터가 내려가지 않음.
|
|
||||||
* </pre>
|
|
||||||
* @param reqDTO KkotalkDTO.EnvelopeId
|
|
||||||
*/
|
|
||||||
KkotalkApiDTO.KkotalkErrorDTO modifyStatus(final KkotalkDTO.EnvelopeId reqDTO);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <pre>
|
|
||||||
* 문서 상태 조회 API
|
|
||||||
* -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
|
|
||||||
* : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
|
|
||||||
* : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
|
|
||||||
* -.doc_box_status 상태변경순서
|
|
||||||
* : RECEIVE(수신, 미처리) > READ(열람)/EXPIRED
|
|
||||||
* </pre>
|
|
||||||
* @param reqDTO KkotalkDTO.EnvelopeId
|
|
||||||
* @return KkotalkApiDTO.EnvelopeStatusResponse
|
|
||||||
*/
|
|
||||||
KkotalkApiDTO.EnvelopeStatusResponse findStatus(final KkotalkApiDTO.EnvelopeId reqDTO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <pre>
|
|
||||||
* 대량(bulk) 문서발송 요청
|
|
||||||
* -.이용기관 서버에서 카카오페이 내문서함 서버로 대량(bulk) 문서발송 처리를 요청합니다.
|
|
||||||
* </pre>
|
|
||||||
* @param reqDTO KkopayDocBulkDTO.BulkSendRequests
|
|
||||||
* @return KkopayDocBulkDTO.BulkSendResponses
|
|
||||||
*/
|
|
||||||
KkotalkDTO.BulkSendResponse requestSendBulk(final KkotalkDTO.BulkSendRequest reqDTO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <pre>
|
|
||||||
* 대량(bulk) 문서 상태 조회 API
|
|
||||||
* -.이용기관 서버에서 카카오페이 전자문서 서버로 문서 상태에 대한 조회를 요청 합니다.
|
|
||||||
* : 발송된 문서의 진행상태를 알고 싶은 경우, flow와 상관없이 요청 가능
|
|
||||||
* : polling 방식으로 호출할 경우, 호출 간격은 5초를 권장.
|
|
||||||
* : RECEIVED(수신,미수신) > READ(열람)/EXPIRED
|
|
||||||
* </pre>
|
|
||||||
* @param reqDTO KkotalkDTO.BulkStatusRequest
|
|
||||||
* @return KkotalkDTO.BulkStatusResponse
|
|
||||||
*/
|
|
||||||
KkotalkDTO.BulkStatusResponse findBulkStatus(final KkotalkDTO.BulkStatusRequest reqDTO);
|
|
||||||
|
|
||||||
|
|
||||||
//KkotalkApiDTO.ValidTokenResponse findKkotalkReadyAndMblPage(KkotalkApiDTO.ValidTokenRequest reqDTO);
|
|
||||||
}
|
|
@ -0,0 +1,198 @@
|
|||||||
|
package cokr.xit.ens.modules.kkotalk.web;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import cokr.xit.ens.core.aop.EnsResponseVO;
|
||||||
|
import cokr.xit.ens.core.exception.EnsException;
|
||||||
|
import cokr.xit.ens.core.exception.code.EnsErrCd;
|
||||||
|
import cokr.xit.ens.modules.kkotalk.mapper.IKkoTalkMapper;
|
||||||
|
import cokr.xit.ens.modules.kkotalk.model.KkotalkDTO;
|
||||||
|
import cokr.xit.ens.modules.kkotalk.service.KkoTalkService;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Content;
|
||||||
|
import io.swagger.v3.oas.annotations.media.ExampleObject;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <pre>
|
||||||
|
* description : 카카오톡 전자 문서 발송 controller
|
||||||
|
* packageName : kr.xit.ens.kakao.talk.web
|
||||||
|
* fileName : KkotalkEltrcDocController
|
||||||
|
* author : julim
|
||||||
|
* date : 2024-08-12
|
||||||
|
* ======================================================================
|
||||||
|
* 변경일 변경자 변경 내용
|
||||||
|
* ----------------------------------------------------------------------
|
||||||
|
* 2024-08-12 julim 최초 생성
|
||||||
|
*
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
@Tag(name = "KkotalkController", description = "카카오톡 인증톡")
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(value = "/kko/talk")
|
||||||
|
public class KkotalkController {
|
||||||
|
private final KkoTalkService service;
|
||||||
|
private final IKkoTalkMapper talkMapper;
|
||||||
|
|
||||||
|
@Operation(summary = "접수")
|
||||||
|
@PostMapping(value = "/accept", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> accept(@RequestBody KkotalkDTO.KkoTalkAcceptReqDTO reqDTO) {
|
||||||
|
EnsResponseVO<?> responseVO = service.accept(reqDTO);
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||||
|
@Content(mediaType = "application/json", examples = {
|
||||||
|
@ExampleObject(name = "Sample Example..."
|
||||||
|
, summary = "제작"
|
||||||
|
, value = "{\"sendMastId\": 1}")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
@Operation(summary = "제작")
|
||||||
|
@PostMapping(value = "/make", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> make(@RequestBody Map<String, Long> mParam) {
|
||||||
|
|
||||||
|
EnsResponseVO<?> responseVO = service.remake(mParam.get("sendMastId"));
|
||||||
|
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Operation(summary = "제작(일괄)")
|
||||||
|
// @PutMapping(value = "/kko/mydoc/make/all", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
@PostMapping(value = "/make/all", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> makeAll() {
|
||||||
|
|
||||||
|
EnsResponseVO<?> responseVO = service.makeAll();
|
||||||
|
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||||
|
@Content(mediaType = "application/json", examples = {
|
||||||
|
@ExampleObject(name = "Sample Example..."
|
||||||
|
, summary = "(대량)전송요청"
|
||||||
|
, value = "{\"sendMastId\": 1}")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
@Operation(summary = "(대량)전송요청")
|
||||||
|
@PostMapping(value = "/send/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> sendBulk(@RequestBody Map<String, Long> mParam) {
|
||||||
|
EnsResponseVO<?> responseVO = service.sendBulk(mParam.get("sendMastId"));
|
||||||
|
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "(대량)전송요청 일괄")
|
||||||
|
@PostMapping(value = "/send/bulk/all", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> sendBulkAll() {
|
||||||
|
EnsResponseVO<?> responseVO = service.sendBulkAll();
|
||||||
|
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||||
|
@Content(mediaType = "application/json", examples = {
|
||||||
|
@ExampleObject(name = "Sample Example..."
|
||||||
|
, summary = "(대량)문서상태 갱신"
|
||||||
|
, value = "{\"sendMastId\": 1}")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
@Operation(summary = "(대량)문서상태 갱신")
|
||||||
|
@PostMapping(value = "/stat/bulk", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> statBulk(@RequestBody Map<String, Long> mParam) {
|
||||||
|
|
||||||
|
EnsResponseVO<?> responseVO = service.statBulk(mParam.get("sendMastId"));
|
||||||
|
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "(대량)문서상태 일괄 갱신")
|
||||||
|
// @PutMapping(value = "/kko/mydoc/stat/bulk/all", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
@PostMapping(value = "/stat/bulk/all", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> statBulkAll() {
|
||||||
|
|
||||||
|
EnsResponseVO<?> responseVO = service.statBulkAll();
|
||||||
|
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||||
|
@Content(mediaType = "application/json", examples = {
|
||||||
|
@ExampleObject(name = "Sample Example..."
|
||||||
|
, summary = "토큰(OTT) 검증"
|
||||||
|
, value = "{\"envelopeId\": \"BIN-ff806328863311ebb61432ac599d6150\", \"token\": \"ZDU3NGU1ZTYtNTk2Yy99OGNjLWJiYjUtYjZmMjI9NzRhOTA4\", \"externalId\": \"A0001\"}")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
@Operation(summary = "토큰(OTT) 검증")
|
||||||
|
@PostMapping(value = "/token/verify", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> tokenVerify(@RequestBody Map<String, String> mParam) {
|
||||||
|
|
||||||
|
final String envelopeId = mParam.get("envelopeId");
|
||||||
|
final String token = mParam.get("token");
|
||||||
|
final String externalId = mParam.get("externalId");
|
||||||
|
|
||||||
|
|
||||||
|
KkotalkDTO.SendDetailKkoTalkDTO sendDetail = talkMapper.findFetchByExternalIdAndEnvelopeId(externalId, envelopeId)
|
||||||
|
.orElseThrow(() -> new EnsException(EnsErrCd.ERR404, "문서를 찾을 수 없습니다."));
|
||||||
|
|
||||||
|
EnsResponseVO<?> responseVO = service.tokenVerify("getOrgCd()", envelopeId, token, externalId);
|
||||||
|
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||||
|
@Content(mediaType = "application/json", examples = {
|
||||||
|
@ExampleObject(name = "Sample Example..."
|
||||||
|
, summary = "문서열람 완료처리"
|
||||||
|
, value = "{\"envelopeId\": \"BIN-ff806328863311ebb61432ac599d6150\"}")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
@Operation(summary = "문서열람 완료처리")
|
||||||
|
@PostMapping(value = "/read/cmplt", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> readCmplt(@RequestBody Map<String, String> mParam) {
|
||||||
|
|
||||||
|
final String envelopeId = mParam.get("envelopeId");
|
||||||
|
|
||||||
|
KkotalkDTO.SendDetailKkoTalkDTO sendDetail = talkMapper.findFetchByExternalIdAndEnvelopeId(null, envelopeId)
|
||||||
|
.orElseThrow(() -> new EnsException(EnsErrCd.ERR404, "문서를 찾을 수 없습니다."));
|
||||||
|
|
||||||
|
EnsResponseVO<?> responseVO = service.readCmplt("getOrgCd()", envelopeId);
|
||||||
|
|
||||||
|
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@io.swagger.v3.oas.annotations.parameters.RequestBody(required = true, content = {
|
||||||
|
@Content(mediaType = "application/json", examples = {
|
||||||
|
@ExampleObject(name = "Sample Example..."
|
||||||
|
, summary = "전송결과 가져오기"
|
||||||
|
, value = "{\"sendMastId\": 1}")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
@Operation(summary = "전송결과 가져오기")
|
||||||
|
@PostMapping(value = "/send/result/provide", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
public ResponseEntity<?> sendResultProvide(@RequestBody Map<String, Long> mParam) {
|
||||||
|
|
||||||
|
EnsResponseVO<?> responseVO = service.sendResultProvide(mParam.get("sendMastId"));
|
||||||
|
|
||||||
|
|
||||||
|
return new ResponseEntity<>(responseVO, HttpStatus.OK);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue