From 2d87b5b5f72e28ac85aa83007f34db2bab6836a4 Mon Sep 17 00:00:00 2001 From: hylee Date: Fri, 19 May 2023 10:44:54 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mjon/api/access/{service => }/mapper/AccessKeyMapper.java | 4 ++-- .../api/access/{service => }/mapper/AccessTokenMapper.java | 4 ++-- .../api/access/{service => }/mapper/domain/AccessKeyVO.java | 2 +- .../api/access/{service => }/mapper/domain/SendMsgVO.java | 2 +- .../mjon/api/inqry/{service => }/mapper/PriceMapper.java | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename src/main/java/com/itn/mjonApi/mjon/api/access/{service => }/mapper/AccessKeyMapper.java (76%) rename src/main/java/com/itn/mjonApi/mjon/api/access/{service => }/mapper/AccessTokenMapper.java (80%) rename src/main/java/com/itn/mjonApi/mjon/api/access/{service => }/mapper/domain/AccessKeyVO.java (93%) rename src/main/java/com/itn/mjonApi/mjon/api/access/{service => }/mapper/domain/SendMsgVO.java (96%) rename src/main/java/com/itn/mjonApi/mjon/api/inqry/{service => }/mapper/PriceMapper.java (78%) diff --git a/src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/AccessKeyMapper.java b/src/main/java/com/itn/mjonApi/mjon/api/access/mapper/AccessKeyMapper.java similarity index 76% rename from src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/AccessKeyMapper.java rename to src/main/java/com/itn/mjonApi/mjon/api/access/mapper/AccessKeyMapper.java index f86f46c..cadfeb3 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/AccessKeyMapper.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/access/mapper/AccessKeyMapper.java @@ -1,6 +1,6 @@ -package com.itn.mjonApi.mjon.api.access.service.mapper; +package com.itn.mjonApi.mjon.api.access.mapper; -import com.itn.mjonApi.mjon.api.access.service.mapper.domain.AccessKeyVO; +import com.itn.mjonApi.mjon.api.access.mapper.domain.AccessKeyVO; import org.apache.ibatis.annotations.Mapper; import java.util.List; diff --git a/src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/AccessTokenMapper.java b/src/main/java/com/itn/mjonApi/mjon/api/access/mapper/AccessTokenMapper.java similarity index 80% rename from src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/AccessTokenMapper.java rename to src/main/java/com/itn/mjonApi/mjon/api/access/mapper/AccessTokenMapper.java index d85a628..b4c0105 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/AccessTokenMapper.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/access/mapper/AccessTokenMapper.java @@ -1,6 +1,6 @@ -package com.itn.mjonApi.mjon.api.access.service.mapper; +package com.itn.mjonApi.mjon.api.access.mapper; -import com.itn.mjonApi.mjon.api.access.service.mapper.domain.AccessKeyVO; +import com.itn.mjonApi.mjon.api.access.mapper.domain.AccessKeyVO; import com.itn.mjonApi.cmn.idgen.mapper.domain.IdgenVO; import org.apache.ibatis.annotations.Mapper; diff --git a/src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/domain/AccessKeyVO.java b/src/main/java/com/itn/mjonApi/mjon/api/access/mapper/domain/AccessKeyVO.java similarity index 93% rename from src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/domain/AccessKeyVO.java rename to src/main/java/com/itn/mjonApi/mjon/api/access/mapper/domain/AccessKeyVO.java index dd1d8d5..f15757f 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/domain/AccessKeyVO.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/access/mapper/domain/AccessKeyVO.java @@ -1,4 +1,4 @@ -package com.itn.mjonApi.mjon.api.access.service.mapper.domain; +package com.itn.mjonApi.mjon.api.access.mapper.domain; /* table : mj_mymsg comment : '내문자 보관함'; diff --git a/src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/domain/SendMsgVO.java b/src/main/java/com/itn/mjonApi/mjon/api/access/mapper/domain/SendMsgVO.java similarity index 96% rename from src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/domain/SendMsgVO.java rename to src/main/java/com/itn/mjonApi/mjon/api/access/mapper/domain/SendMsgVO.java index 146e663..c9b1a10 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/access/service/mapper/domain/SendMsgVO.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/access/mapper/domain/SendMsgVO.java @@ -1,4 +1,4 @@ -package com.itn.mjonApi.mjon.api.access.service.mapper.domain; +package com.itn.mjonApi.mjon.api.access.mapper.domain; /* table : mj_mymsg comment : '내문자 보관함'; diff --git a/src/main/java/com/itn/mjonApi/mjon/api/inqry/service/mapper/PriceMapper.java b/src/main/java/com/itn/mjonApi/mjon/api/inqry/mapper/PriceMapper.java similarity index 78% rename from src/main/java/com/itn/mjonApi/mjon/api/inqry/service/mapper/PriceMapper.java rename to src/main/java/com/itn/mjonApi/mjon/api/inqry/mapper/PriceMapper.java index f330266..0b9f488 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/inqry/service/mapper/PriceMapper.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/inqry/mapper/PriceMapper.java @@ -1,9 +1,9 @@ -package com.itn.mjonApi.mjon.api.inqry.service.mapper; +package com.itn.mjonApi.mjon.api.inqry.mapper; import org.apache.ibatis.annotations.Mapper; /** -* @packageName : com.itn.mjonApi.mjon.api.inqry.service.mapper +* @packageName : com.itn.mjonApi.mjon.api.inqry.service * @fileName : PriceMapper.java * @author : JunHo Lee * @date : 2023.05.15 From e7b0d509e090ed2a7a91e29bea120e02b75baa5c Mon Sep 17 00:00:00 2001 From: hylee Date: Fri, 19 May 2023 10:45:36 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 + .../cmn/interceptor/CertifInterceptor.java | 2 +- .../api/access/service/AccessKeyService.java | 2 +- .../access/service/AccessTokenService.java | 2 +- .../service/impl/AccessKeyServiceImpl.java | 13 +- .../service/impl/AccessTokenServiceImpl.java | 4 +- .../access/web/AccessKeyRestController.java | 41 +-- .../mjon/api/send/mapper/SendMapper.java | 22 ++ .../send/service/impl/SendServiceImpl.java | 272 +++++++++++++++++- .../mjon/api/send/web/SendRestController.java | 6 +- src/main/resources/mapper/Send/SendMapper.xml | 20 ++ .../resources/mapper/api/AccessKeyMapper.xml | 8 +- .../mapper/api/AccessTokenMapper.xml | 8 +- 13 files changed, 352 insertions(+), 56 deletions(-) create mode 100644 src/main/java/com/itn/mjonApi/mjon/api/send/mapper/SendMapper.java create mode 100644 src/main/resources/mapper/Send/SendMapper.xml diff --git a/pom.xml b/pom.xml index 32d1437..61acee6 100644 --- a/pom.xml +++ b/pom.xml @@ -104,6 +104,14 @@ springfox-swagger-ui 3.0.0 + + + + org.apache.commons + commons-lang3 + 3.12.0 + + diff --git a/src/main/java/com/itn/mjonApi/cmn/interceptor/CertifInterceptor.java b/src/main/java/com/itn/mjonApi/cmn/interceptor/CertifInterceptor.java index 12f33df..7e5abc2 100644 --- a/src/main/java/com/itn/mjonApi/cmn/interceptor/CertifInterceptor.java +++ b/src/main/java/com/itn/mjonApi/cmn/interceptor/CertifInterceptor.java @@ -2,7 +2,7 @@ package com.itn.mjonApi.cmn.interceptor; //import java.sql.Date; -import com.itn.mjonApi.mjon.api.access.service.mapper.domain.AccessKeyVO; +import com.itn.mjonApi.mjon.api.access.mapper.domain.AccessKeyVO; import com.itn.mjonApi.mjon.log.service.mapper.domain.LettnLoginLogVO; import com.itn.mjonApi.cmn.idgen.service.IdgenService; import com.itn.mjonApi.mjon.api.access.service.AccessKeyService; diff --git a/src/main/java/com/itn/mjonApi/mjon/api/access/service/AccessKeyService.java b/src/main/java/com/itn/mjonApi/mjon/api/access/service/AccessKeyService.java index db14191..6145e41 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/access/service/AccessKeyService.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/access/service/AccessKeyService.java @@ -1,6 +1,6 @@ package com.itn.mjonApi.mjon.api.access.service; -import com.itn.mjonApi.mjon.api.access.service.mapper.domain.AccessKeyVO; +import com.itn.mjonApi.mjon.api.access.mapper.domain.AccessKeyVO; import com.itn.mjonApi.cmn.msg.RestResponse; public interface AccessKeyService { diff --git a/src/main/java/com/itn/mjonApi/mjon/api/access/service/AccessTokenService.java b/src/main/java/com/itn/mjonApi/mjon/api/access/service/AccessTokenService.java index 5945ecf..1e917f9 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/access/service/AccessTokenService.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/access/service/AccessTokenService.java @@ -1,6 +1,6 @@ package com.itn.mjonApi.mjon.api.access.service; -import com.itn.mjonApi.mjon.api.access.service.mapper.domain.AccessKeyVO; +import com.itn.mjonApi.mjon.api.access.mapper.domain.AccessKeyVO; import com.itn.mjonApi.cmn.msg.RestResponse; public interface AccessTokenService { diff --git a/src/main/java/com/itn/mjonApi/mjon/api/access/service/impl/AccessKeyServiceImpl.java b/src/main/java/com/itn/mjonApi/mjon/api/access/service/impl/AccessKeyServiceImpl.java index e2bfaf9..7c61656 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/access/service/impl/AccessKeyServiceImpl.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/access/service/impl/AccessKeyServiceImpl.java @@ -1,16 +1,15 @@ package com.itn.mjonApi.mjon.api.access.service.impl; -import java.time.LocalDateTime; -import java.util.List; - +import com.itn.mjonApi.cmn.msg.RestResponse; +import com.itn.mjonApi.mjon.api.access.mapper.AccessKeyMapper; +import com.itn.mjonApi.mjon.api.access.mapper.domain.AccessKeyVO; +import com.itn.mjonApi.mjon.api.access.service.AccessKeyService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import com.itn.mjonApi.mjon.api.access.service.mapper.domain.AccessKeyVO; -import com.itn.mjonApi.cmn.msg.RestResponse; -import com.itn.mjonApi.mjon.api.access.service.AccessKeyService; -import com.itn.mjonApi.mjon.api.access.service.mapper.AccessKeyMapper; +import java.time.LocalDateTime; +import java.util.List; @Service public class AccessKeyServiceImpl implements AccessKeyService { diff --git a/src/main/java/com/itn/mjonApi/mjon/api/access/service/impl/AccessTokenServiceImpl.java b/src/main/java/com/itn/mjonApi/mjon/api/access/service/impl/AccessTokenServiceImpl.java index 09f8683..478f466 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/access/service/impl/AccessTokenServiceImpl.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/access/service/impl/AccessTokenServiceImpl.java @@ -7,11 +7,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; -import com.itn.mjonApi.mjon.api.access.service.mapper.domain.AccessKeyVO; +import com.itn.mjonApi.mjon.api.access.mapper.domain.AccessKeyVO; import com.itn.mjonApi.cmn.idgen.mapper.domain.IdgenVO; import com.itn.mjonApi.cmn.msg.RestResponse; import com.itn.mjonApi.mjon.api.access.service.AccessTokenService; -import com.itn.mjonApi.mjon.api.access.service.mapper.AccessTokenMapper; +import com.itn.mjonApi.mjon.api.access.mapper.AccessTokenMapper; @Service public class AccessTokenServiceImpl implements AccessTokenService { diff --git a/src/main/java/com/itn/mjonApi/mjon/api/access/web/AccessKeyRestController.java b/src/main/java/com/itn/mjonApi/mjon/api/access/web/AccessKeyRestController.java index 68645ee..eff0ace 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/access/web/AccessKeyRestController.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/access/web/AccessKeyRestController.java @@ -1,23 +1,17 @@ package com.itn.mjonApi.mjon.api.access.web; -import java.time.LocalDateTime; - -import org.json.simple.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import com.itn.mjonApi.mjon.api.access.service.mapper.domain.SendMsgVO; import com.itn.mjonApi.cmn.msg.PlainResponse; import com.itn.mjonApi.cmn.msg.RestResponse; import com.itn.mjonApi.mjon.api.access.service.AccessKeyService; import com.itn.mjonApi.mjon.api.access.service.AccessTokenService; +import com.itn.mjonApi.mjon.api.access.mapper.domain.SendMsgVO; +import org.json.simple.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; /** * @author User @@ -98,24 +92,7 @@ public class AccessKeyRestController { //System.out.println(p_name_1); //System.out.println(p_name_2); - //sendMsg 문자 발송 전 체크 사항 - //step1.발신자 전화번호 사용 가능 여부 체크(해당 사용자의 기 등록된 번호만 발송 가능) - // 1010 - - //step2.수신자 전화번호 정상 여부 체크(정상 번호에 대해서만 발송 가능) - // 1020 - - //step3.문자 내용 정상 여부 확인 - 스미싱 문구는 발송 안됨 - // 1030 - - //step4.치환명 정상 여부 확인 - // 1040 - - //step5.발송일시 정상여부 확인 - // 1050 - - //step6.문자 타입에 따른 비용 처리 가능 여부 확인 - // 1060 + return ResponseEntity.ok( new RestResponse( diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/SendMapper.java b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/SendMapper.java new file mode 100644 index 0000000..0028311 --- /dev/null +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/SendMapper.java @@ -0,0 +1,22 @@ +package com.itn.mjonApi.mjon.api.send.mapper; + +import com.itn.mjonApi.mjon.api.send.mapper.domain.MsgRequestVO; +import org.apache.ibatis.annotations.Mapper; + +/** + * packageName : com.itn.mjonApi.mjon.api.send.mapper.domain + * fileName : SendMapper + * author : hylee + * date : 2023-05-19 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-05-19 hylee 최초 생성 + */ +@Mapper +public interface SendMapper { + + Boolean findByCallFrom(MsgRequestVO msgRequestVO); + +} diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/service/impl/SendServiceImpl.java b/src/main/java/com/itn/mjonApi/mjon/api/send/service/impl/SendServiceImpl.java index b46cbee..c09ae05 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/service/impl/SendServiceImpl.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/service/impl/SendServiceImpl.java @@ -1,14 +1,21 @@ package com.itn.mjonApi.mjon.api.send.service.impl; import com.itn.mjonApi.cmn.apiServer.ApiService; +import com.itn.mjonApi.mjon.api.send.mapper.SendMapper; import com.itn.mjonApi.mjon.api.send.mapper.domain.MjonResponseVO; import com.itn.mjonApi.mjon.api.send.mapper.domain.MsgRequestVO; import com.itn.mjonApi.mjon.api.send.service.SendService; +import com.itn.mjonApi.util.MunjaUtil; import lombok.extern.slf4j.Slf4j; import org.apache.catalina.connector.Response; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicInteger; + @Slf4j @Service @@ -16,16 +23,93 @@ public class SendServiceImpl implements SendService { private ApiService apiService; + @Autowired + SendMapper sendMapper; @Autowired public SendServiceImpl(ApiService apiService) { this.apiService = apiService; } + private static final String replaseStrList = "[*이름*],[*1*],[*2*],[*3*],[*4*]"; @Override public MjonResponseVO sendMsgData(MsgRequestVO msgRequestVO) throws Exception { - log.info("msgRequestVO.getReserveYn() :: [{}]",msgRequestVO.getReserveYn()); + log.info(" :: sendMsgData ::"); + + Boolean byCallFrom = sendMapper.findByCallFrom(msgRequestVO); + log.info(" :: byCallFrom ::" + byCallFrom); + if(byCallFrom){ + + } + /* + 발신번호 체크 + SELECT PHONE_NUMBER + FROM MJ_PHONE_MEMBER + WHERE 1=1 + AND USER_ID = 'goodgkdus' + AND AUTH_YN = 'Y' + AND PHM_TYPE = '01' + ORDER BY BASE_YN DESC + * */ + + //sendMsg 문자 발송 전 체크 사항 + //step1.발신자 전화번호 사용 가능 여부 체크(해당 사용자의 기 등록된 번호만 발송 가능) + // 1010 + + + + //step2.수신자 전화번호 정상 여부 체크(정상 번호에 대해서만 발송 가능) + // 1020 + + //step3.문자 내용 정상 여부 확인 - 스미싱 문구는 발송 안됨 + // 1030 + + //step4.치환명 정상 여부 확인 + // 1040 + + //step5.발송일시 정상여부 확인 + // 1050 + + //step6.문자 타입에 따른 비용 처리 가능 여부 확인 + // 1060 + + + + + + +/* + + + String message = ""; + // 폰번호 확인 - 빈 값 -> 유효성 정규식 + message = this.getCallToListChk(msgRequestVO); + if(StringUtils.isNotEmpty(message)){ + return MjonResponseVO.builder() + .result("fail") + .message(message) + .build(); + } + + + // 치환데이터 여부 확인 + msgRequestVO.setTxtReplYn(this.getTxtReplYn(msgRequestVO)); + + if("Y".equals(msgRequestVO.getTxtReplYn())){ + + //일괄변환 문자에 콤마(,)가 들어가있으면 배열로 넘길때 문제가 발생하여 특수문자(§)로 치환하여 넘겨주도록 한다. + msgRequestVO = this.getReplaceCommaToStrSymbol(msgRequestVO); + + // 치환 후 단문 장문 개수 구하기 + msgRequestVO = getLengthOfShortAndLongMsg(msgRequestVO); + + } + + + + + // 스팸체크 하는 부분 MjonResponseVO spamChkEntity = apiService.postForEntity( "/web/user/login/selectSpamTxtChkAjax.do" @@ -37,6 +121,8 @@ public class SendServiceImpl implements SendService { msgRequestVO.setSpamStatus("Y"); }; + log.info("msgRequestVO.getSpamStatus() :: [[}]",msgRequestVO.getSpamStatus()); + // 문자 전송하는 부분 MjonResponseVO munjaSendResponse = apiService.postForEntity( "/web/user/login/sendMsgDataAjax.do" @@ -44,10 +130,190 @@ public class SendServiceImpl implements SendService { , String.class ); +*/ - return munjaSendResponse; -// return spamChkEntity; + return null; +// return munjaSendResponse; + } + + /** + * 치환 후 단문 장문 msg 개수 구하기 + * @param msgRequestVO + * @return msgRequestVO + * @throws UnsupportedEncodingException + */ + private static MsgRequestVO getLengthOfShortAndLongMsg(MsgRequestVO msgRequestVO) throws UnsupportedEncodingException { + String charset = "euc-kr"; + int totListCnt = msgRequestVO.getCallToList().length; + + int shortMsgCnt=0; // 치환 후 단문 개수 + int longMsgCnt=0; // 치환 후 장문 개수 + for(int i=0; i < totListCnt; i ++) { + String smsTxt = msgRequestVO.getSmsTxt().replaceAll(String.valueOf((char)13), ""); //발송 문자 내용 + + String[] nameList = msgRequestVO.getNameList(); //치환 이름 리스트 + String[] phone = msgRequestVO.getCallToList(); //수신자 휴대폰 번호 + String[] rep1 = msgRequestVO.getRep1List(); //치환 문자1 리스트 + String[] rep2 = msgRequestVO.getRep2List(); //치환 문자2 리스트 + String[] rep3 = msgRequestVO.getRep3List(); //치환 문자3 리스트 + String[] rep4 = msgRequestVO.getRep4List(); //치환 문자4 리스트 + + if (smsTxt.indexOf("[*이름*]") > -1) { + if(nameList.length > i && StringUtils.isNotEmpty(nameList[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", MunjaUtil.getString(nameList[i].replaceAll("§", ","))); + }else { + smsTxt = smsTxt.replaceAll("\\[\\*이름\\*\\]", ""); + } + } + if (smsTxt.indexOf("[*1*]") > -1) { + if(rep1.length > i && StringUtils.isNotEmpty(rep1[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", MunjaUtil.getString(rep1[i].replaceAll("§", ","))); + }else { + smsTxt = smsTxt.replaceAll("\\[\\*1\\*\\]", ""); + } + } + if (smsTxt.indexOf("[*2*]") > -1) { + if(rep2.length > i && StringUtils.isNotEmpty(rep2[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", MunjaUtil.getString(rep2[i].replaceAll("§", ","))); + }else { + smsTxt = smsTxt.replaceAll("\\[\\*2\\*\\]", ""); + } + } + if (smsTxt.indexOf("[*3*]") > -1) { + if(rep3.length > i && StringUtils.isNotEmpty(rep3[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", MunjaUtil.getString(rep3[i].replaceAll("§", ","))); + }else { + smsTxt = smsTxt.replaceAll("\\[\\*3\\*\\]", ""); + } + } + if (smsTxt.indexOf("[*4*]") > -1) { + if(rep4.length > i && StringUtils.isNotEmpty(rep4[i])) { + smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", MunjaUtil.getString(rep4[i].replaceAll("§", ","))); + }else { + smsTxt = smsTxt.replaceAll("\\[\\*4\\*\\]", ""); + } + } + + + int bytes = smsTxt.getBytes(charset).length; + + if(bytes > 90) {//장문문자 리스트 만들기 + longMsgCnt++; + }else {//단문문자 리스트 만들기 + shortMsgCnt++; + } + } + msgRequestVO.setLongMsgCnt(Integer.toString(longMsgCnt)); + msgRequestVO.setShortMsgCnt(Integer.toString(shortMsgCnt)); + + return msgRequestVO; + } + + /** + * 치환문자가 있으면 , => §로 치환 + * @param msgRequestVO + * @return + */ + private static MsgRequestVO getReplaceCommaToStrSymbol(MsgRequestVO msgRequestVO) { + + AtomicInteger index = new AtomicInteger(); + + // 이름 배열 + if(StringUtils.isNotEmpty(msgRequestVO.getNameStr())) + { + msgRequestVO.setNameList(msgRequestVO.getNameStr().split("\\|")); + String[] nameList = new String[msgRequestVO.getNameList().length]; + Arrays.stream(msgRequestVO.getNameList()).forEach(name -> { + nameList[index.getAndIncrement()] = MunjaUtil.replaceCommaToStrSymbol(name); + }); + msgRequestVO.setNameList(nameList); + } + + // Rep1 배열 + if(StringUtils.isNotEmpty(msgRequestVO.getRep1Str())) + { + index.set(0); + msgRequestVO.setRep1List(msgRequestVO.getRep1Str().split("\\|")); + String[] rep1List = new String[msgRequestVO.getRep1List().length]; + Arrays.stream(msgRequestVO.getRep1List()).forEach(str -> { + rep1List[index.getAndIncrement()] = MunjaUtil.replaceCommaToStrSymbol(str); + }); + msgRequestVO.setRep1List(rep1List); + + } + + // Rep2 배열 + if(StringUtils.isNotEmpty(msgRequestVO.getRep2Str())) + { + index.set(0); + msgRequestVO.setRep2List(msgRequestVO.getRep2Str().split("\\|")); + String[] rep2List = new String[msgRequestVO.getRep2List().length]; + Arrays.stream(msgRequestVO.getRep2List()).forEach(str -> { + rep2List[index.getAndIncrement()] = MunjaUtil.replaceCommaToStrSymbol(str); + }); + msgRequestVO.setRep2List(rep2List); + } + + // Rep3 배열 + if(StringUtils.isNotEmpty(msgRequestVO.getRep3Str())) + { + index.set(0); + msgRequestVO.setRep3List(msgRequestVO.getRep3Str().split("\\|")); + String[] rep3List = new String[msgRequestVO.getRep3List().length]; + Arrays.stream(msgRequestVO.getRep3List()).forEach(str -> { + rep3List[index.getAndIncrement()] = MunjaUtil.replaceCommaToStrSymbol(str); + }); + msgRequestVO.setRep3List(rep3List); + } + + // Rep4 배열 + if(StringUtils.isNotEmpty(msgRequestVO.getRep4Str())) + { + index.set(0); + msgRequestVO.setRep4List(msgRequestVO.getRep4Str().split("\\|")); + String[] rep4List = new String[msgRequestVO.getRep4List().length]; + Arrays.stream(msgRequestVO.getRep4List()).forEach(str -> { + rep4List[index.getAndIncrement()] = MunjaUtil.replaceCommaToStrSymbol(str); + }); + msgRequestVO.setRep4List(rep4List); + } + return msgRequestVO; + } + + /** + * 치환 문자 여부 확인 + * @param msgRequestVO + * @return + */ + private static String getTxtReplYn(MsgRequestVO msgRequestVO) { + + int callLen = msgRequestVO.getCallToList().length; + // 치환 데이터 확인 + Arrays.stream(replaseStrList.split(",")).forEach( + str -> { + if(msgRequestVO.getSmsTxt().indexOf(str) > -1){ + msgRequestVO.setTxtReplYn("Y"); + } + } + ); + return msgRequestVO.getTxtReplYn(); + } + + /** + * 수신자 목록 번호 검증 + * @param msgRequestVO + * @return + */ + private static String getCallToListChk(MsgRequestVO msgRequestVO) { + String message = ""; + for(String callTo : msgRequestVO.getCallToList()){ + if(!MunjaUtil.checkPhoneNumberEmpty(callTo)){ + message = "수신 목록에 핸드폰 번호가 없는 항목이 있습니다."; break;}; + if(!MunjaUtil.validatePNumWithRegex(callTo)){ + message = "휴대폰 번호가 올바르지 않습니다. : " + callTo; break;}; + } + return message; } } diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/web/SendRestController.java b/src/main/java/com/itn/mjonApi/mjon/api/send/web/SendRestController.java index 27e0b7b..34d4385 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/web/SendRestController.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/web/SendRestController.java @@ -3,8 +3,10 @@ package com.itn.mjonApi.mjon.api.send.web; import com.itn.mjonApi.mjon.api.send.mapper.domain.MjonResponseVO; import com.itn.mjonApi.mjon.api.send.mapper.domain.MsgRequestVO; import com.itn.mjonApi.mjon.api.send.service.SendService; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @@ -43,7 +45,9 @@ public class SendRestController { * @Discription 문자 발송 테스트 * @return */ - @PostMapping("/api/send/sendTest") + @CrossOrigin("*") // 모든 요청에 접근 허용 + @PostMapping("/api/send/sendMsg") + @ApiOperation(value= "단문 문자 전송", notes = "같은 내용으로 여러명에게 보냄") public MjonResponseVO sendTest(MsgRequestVO msgRequestVO) throws Exception { return sendService.sendMsgData(msgRequestVO); diff --git a/src/main/resources/mapper/Send/SendMapper.xml b/src/main/resources/mapper/Send/SendMapper.xml new file mode 100644 index 0000000..0250391 --- /dev/null +++ b/src/main/resources/mapper/Send/SendMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/api/AccessKeyMapper.xml b/src/main/resources/mapper/api/AccessKeyMapper.xml index 693332f..aa0308a 100644 --- a/src/main/resources/mapper/api/AccessKeyMapper.xml +++ b/src/main/resources/mapper/api/AccessKeyMapper.xml @@ -3,9 +3,9 @@ - + - SELECT * FROM lettngnrlmber_access_key @@ -74,7 +74,7 @@ - SELECT FROM @@ -84,7 +84,7 @@ - SELECT FROM diff --git a/src/main/resources/mapper/api/AccessTokenMapper.xml b/src/main/resources/mapper/api/AccessTokenMapper.xml index bbc47d5..0864f24 100644 --- a/src/main/resources/mapper/api/AccessTokenMapper.xml +++ b/src/main/resources/mapper/api/AccessTokenMapper.xml @@ -3,9 +3,9 @@ - + - SELECT * FROM lettngnrlmber_access_token @@ -74,7 +74,7 @@ - SELECT FROM @@ -85,7 +85,7 @@ - SELECT FROM From cd6ccecf5426971393e0b7c046e5263f7cd6398d Mon Sep 17 00:00:00 2001 From: hylee Date: Fri, 19 May 2023 10:45:52 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=EB=AC=B8=EC=9E=90=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=20=EC=A7=84=ED=96=89=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../send/mapper/domain/MjonResponseVO.java | 8 +- .../api/send/mapper/domain/MsgRequestVO.java | 81 +++++++++++++++---- .../java/com/itn/mjonApi/util/MunjaUtil.java | 60 ++++++++++++++ 3 files changed, 129 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/itn/mjonApi/util/MunjaUtil.java diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MjonResponseVO.java b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MjonResponseVO.java index a481582..48bb92e 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MjonResponseVO.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MjonResponseVO.java @@ -2,8 +2,7 @@ package com.itn.mjonApi.mjon.api.send.mapper.domain; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import org.springframework.http.ResponseEntity; /** @@ -19,10 +18,13 @@ import org.springframework.http.ResponseEntity; */ @Getter @Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class MjonResponseVO { - private String message; private String result; + private String message; private String resultSts; // 전송결과 갯수 private String resultBlockSts; // 수신거부 갯수 private String msgGroupId; diff --git a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MsgRequestVO.java b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MsgRequestVO.java index ebf6492..2b4c3eb 100644 --- a/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MsgRequestVO.java +++ b/src/main/java/com/itn/mjonApi/mjon/api/send/mapper/domain/MsgRequestVO.java @@ -1,5 +1,7 @@ package com.itn.mjonApi.mjon.api.send.mapper.domain; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -22,6 +24,7 @@ import java.io.Serializable; @Setter @NoArgsConstructor @AllArgsConstructor +@ApiModel(description = "문자 발송에 필요한 값들을 받는 vo") public class MsgRequestVO implements Serializable { /** @@ -31,39 +34,83 @@ public class MsgRequestVO implements Serializable { */ private static final long serialVersionUID = 1L; - private String smsTxt; // 'SMS용 메시지본문', - private String[] callToList; // '수신번호리스트', - private String callFrom; // '발신번호 (하이픈 등의 문자를 제외한 12byte이하의 숫자로 입력한다.)', + @ApiModelProperty(value = "사용자 ID", example = "goodgkdus", required = true) + private String mberId; - private String eachPrice="0"; // 전송문자 개별가격 - private String totPrice="0"; // 전송문자 토탈가격 + @ApiModelProperty(value = "Api Key", example = "0367a25ec370d1141898a0b9767103", required = true) + private String accessKey; - private String fileCnt="0"; // 첨부파일 갯수 + @ApiModelProperty(value = "SMS용 메시지본문", example = "문자 메세지 본문", required = true) + private String smsTxt; + + @ApiModelProperty(value = "수신번호리스트", dataType = "[Ljava.lang.String;", example = "01011112222,01022223333", required = true) + private String[] callToList; + + @ApiModelProperty(value = "발신번호 :: 정책이 필요함", example = "01011112222", required = true) + private String callFrom; + + @ApiModelProperty(value = "전송문자 개별가격", example = "0", hidden = true) + private String eachPrice="0"; + + @ApiModelProperty(value = "전송문자 토탈가격", example = "0", hidden = true) + private String totPrice="0"; + + @ApiModelProperty(value = "첨부파일 갯수", example = "0", hidden = true) + private String fileCnt="0"; + + @ApiModelProperty(value = "메시지의 (4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송)", example = "4", hidden = true) + private String msgType="4"; - private String msgType="4"; // '메시지의 (4: SMS 전송, 5: URL 전송, 6: MMS전송, 7: BARCODE전송, 8: 카카오 알림톡 전송)', // ==== 단가 ==== - private float smsPrice=0; // sms 단가 null 이면 에러 - private float mmsPrice=0; // mms 단가 null 이면 에러 + @ApiModelProperty(value = "sms 단가 null 이면 에러", example = "0", hidden = true) + private float smsPrice=0; + @ApiModelProperty(value = "mms 단가 null 이면 에러", example = "0", hidden = true) + private float mmsPrice=0; // private float kakaoAtPrice; // 카카오 알림톡 단가 // private float kakaoFtPrice; // 카카오 친구톡 단가 // private float kakaoFtImgPrice;// 카카오 이미지 단가 // private float kakaoFtWideImgPrice; // 카카오 와이드 이미지 단가 - private String[] imgFilePath = new String[0]; // 그림 이미지 경로 + @ApiModelProperty(value = "그림 이미지 경로", example = "new String[0]", hidden = true) + private String[] imgFilePath = new String[0]; - private String spamStatus; // 스팸문자 유무 (Y/N) + @ApiModelProperty(value = "스팸문자 유무 (Y/N) - 서비스단에서 처리 함", example = "", hidden = true) + private String spamStatus; - private String txtReplYn="N"; // 변환문자 유무 (Y/N) + @ApiModelProperty(value = "변환문자 유무 (Y/N) - 서비스단에서 처리 함", example = "N", hidden = true) + private String txtReplYn="N"; - private String[] nameList; // '치환 이름 리스트' - private String[] rep1List; // '치환 문자1 리스트' - private String[] rep2List; // '치환 문자2 리스트' - private String[] rep3List; // '치환 문자3 리스트' - private String[] rep4List; // '치환 문자4 리스트' + @ApiModelProperty(value = "치환 이름 리스트 |로 구분", example = "홍길동1|홍길동2|홍길동3") + private String nameStr; + @ApiModelProperty(value = "치환 문자1 리스트 |로 구분", example = "") + private String rep1Str; + @ApiModelProperty(value = "치환 문자2 리스트 |로 구분", example = "") + private String rep2Str; + @ApiModelProperty(value = "치환 문자3 리스트 |로 구분", example = "") + private String rep3Str; + @ApiModelProperty(value = "치환 문자4 리스트 |로 구분", example = "") + private String rep4Str; + @ApiModelProperty(value = "nameStr 을 |로 split 후 담는 변수", example = "", hidden = true) + private String[] nameList; + @ApiModelProperty(value = "rep1Str 을 |로 split 후 담는 변수", example = "", hidden = true) + private String[] rep1List; + @ApiModelProperty(value = "rep2Str 을 |로 split 후 담는 변수", example = "", hidden = true) + private String[] rep2List; + @ApiModelProperty(value = "rep3Str 을 |로 split 후 담는 변수", example = "", hidden = true) + private String[] rep3List; + @ApiModelProperty(value = "rep4Str 을 |로 split 후 담는 변수", example = "", hidden = true) + private String[] rep4List; + + @ApiModelProperty(value = "예약 유무 (Y/N)", example = "N", hidden = true) private String reserveYn="N"; // 예약문자 여부 default N + // 치환 있을 경우 사용 + @ApiModelProperty(value = "치환 후 단문 건수", example = "", hidden = true) + private String shortMsgCnt; + @ApiModelProperty(value = "치환 후 장문 건수", example = "", hidden = true) + private String longMsgCnt; // private String msgId ;// '문자ID', // private String userId ; // '문자온 일반회원ID', diff --git a/src/main/java/com/itn/mjonApi/util/MunjaUtil.java b/src/main/java/com/itn/mjonApi/util/MunjaUtil.java new file mode 100644 index 0000000..0e20bc3 --- /dev/null +++ b/src/main/java/com/itn/mjonApi/util/MunjaUtil.java @@ -0,0 +1,60 @@ +package com.itn.mjonApi.util; + +import org.apache.commons.lang3.StringUtils; + +/** + * packageName : com.itn.mjonApi.util + * fileName : SendUtil + * author : hylee + * date : 2023-05-17 + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-05-17 hylee 최초 생성 + */ +public class MunjaUtil { + + + /** + * 폰번호 유효성 검사 + * @param callTo + * @return + */ + public static Boolean validatePNumWithRegex(String callTo){ + // 핸드폰 정규식 + String regex = "^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$"; + return callTo.matches(regex) ? true : false; + } + /** + * 폰번호 빈값 검사 + * @param str + * @return + */ + public static Boolean checkPhoneNumberEmpty(String str){ + return StringUtils.isEmpty(str) ? false : true; + } + + + public static String replaceCommaToStrSymbol(String name) { + return name.replaceAll(",", "§"); + } + + + + /** + * 파라미터를 String 타입으로 가져옵니다.
+ * - null일 경우 빈 문자열을 가져옵니다.
+ * Get String(if object is null, return empty string). + * @param Object + * @return String + */ + public static String getString(Object obj) { + if (obj == null) + return ""; + else + return String.valueOf(obj); + } + + +}