From 49c2798356cf0525e6a6972e4252ed93510df6f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Tue, 17 Oct 2023 09:28:27 +0900 Subject: [PATCH] =?UTF-8?q?qna=20url=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/cns/faq/service/CnsFaqService.java | 10 +- .../cns/qna/controller/CnsQnaController.java | 177 +++++++++++++----- .../api/cns/qna/service/CnsQnaService.java | 5 +- .../comn/file/service/ComnFileService.java | 4 +- .../com/palnet/biz/jpa/entity/CnsQnaBas.java | 16 +- .../repository/cns/CnsFaqQueryRepository.java | 6 +- 6 files changed, 150 insertions(+), 68 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java index 72a54e23..5c0e8d17 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java @@ -36,12 +36,10 @@ public class CnsFaqService { } public FaqListModel getFaqDetail(int sno){ - - CnsFaqBas findEntity = cnsFaqBasRepository.findById(sno).orElseThrow(() -> new CustomException(ErrorCode.DATA_NO)); - findEntity.setViewCnt(findEntity.getViewCnt() + 1); - CnsFaqBas updateEntity = cnsFaqBasRepository.save(findEntity); - return CnsFaqMapper.MAPPER.toModel(updateEntity); - + cnsFaqBasRepository.updateViewCnt(sno); + FaqListModel result = query.getFaqDetail(sno); + if(result == null) throw new CustomException(ErrorCode.DATA_NO); + return result; } @Transactional 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 5716f7a9..0a89299e 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 @@ -1,30 +1,30 @@ package com.palnet.biz.api.cns.qna.controller; -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -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.RequestParam; -import org.springframework.web.bind.annotation.RestController; - import com.palnet.biz.api.cns.qna.model.QnaBasModel; import com.palnet.biz.api.cns.qna.model.QnaDetailRSModel; import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; -import com.palnet.biz.api.cns.qna.model.QnaRSModel; import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ; import com.palnet.biz.api.cns.qna.service.CnsQnaService; - +import com.palnet.biz.api.comn.response.BasicResponse; +import com.palnet.biz.api.comn.response.ErrorResponse; +import com.palnet.biz.api.comn.response.SuccessResponse; +import com.palnet.comn.exception.CustomException; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @RestController @Slf4j +@Tag(name = "QNA", description = "QNA 관련 API") @RequiredArgsConstructor @RequestMapping("/api/cns/qna") public class CnsQnaController { @@ -32,55 +32,123 @@ public class CnsQnaController { private final CnsQnaService cnsQnaService; - @PostMapping(value = "/insert", consumes = "multipart/form-data") + // TODO json 가능 여부 + @PostMapping(consumes = "multipart/form-data") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 등록[답변추가]") - public ResponseEntity insertQna(QnaInsertRQModel rq){ - - boolean result = cnsQnaService.insertQna(rq); - - return ResponseEntity.ok().body(result); + public ResponseEntity insertQna(QnaInsertRQModel rq){ + boolean result = false; + try { + result = cnsQnaService.insertQna(rq); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - @GetMapping("/select") + @GetMapping @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 리스트 조회") - public ResponseEntity> selectQna(QnaSelectListRQ rq){ - - List result = cnsQnaService.selectQnaList(rq); - - return ResponseEntity.ok().body(result); + public ResponseEntity selectQna(QnaSelectListRQ rq){ + + List result = new ArrayList<>(); + try { + result = cnsQnaService.selectQnaList(rq); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - @GetMapping("/{qnaSno}/detail") + @GetMapping("/{qnaSno}") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 상세보기") - public ResponseEntity> detailQna(@PathVariable int qnaSno){ - - List reulst = cnsQnaService.getQnaDetail(qnaSno); - - return ResponseEntity.ok().body(reulst); + public ResponseEntity detailQna(@PathVariable int qnaSno){ + List result = null; + try { + result = cnsQnaService.getQnaDetail(qnaSno); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - @PostMapping("/{qnaSno}/update") + @PutMapping @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 업데이트") - public ResponseEntity updateQna(@PathVariable int qnaSno, QnaInsertRQModel rq){ - - boolean result = cnsQnaService.updateQna(qnaSno, rq); - - return ResponseEntity.ok().body(result); + public ResponseEntity updateQna(QnaInsertRQModel rq){ + boolean result = false; + try { + result = cnsQnaService.updateQna(rq); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - @GetMapping("/{qnaSno}/delete") + @DeleteMapping("/{qnaSno}") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 삭제하기") - public ResponseEntity deleteQna(@PathVariable int qnaSno){ - - boolean result = cnsQnaService.deleteQna(qnaSno); - - return ResponseEntity.ok().body(result); + public ResponseEntity deleteQna(@PathVariable int qnaSno){ + + boolean result = false; + try { + result = cnsQnaService.deleteQna(qnaSno); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } /** @@ -89,14 +157,29 @@ public class CnsQnaController { * @param fileSno * @return */ - @GetMapping("/{qnaSno}/{fileSno}/delete") + @DeleteMapping("/file/{qnaSno}/{fileSno}") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 파일 개별삭제") - public ResponseEntity deleteQnaFile(@PathVariable int qnaSno, @PathVariable int fileSno){ + public ResponseEntity deleteQnaFile(@PathVariable int qnaSno, @PathVariable int fileSno){ log.warn("CnsQnaController - deleteQnaFile()"); - boolean result = cnsQnaService.deleteQnaFile(fileSno); + boolean result = false; + try { + result = cnsQnaService.deleteQnaFile(fileSno); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); - 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 c61de4e7..0d1de3cd 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 @@ -89,14 +89,13 @@ public class CnsQnaService { /** * Qna 업데이트하기 TODO :: File 업데이트 기능 아직 구현안함 - * @param qnaSno * @param rq * @return */ @Transactional - public boolean updateQna(int qnaSno, QnaInsertRQModel rq){ + public boolean updateQna(QnaInsertRQModel rq){ - CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y"); + CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(rq.getQnaSno(), 0, "N", "Y"); if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); List files = rq.getFiles(); 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 ada9e1c9..3184499b 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 @@ -359,8 +359,8 @@ public class ComnFileService { file.setDelYn("Y"); file.setDelUserId(userId); - file.setDelDt(Instant.now()); - + file.setDelDt(Instant.now()); + comFileBasRepository.save(file); return true; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java index b9fdaafe..1bca2046 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java @@ -1,12 +1,12 @@ package com.palnet.biz.jpa.entity; -import java.io.Serializable; -import java.time.Instant; +import lombok.Data; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; import javax.persistence.*; - -import lombok.Builder; -import lombok.Data; +import java.io.Serializable; +import java.time.Instant; @Entity @Data @@ -48,13 +48,15 @@ public class CnsQnaBas implements Serializable { @Column(name="CREATE_USER_ID") private String createUserId; - @Column(name="CREATE_DT") + @CreationTimestamp + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false) private Instant createDt; @Column(name="UPDATE_USER_ID") private String updateUserId; - @Column(name="UPDATE_DT") + @UpdateTimestamp + @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java index e3b092f1..c947ca57 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java @@ -45,7 +45,6 @@ public class CnsFaqQueryRepository { bas.content, bas.viewCnt, bas.expsrYn, - bas.delYn, bas.createUserId, bas.createDt, bas.updateUserId, @@ -65,7 +64,9 @@ public class CnsFaqQueryRepository { BooleanBuilder builder = new BooleanBuilder(); builder.and(bas.faqSno.eq(sno)); - + builder.and(bas.expsrYn.eq("Y")); + builder.and(bas.delYn.eq("N")); + FaqListModel r = query .select(Projections.bean( FaqListModel.class, @@ -75,7 +76,6 @@ public class CnsFaqQueryRepository { bas.content, bas.viewCnt, bas.expsrYn, - bas.delYn, bas.createUserId, bas.createDt, bas.updateUserId,