From 6e3e83d04e894fa12a6f0162bc96fd5249a4a515 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Fri, 13 Oct 2023 15:06:32 +0900 Subject: [PATCH] =?UTF-8?q?Qna=20=EC=82=AD=EC=A0=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/qna/controller/CnsQnaController.java | 20 +++++--- .../api/cns/qna/service/CnsQnaService.java | 51 ++++++++++++++++--- .../comn/file/service/ComnFileService.java | 19 +++++++ .../repository/cns/CnsQnaBasRepository.java | 2 + .../repository/cns/CnsQnaQueryRepository.java | 42 --------------- 5 files changed, 77 insertions(+), 57 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java index 525a3ae3..70fb7098 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java @@ -56,7 +56,9 @@ public class CnsQnaController { @GetMapping("/{qnaSno}/detail") - public ResponseEntity> detailQna(@PathVariable int qnaSno){ + @Tag(name = "QNA", description = "QNA 관련 API") + @ApiOperation(value = "QnA 상세보기") + public ResponseEntity> detailQna(@PathVariable int qnaSno){ List reulst = cnsQnaService.getQnaDetail(qnaSno); @@ -64,9 +66,9 @@ public class CnsQnaController { } @PostMapping("/{qnaSno}/update") - public ResponseEntity updateQna(@PathVariable int qnaSno,@RequestBody QnaInsertRQModel rq){ - log.warn("CnsFaqController - updateQna()"); - log.warn("qnaSno -> {} rq -> {}", qnaSno, rq); + @Tag(name = "QNA", description = "QNA 관련 API") + @ApiOperation(value = "QnA 업데이트") + public ResponseEntity updateQna(@PathVariable int qnaSno,@RequestBody QnaInsertRQModel rq){ boolean result = cnsQnaService.updateQna(qnaSno, rq); @@ -74,10 +76,14 @@ public class CnsQnaController { } @GetMapping("/{qnaSno}/delete") - public ResponseEntity deleteQna(@RequestBody QnaBasModel rq){ + @Tag(name = "QNA", description = "QNA 관련 API") + @ApiOperation(value = "QnA 삭제하기") + public ResponseEntity deleteQna(@PathVariable int qnaSno){ log.warn("CnsFaqController - deleteQna()"); - log.warn("rq -> {}", rq); + log.warn("rq -> {}", qnaSno); - return ResponseEntity.ok().body(null); + boolean result = cnsQnaService.deleteQna(qnaSno); + + return ResponseEntity.ok().body(result); } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java index 398743b1..ac085347 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java @@ -7,7 +7,6 @@ import java.util.List; import javax.transaction.Transactional; import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.multipart.MultipartFile; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; @@ -43,10 +42,46 @@ public class CnsQnaService { private final JwtTokenUtil jwtTokenUtil; - + /** + * Qna 삭제하기, file들도 모두 논리삭제함. + * @param qnaSno + * @return + */ + @Transactional + public boolean deleteQna(int qnaSno){ + + CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSno(qnaSno, 0); + if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); + + boolean fileDelete = comnFileService.deleteFiles(entity.getFileGroupNo()); + + entity.setDelYn("Y"); + + List deleteList = new ArrayList<>(); + deleteList.add(entity); + + int targetSno = qnaSno; + + // 대댓글 불러오기 + while(true){ + + CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSno(targetSno); + if(cnsQnaBas == null) break; + + cnsQnaBas.setDelYn("Y"); + + deleteList.add(cnsQnaBas); + + targetSno = cnsQnaBas.getQnaSno(); + } + + deleteList = cnsQnaBasRepository.saveAll(deleteList); + + return deleteList != null && fileDelete; + } /** - * Qna 업데이트하기 + * Qna 업데이트하기 TODO :: File 업데이트 기능 아직 구현안함 * @param qnaSno * @param rq * @return @@ -54,7 +89,7 @@ public class CnsQnaService { @Transactional public boolean updateQna(int qnaSno, QnaInsertRQModel rq){ - CnsQnaBas entity = cnsQnaBasRepository.findById(qnaSno).orElse(null); + CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSno(qnaSno, 0); if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); if(rq.getCategory() != null) entity.setCategory(rq.getCategory()); @@ -76,7 +111,7 @@ public class CnsQnaService { cnsQnaBasRepository.pulsViewCount(qnaSno); - QnaBasModel qnaBasModel = cnsQnaQueryRepository.getQnaDetail(qnaSno).get(0); + CnsQnaBas qnaBasModel = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSno(qnaSno, 0); List files = null; if(qnaBasModel.getFileGroupNo() != 0) files = comFileBasRepository.findByFileGroupNo(qnaBasModel.getFileGroupNo()); @@ -92,12 +127,12 @@ public class CnsQnaService { node.setUpdateUserId(qnaBasModel.getUpdateUserId()); node.setUpdateDt(qnaBasModel.getUpdateDt()); node.setFiles(files); - - int targetSno = qnaSno; - + List result = new ArrayList<>(); result.add(node); + int targetSno = qnaSno; + // 대댓글 불러오기 while(true){ diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java index bc5d1b95..069412b0 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java @@ -327,5 +327,24 @@ public class ComnFileService { return fileGroupNo; } + @Transactional + public boolean deleteFiles(int fileGroupNo){ + + List files = comFileBasRepository.findByFileGroupNo(fileGroupNo); + + String userId = jwtTokenUtil.getUserIdByToken(); + + if (userId == null) userId = "NONE"; + + for(ComFileBas file : files){ + file.setDelYn("Y"); + file.setDelUserId(userId); + file.setDelDt(Instant.now()); + } + + comFileBasRepository.saveAll(files); + + return true; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaBasRepository.java index f596ac05..e166ae91 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaBasRepository.java @@ -13,6 +13,8 @@ public interface CnsQnaBasRepository extends JpaRepository{ CnsQnaBas findFirstByTargetSno(int targetSno); + CnsQnaBas findFirstByQnaSnoAndTargetSno(int qnaSno, int targetSno); + @Modifying @Query("UPDATE CnsQnaBas q SET q.viewCnt = q.viewCnt + 1 WHERE q.qnaSno = :qnaSno") void pulsViewCount(@Param("qnaSno")int qnaSno); diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java index a87f57c7..32c787b0 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java @@ -66,46 +66,4 @@ public class CnsQnaQueryRepository { return r; } - /** - * 첫 상세보기 검색, target번호가 있으면 안됨 - * @param qnaSno - * @return - */ - public List getQnaDetail(int qnaSno){ - - QCnsQnaBas qCnsQnaBas = QCnsQnaBas.cnsQnaBas; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(qCnsQnaBas.qnaSno.eq(qnaSno)); - builder.and(qCnsQnaBas.targetSno.eq(0)); - - List result = query.select( - Projections.bean( - QnaBasModel.class, - qCnsQnaBas.qnaSno, - qCnsQnaBas.targetSno, - qCnsQnaBas.category, - qCnsQnaBas.title, - qCnsQnaBas.content, - qCnsQnaBas.fileGroupNo, - qCnsQnaBas.viewCnt, - qCnsQnaBas.expsrYn, - qCnsQnaBas.delYn, - qCnsQnaBas.createUserId, - qCnsQnaBas.createDt, - qCnsQnaBas.updateUserId, - qCnsQnaBas.updateDt - )) - .from(qCnsQnaBas) - .where(builder) - .fetch(); - - log.warn("result -> {}", result); - - if(result == null || result.size() < 1) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); - - return result; - } - - }