From b55bfc8c35f41a278712c25955a61de117c3e600 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Thu, 12 Oct 2023 16:06:41 +0900 Subject: [PATCH 01/20] =?UTF-8?q?Entity=20=EB=B0=8F=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/faq/controller/CnsFaqController.java | 13 ++++ .../biz/api/cns/faq/model/FaqRQModel.java | 8 +++ .../biz/api/cns/faq/model/FaqRSModel.java | 8 +++ .../api/cns/faq/service/CnsFaqService.java | 13 ++++ .../cns/qna/controller/CnsQnaController.java | 13 ++++ .../biz/api/cns/qna/model/QnaRQModel.java | 8 +++ .../biz/api/cns/qna/model/QnaRSModel.java | 8 +++ .../api/cns/qna/service/CnsQnaService.java | 13 ++++ .../com/palnet/biz/jpa/entity/CnsFaqBas.java | 53 +++++++++++++++++ .../com/palnet/biz/jpa/entity/CnsQnaBas.java | 59 +++++++++++++++++++ 10 files changed, 196 insertions(+) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRSModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRQModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRSModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java create mode 100644 pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsFaqBas.java create mode 100644 pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java new file mode 100644 index 0000000..d675fd7 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java @@ -0,0 +1,13 @@ +package com.palnet.biz.api.cns.faq.controller; + +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequiredArgsConstructor +public class CnsFaqController { + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java new file mode 100644 index 0000000..9f47071 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java @@ -0,0 +1,8 @@ +package com.palnet.biz.api.cns.faq.model; + +import lombok.Data; + +@Data +public class FaqRQModel { + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRSModel.java new file mode 100644 index 0000000..76b8f28 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRSModel.java @@ -0,0 +1,8 @@ +package com.palnet.biz.api.cns.faq.model; + +import lombok.Data; + +@Data +public class FaqRSModel { + +} 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 new file mode 100644 index 0000000..1f6d88d --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java @@ -0,0 +1,13 @@ +package com.palnet.biz.api.cns.faq.service; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@RequiredArgsConstructor +public class CnsFaqService { + +} 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 new file mode 100644 index 0000000..943d272 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java @@ -0,0 +1,13 @@ +package com.palnet.biz.api.cns.qna.controller; + +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@Slf4j +@RequiredArgsConstructor +public class CnsQnaController { + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRQModel.java new file mode 100644 index 0000000..1d6de86 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRQModel.java @@ -0,0 +1,8 @@ +package com.palnet.biz.api.cns.qna.model; + +import lombok.Data; + +@Data +public class QnaRQModel { + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRSModel.java new file mode 100644 index 0000000..0d17caa --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRSModel.java @@ -0,0 +1,8 @@ +package com.palnet.biz.api.cns.qna.model; + +import lombok.Data; + +@Data +public class QnaRSModel { + +} 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 new file mode 100644 index 0000000..187f4ce --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java @@ -0,0 +1,13 @@ +package com.palnet.biz.api.cns.qna.service; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@Slf4j +@RequiredArgsConstructor +public class CnsQnaService { + +} diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsFaqBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsFaqBas.java new file mode 100644 index 0000000..3cff6c4 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsFaqBas.java @@ -0,0 +1,53 @@ +package com.palnet.biz.jpa.entity; + +import java.io.Serializable; +import java.time.Instant; + +import javax.persistence.*; + +import lombok.Data; + +@Entity +@Data +@Table(name="CNS_FAQ_BAS") +@NamedQuery(name="CnsFaqBas.findAll", query="SELECT c FROM CnsFaqBas c") +public class CnsFaqBas implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="FAQ_SNO") + private int faqSno; + + @Column(name="CATEGORY") + private String category; + + @Column(name="TITLE") + private String title; + + @Column(name="CONTENT") + private String content; + + @Column(name="VIEW_CNT") + private int viewCnt = 0; + + @Column(name="EXPSR_YN") + private String expsrYn = "N"; + + @Column(name="DEL_YN") + private String delYn = "N"; + + @Column(name="CREATE_USER_ID") + private String createUserId; + + @Column(name="CREATE_DT") + private Instant createDt; + + @Column(name="UPDATE_USER_ID") + private String updateUserId; + + @Column(name="UPDATE_DT") + private Instant updateDt; + +} 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 new file mode 100644 index 0000000..d5e5166 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java @@ -0,0 +1,59 @@ +package com.palnet.biz.jpa.entity; + +import java.io.Serializable; +import java.time.Instant; + +import javax.persistence.*; + +import lombok.Data; + +@Entity +@Data +@Table(name="CNS_QNA_BAS") +@NamedQuery(name="CnsQnaBas.findAll", query="SELECT c FROM CnsQnaBas c") +public class CnsQnaBas implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="QNA_SNO") + private int qnaSno; + + @Column(name="TARGET_SNO") + private int targetSno; + + @Column(name="CATEGORY") + private String category; + + @Column(name="TITLE") + private String title; + + @Column(name="CONTENT") + private String content; + + @Column(name="FILE_GROUP_NO") + private int fileGroupNo; + + @Column(name="EXPSR_YN") + private String expsrYn = "N"; + + @Column(name="DEL_YN") + private String delYn = "N"; + + @Column(name="VIEW_CNT") + private int viewCnt = 0; + + @Column(name="CREATE_USER_ID") + private String createUserId; + + @Column(name="CREATE_DT") + private Instant createDt; + + @Column(name="UPDATE_USER_ID") + private String updateUserId; + + @Column(name="UPDATE_DT") + private Instant updateDt; + +} From 33d751629cb58046189bddf21cea947318fb3738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?qkr7828=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Thu, 12 Oct 2023 16:49:15 +0900 Subject: [PATCH 02/20] repo --- .../cns/faq/controller/CnsFaqController.java | 16 ++++++++++ .../biz/api/cns/faq/model/FaqListRQModel.java | 12 +++++++ .../biz/api/cns/faq/model/FaqListRSModel.java | 32 +++++++++++++++++++ .../biz/api/cns/faq/model/FaqRQModel.java | 8 ----- .../biz/api/cns/faq/model/FaqRSModel.java | 8 ----- .../repository/cns/CnsFaqBasRepository.java | 5 +++ .../repository/cns/CnsQnaBasRepository.java | 5 +++ .../repository/cns/CnsQueryRepository.java | 5 +++ 8 files changed, 75 insertions(+), 16 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java delete mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java delete mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRSModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java create mode 100644 pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaBasRepository.java create mode 100644 pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQueryRepository.java diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java index d675fd7..0078b2a 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java @@ -1,13 +1,29 @@ package com.palnet.biz.api.cns.faq.controller; +import java.util.List; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.palnet.biz.api.cns.faq.model.FaqListRQModel; +import com.palnet.biz.api.cns.faq.model.FaqListRSModel; + +import io.swagger.v3.oas.annotations.parameters.RequestBody; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @RestController @Slf4j @RequiredArgsConstructor +@RequestMapping(value = "/api/bas/cns") public class CnsFaqController { + @PostMapping("/list") + public List getFaqList(@RequestBody FaqListRQModel model) { + + List result = null; + + return result; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java new file mode 100644 index 0000000..4d59c31 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java @@ -0,0 +1,12 @@ +package com.palnet.biz.api.cns.faq.model; + +import lombok.Data; + +@Data +public class FaqListRQModel { + + private String category; + + private String word; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java new file mode 100644 index 0000000..dc27146 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java @@ -0,0 +1,32 @@ +package com.palnet.biz.api.cns.faq.model; + +import java.time.Instant; + +import lombok.Data; + +@Data +public class FaqListRSModel { + + private int qnaSno; + + private String category; + + private String title; + + private String content; + + private int viewCnt; + + private String expsrYn; + + private String delYn; + + private String createUserId; + + private Instant createDt; + + private String updateUserId; + + private Instant updateDt; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java deleted file mode 100644 index 9f47071..0000000 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.palnet.biz.api.cns.faq.model; - -import lombok.Data; - -@Data -public class FaqRQModel { - -} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRSModel.java deleted file mode 100644 index 76b8f28..0000000 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRSModel.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.palnet.biz.api.cns.faq.model; - -import lombok.Data; - -@Data -public class FaqRSModel { - -} diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java new file mode 100644 index 0000000..273ca20 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java @@ -0,0 +1,5 @@ +package com.palnet.biz.jpa.repository.cns; + +public class CnsFaqBasRepository { + +} 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 new file mode 100644 index 0000000..33c0751 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaBasRepository.java @@ -0,0 +1,5 @@ +package com.palnet.biz.jpa.repository.cns; + +public class CnsQnaBasRepository { + +} diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQueryRepository.java new file mode 100644 index 0000000..8be29d0 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQueryRepository.java @@ -0,0 +1,5 @@ +package com.palnet.biz.jpa.repository.cns; + +public class CnsQueryRepository { + +} From 0dd9e2267891467c1ad70462c183feb4aface963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?qkr7828=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Thu, 12 Oct 2023 16:50:19 +0900 Subject: [PATCH 03/20] . --- .../{CnsQueryRepository.java => CnsFaqQueryRepository.java} | 2 +- .../palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) rename pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/{CnsQueryRepository.java => CnsFaqQueryRepository.java} (55%) create mode 100644 pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java similarity index 55% rename from pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQueryRepository.java rename to pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java index 8be29d0..c270585 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java @@ -1,5 +1,5 @@ package com.palnet.biz.jpa.repository.cns; -public class CnsQueryRepository { +public class CnsFaqQueryRepository { } 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 new file mode 100644 index 0000000..545f3bd --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java @@ -0,0 +1,5 @@ +package com.palnet.biz.jpa.repository.cns; + +public class CnsQnaQueryRepository { + +} From c3b141bd854eca438223b31a1b10601d3fa7bd58 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Thu, 12 Oct 2023 16:55:52 +0900 Subject: [PATCH 04/20] =?UTF-8?q?QNA=20=EA=B8=B0=EB=B3=B8=EC=9E=91?= =?UTF-8?q?=EC=97=85=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/faq/controller/CnsFaqController.java | 58 ++++++++++++++++++- .../biz/api/cns/faq/model/FaqBasModel.java | 36 ++++++++++++ .../api/cns/faq/model/FaqInsertRQModel.java | 21 +++++++ .../biz/api/cns/faq/model/FaqRQModel.java | 8 --- .../comn/file/constant/ExtensionConstant.java | 20 +++++++ .../comn/file/service/ComnFileService.java | 9 +-- 6 files changed, 139 insertions(+), 13 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqBasModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqInsertRQModel.java delete mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java create mode 100644 pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java index d675fd7..4d2b4c6 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java @@ -1,13 +1,69 @@ package com.palnet.biz.api.cns.faq.controller; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +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 com.palnet.biz.api.cns.faq.model.FaqBasModel; +import com.palnet.biz.api.cns.faq.model.FaqInsertRQModel; +import com.palnet.biz.api.cns.qna.service.CnsQnaService; + +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -@RestController @Slf4j +@RestController @RequiredArgsConstructor +@RequestMapping("/api/cns/qna") +@Tag(name = "QNA", description = "QNA 관련 API") public class CnsFaqController { + + private final CnsQnaService cnsQnaService; + + @PostMapping(value = "/insert") + @Tag(name = "QNA", description = "QNA 관련 API") + @ApiOperation(value = "QnA 등록[답변추가]") + public ResponseEntity insertQna(@RequestBody FaqInsertRQModel rq){ + log.warn("CnsFaqController - insertQna()"); + log.warn("rq -> {}", rq); + + + return ResponseEntity.ok().body(null); + } + + @GetMapping("/select") + public ResponseEntity selectQna(@RequestBody FaqBasModel rq){ + log.warn("CnsFaqController - selectQna()"); + log.warn("rq -> {}", rq); + + + return ResponseEntity.ok().body(null); + } + + @PostMapping("/update") + public ResponseEntity updateQna(@RequestBody FaqBasModel rq){ + log.warn("CnsFaqController - updateQna()"); + log.warn("rq -> {}", rq); + + + return ResponseEntity.ok().body(null); + } + + @GetMapping("/delete") + public ResponseEntity deleteQna(@RequestBody FaqBasModel rq){ + log.warn("CnsFaqController - deleteQna()"); + log.warn("rq -> {}", rq); + + + return ResponseEntity.ok().body(null); + } + + + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqBasModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqBasModel.java new file mode 100644 index 0000000..6680c93 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqBasModel.java @@ -0,0 +1,36 @@ +package com.palnet.biz.api.cns.faq.model; + +import java.time.Instant; + +import lombok.Data; + +@Data +public class FaqBasModel { + + private int qnaSno; + + private int targetSno; + + private String category; + + private String title; + + private String content; + + private int fileGroupNo; + + private String expsrYn; + + private String delYn; + + private int viewCnt; + + private String createUserId; + + private Instant createDt; + + private String updateUserId; + + private Instant updateDt; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqInsertRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqInsertRQModel.java new file mode 100644 index 0000000..f2129ff --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqInsertRQModel.java @@ -0,0 +1,21 @@ +package com.palnet.biz.api.cns.faq.model; + +import java.util.List; + +import org.springframework.web.multipart.MultipartFile; + +import lombok.Data; + +@Data +public class FaqInsertRQModel { + + private int targetSno; // 상위 파일 번호 + + private String category; + + private String title; + + private String content; + + private List files; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java deleted file mode 100644 index 9f47071..0000000 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqRQModel.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.palnet.biz.api.cns.faq.model; - -import lombok.Data; - -@Data -public class FaqRQModel { - -} diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java new file mode 100644 index 0000000..0b74066 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java @@ -0,0 +1,20 @@ +package com.palnet.biz.api.comn.file.constant; + +public enum ExtensionConstant { + JPG(".jpg"), + PNG(".png"), + JPEG(".jpeg"), + PDF(".pdf"), + XLSX(".xlsx"), + XLS(".xls"), + HWPX(".hwpx"), + HWP(".hwp"), + + ; + + public final String extension; + + private ExtensionConstant(String extension) { + this.extension = extension; + } +} 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 8c5a86a..9faa543 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 @@ -1,6 +1,7 @@ package com.palnet.biz.api.comn.file.service; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; +import com.palnet.biz.api.comn.file.constant.ExtensionConstant; import com.palnet.biz.api.comn.file.model.LaancPdfModel; import com.palnet.biz.jpa.entity.ComFileBas; import com.palnet.biz.jpa.repository.com.ComFileBasRepository; @@ -30,9 +31,7 @@ public class ComnFileService { private final PdfUtils pdfUtils; private final JwtTokenUtil jwtTokenUtil; - private final ComFileBasRepository comFileBasRepository; - - private final String FILE_EXTENSION = ".pdf"; + private final ComFileBasRepository comFileBasRepository; /** * 파일명 만들기, 앞에 기본으로 금일 날짜있음 @@ -53,7 +52,9 @@ public class ComnFileService { .append(name); } - result.append(this.FILE_EXTENSION); + + + result.append(ExtensionConstant.PDF.extension); return result.toString(); } From 8443dbc260b874beb7346dd0be860cea3bc7f799 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Thu, 12 Oct 2023 17:43:52 +0900 Subject: [PATCH 05/20] =?UTF-8?q?Class=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/faq/controller/CnsFaqController.java | 43 +--------------- .../biz/api/cns/faq/model/FaqListRQModel.java | 6 +-- .../biz/api/cns/faq/model/FaqListRSModel.java | 24 --------- .../api/cns/faq/service/CnsFaqService.java | 4 +- .../cns/qna/controller/CnsQnaController.java | 51 +++++++++++++++++++ .../model/QnaBasModel.java} | 4 +- .../model/QnaInsertRQModel.java} | 4 +- .../api/cns/qna/service/CnsQnaService.java | 13 ++++- .../comn/file/service/ComnFileService.java | 39 +++++++++++++- .../resources/config/log/logback-spring.xml | 6 +-- 10 files changed, 113 insertions(+), 81 deletions(-) rename pav-server/src/main/java/com/palnet/biz/api/cns/{faq/model/FaqBasModel.java => qna/model/QnaBasModel.java} (86%) rename pav-server/src/main/java/com/palnet/biz/api/cns/{faq/model/FaqInsertRQModel.java => qna/model/QnaInsertRQModel.java} (79%) diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java index 4d2b4c6..00af21c 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java @@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.palnet.biz.api.cns.faq.model.FaqBasModel; -import com.palnet.biz.api.cns.faq.model.FaqInsertRQModel; +import com.palnet.biz.api.cns.qna.model.QnaBasModel; +import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; import com.palnet.biz.api.cns.qna.service.CnsQnaService; import io.swagger.annotations.ApiOperation; @@ -23,46 +23,7 @@ import lombok.extern.slf4j.Slf4j; @Tag(name = "QNA", description = "QNA 관련 API") public class CnsFaqController { - private final CnsQnaService cnsQnaService; - - @PostMapping(value = "/insert") - @Tag(name = "QNA", description = "QNA 관련 API") - @ApiOperation(value = "QnA 등록[답변추가]") - public ResponseEntity insertQna(@RequestBody FaqInsertRQModel rq){ - log.warn("CnsFaqController - insertQna()"); - log.warn("rq -> {}", rq); - - - return ResponseEntity.ok().body(null); - } - - @GetMapping("/select") - public ResponseEntity selectQna(@RequestBody FaqBasModel rq){ - log.warn("CnsFaqController - selectQna()"); - log.warn("rq -> {}", rq); - - - return ResponseEntity.ok().body(null); - } - - @PostMapping("/update") - public ResponseEntity updateQna(@RequestBody FaqBasModel rq){ - log.warn("CnsFaqController - updateQna()"); - log.warn("rq -> {}", rq); - - - return ResponseEntity.ok().body(null); - } - - @GetMapping("/delete") - public ResponseEntity deleteQna(@RequestBody FaqBasModel rq){ - log.warn("CnsFaqController - deleteQna()"); - log.warn("rq -> {}", rq); - - - return ResponseEntity.ok().body(null); - } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java index 4d59c31..1c8c7b6 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java @@ -4,9 +4,5 @@ import lombok.Data; @Data public class FaqListRQModel { - - private String category; - - private String word; - + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java index dc27146..1f6ae79 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java @@ -1,32 +1,8 @@ package com.palnet.biz.api.cns.faq.model; -import java.time.Instant; - import lombok.Data; @Data public class FaqListRSModel { - - private int qnaSno; - - private String category; - - private String title; - - private String content; - - private int viewCnt; - - private String expsrYn; - - private String delYn; - - private String createUserId; - - private Instant createDt; - - private String updateUserId; - - private Instant updateDt; } 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 1f6d88d..5ebb1a6 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 @@ -9,5 +9,7 @@ import lombok.extern.slf4j.Slf4j; @Service @RequiredArgsConstructor public class CnsFaqService { - + + + } 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 943d272..a41b102 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,7 +1,17 @@ package com.palnet.biz.api.cns.qna.controller; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import com.palnet.biz.api.cns.qna.model.QnaBasModel; +import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; +import com.palnet.biz.api.cns.qna.service.CnsQnaService; + +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -9,5 +19,46 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @RequiredArgsConstructor public class CnsQnaController { + + private final CnsQnaService cnsQnaService; + + @PostMapping(value = "/insert", consumes = "multipart/form-data") + @Tag(name = "QNA", description = "QNA 관련 API") + @ApiOperation(value = "QnA 등록[답변추가]") + public ResponseEntity insertQna(QnaInsertRQModel rq){ + log.warn("CnsFaqController - insertQna()"); + log.warn("rq -> {}", rq); + + + + return ResponseEntity.ok().body(null); + } + + @GetMapping("/select") + public ResponseEntity selectQna(@RequestBody QnaBasModel rq){ + log.warn("CnsFaqController - selectQna()"); + log.warn("rq -> {}", rq); + + + return ResponseEntity.ok().body(null); + } + + @PostMapping("/update") + public ResponseEntity updateQna(@RequestBody QnaBasModel rq){ + log.warn("CnsFaqController - updateQna()"); + log.warn("rq -> {}", rq); + + + return ResponseEntity.ok().body(null); + } + + @GetMapping("/delete") + public ResponseEntity deleteQna(@RequestBody QnaBasModel rq){ + log.warn("CnsFaqController - deleteQna()"); + log.warn("rq -> {}", rq); + + + return ResponseEntity.ok().body(null); + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqBasModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java similarity index 86% rename from pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqBasModel.java rename to pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java index 6680c93..907e69a 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqBasModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java @@ -1,11 +1,11 @@ -package com.palnet.biz.api.cns.faq.model; +package com.palnet.biz.api.cns.qna.model; import java.time.Instant; import lombok.Data; @Data -public class FaqBasModel { +public class QnaBasModel { private int qnaSno; diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqInsertRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java similarity index 79% rename from pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqInsertRQModel.java rename to pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java index f2129ff..22eb243 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqInsertRQModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java @@ -1,4 +1,4 @@ -package com.palnet.biz.api.cns.faq.model; +package com.palnet.biz.api.cns.qna.model; import java.util.List; @@ -7,7 +7,7 @@ import org.springframework.web.multipart.MultipartFile; import lombok.Data; @Data -public class FaqInsertRQModel { +public class QnaInsertRQModel { private int targetSno; // 상위 파일 번호 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 187f4ce..464e3ff 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 @@ -2,6 +2,9 @@ package com.palnet.biz.api.cns.qna.service; import org.springframework.stereotype.Service; +import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; +import com.palnet.biz.api.comn.file.service.ComnFileService; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -9,5 +12,13 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @RequiredArgsConstructor public class CnsQnaService { - + + + private final ComnFileService comnFileService; + + + public boolean insertQna(QnaInsertRQModel rq){ + + return 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 9faa543..addede7 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 @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.InputStream; import java.time.Instant; import java.util.Base64; +import java.util.List; @Slf4j @RequiredArgsConstructor @@ -103,14 +104,29 @@ public class ComnFileService { // DB Insert // ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileSnoDesc(); - ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileGroupNoDesc(); - int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; + int fileGroupNo = this.lastFileGroupNo(); comFileBas.setFileGroupNo(fileGroupNo); return comFileBasRepository.save(comFileBas); } + /** + * 다건 DB 인서트, 최신데이터 가져온 후 Group NO 1추가함 + * @param comFileBas + * @return + */ + public List saveAll(List comFileBas){ + + int fileGroupNo = this.lastFileGroupNo(); + + for(ComFileBas fileBas : comFileBas){ + fileBas.setFileGroupNo(fileGroupNo); + } + + return comFileBasRepository.saveAll(comFileBas); + } + /** * 파일 다운로드 * @@ -150,4 +166,23 @@ public class ComnFileService { } + public boolean fileUpload(ComFileBas comFileBas){ + + + + return true; + } + + /** + * 마지막 fileGroupNo 가져와 +1 후 반환 + * @return + */ + private int lastFileGroupNo(){ + ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileGroupNoDesc(); + int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; + + return fileGroupNo; + } + + } diff --git a/pav-server/src/main/resources/config/log/logback-spring.xml b/pav-server/src/main/resources/config/log/logback-spring.xml index abb43cd..ddc6235 100644 --- a/pav-server/src/main/resources/config/log/logback-spring.xml +++ b/pav-server/src/main/resources/config/log/logback-spring.xml @@ -37,11 +37,11 @@ - + @@ -62,7 +62,7 @@ - + From 73c1ed6f7383cb5ad52953396f82ffa8c59d6a8b Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Thu, 12 Oct 2023 17:45:31 +0900 Subject: [PATCH 06/20] . --- .../com/palnet/biz/api/cns/faq/controller/CnsFaqController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java index 00af21c..94ba5d1 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java @@ -19,7 +19,6 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @RestController @RequiredArgsConstructor -@RequestMapping("/api/cns/qna") @Tag(name = "QNA", description = "QNA 관련 API") public class CnsFaqController { From 80057475e5571f8f9309eb3be8fb8bc96ccf66cc Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Thu, 12 Oct 2023 17:51:54 +0900 Subject: [PATCH 07/20] =?UTF-8?q?=EB=A1=A4=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/faq/controller/CnsFaqController.java | 44 ++++++--- .../biz/api/cns/faq/model/FaqListRQModel.java | 8 +- .../biz/api/cns/faq/model/FaqListRSModel.java | 26 ++++- .../api/cns/faq/service/CnsFaqService.java | 30 +++++- .../repository/cns/CnsFaqQueryRepository.java | 99 ++++++++++++++++++- .../resources/config/log/logback-spring.xml | 6 +- 6 files changed, 188 insertions(+), 25 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java index 94ba5d1..c546ff7 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java @@ -1,29 +1,45 @@ package com.palnet.biz.api.cns.faq.controller; -import org.springframework.http.ResponseEntity; +import java.util.List; + import org.springframework.web.bind.annotation.GetMapping; 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 com.palnet.biz.api.cns.qna.model.QnaBasModel; -import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; -import com.palnet.biz.api.cns.qna.service.CnsQnaService; +import com.palnet.biz.api.cns.faq.model.FaqListRQModel; +import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.api.cns.faq.service.CnsFaqService; -import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.parameters.RequestBody; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -@Slf4j @RestController +@Slf4j @RequiredArgsConstructor -@Tag(name = "QNA", description = "QNA 관련 API") +@RequestMapping(value = "/api/bas/cns") public class CnsFaqController { - - - - -} + private final CnsFaqService service; + + @PostMapping("/list") + public List getFaqList(@RequestBody FaqListRQModel model) { + + List result = null; + + result = service.getFaqList(model); + + return result; + } + + @GetMapping("/detail") + public FaqListRSModel getFaqDetail(int sno) { + + FaqListRSModel result = null; + + result = service.getFaqDetail(sno); + + return result; + } +} \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java index 1c8c7b6..1be952d 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRQModel.java @@ -4,5 +4,9 @@ import lombok.Data; @Data public class FaqListRQModel { - -} + + private String category; + + private String word; + +} \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java index 1f6ae79..579b9e1 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java @@ -1,8 +1,32 @@ package com.palnet.biz.api.cns.faq.model; +import java.time.Instant; + import lombok.Data; @Data public class FaqListRSModel { + + private int qnaSno; + + private String category; + + private String title; + + private String content; + + private int viewCnt; + + private String expsrYn; + + private String delYn; + + private String createUserId; + + private Instant createDt; + + private String updateUserId; + + private Instant updateDt; -} +} \ No newline at end of file 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 5ebb1a6..cffac59 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 @@ -1,7 +1,13 @@ package com.palnet.biz.api.cns.faq.service; +import java.util.List; + import org.springframework.stereotype.Service; +import com.palnet.biz.api.cns.faq.model.FaqListRQModel; +import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.jpa.repository.cns.CnsFaqQueryRepository; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -9,7 +15,23 @@ import lombok.extern.slf4j.Slf4j; @Service @RequiredArgsConstructor public class CnsFaqService { - - - -} + + private final CnsFaqQueryRepository query; + + public List getFaqList(FaqListRQModel model){ + + List result = query.getFaqList(model.getCategory(), model.getWord()); + + return result; + + } + + public FaqListRSModel getFaqDetail(int sno){ + + FaqListRSModel result = query.getFaqDetail(sno); + + return result; + + } + +} \ No newline at end of file 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 c270585..f2ce636 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 @@ -1,5 +1,102 @@ package com.palnet.biz.jpa.repository.cns; +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel; +import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.jpa.entity.QCnsFaqBas; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.Projections; +import com.querydsl.jpa.impl.JPAQueryFactory; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Repository +@RequiredArgsConstructor public class CnsFaqQueryRepository { + + private final JPAQueryFactory query; + + public List getFaqList(String category, String word) { + + QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.delYn.eq("N")); + builder.and(bas.expsrYn.eq("Y")); + + if(category != null) { + builder.and(bas.category.eq(category)); + } + + if(word != null) { + builder.and(bas.title.contains(word)); + } + + List r = query + .select(Projections.bean( + FaqListRSModel.class, + bas.faqSno, + bas.category, + bas.title, + bas.content, + bas.viewCnt, + bas.expsrYn, + bas.delYn, + bas.createUserId, + bas.createDt, + bas.updateUserId, + bas.updateDt + )) + .from(bas) + .where(builder) + .fetch(); + + + return r; + } + + public FaqListRSModel getFaqDetail(int sno) { -} + QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.delYn.eq("N")); + builder.and(bas.expsrYn.eq("Y")); + +// if(category != null) { +// builder.and(bas.category.eq(category)); +// } +// +// if(word != null) { +// builder.and(bas.title.contains(word)); +// } + + FaqListRSModel r = query + .select(Projections.bean( + FaqListRSModel.class, + bas.faqSno, + bas.category, + bas.title, + bas.content, + bas.viewCnt, + bas.expsrYn, + bas.delYn, + bas.createUserId, + bas.createDt, + bas.updateUserId, + bas.updateDt + )) + .from(bas) + .where(builder) + .fetchOne(); + + + return r; + } + +} \ No newline at end of file diff --git a/pav-server/src/main/resources/config/log/logback-spring.xml b/pav-server/src/main/resources/config/log/logback-spring.xml index ddc6235..abb43cd 100644 --- a/pav-server/src/main/resources/config/log/logback-spring.xml +++ b/pav-server/src/main/resources/config/log/logback-spring.xml @@ -37,11 +37,11 @@ - + @@ -62,7 +62,7 @@ - + From d7037f9f9006f247e40e73a32f8c2bfdace31f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?qkr7828=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Thu, 12 Oct 2023 18:14:06 +0900 Subject: [PATCH 08/20] =?UTF-8?q?list=20,=20detail=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/cns/faq/service/CnsFaqService.java | 5 +++++ .../repository/cns/CnsFaqBasRepository.java | 19 ++++++++++++++++++- .../repository/cns/CnsFaqQueryRepository.java | 12 +----------- 3 files changed, 24 insertions(+), 12 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 cffac59..918b2a0 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 @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import com.palnet.biz.api.cns.faq.model.FaqListRQModel; import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.jpa.repository.cns.CnsFaqBasRepository; import com.palnet.biz.jpa.repository.cns.CnsFaqQueryRepository; import lombok.RequiredArgsConstructor; @@ -18,6 +19,8 @@ public class CnsFaqService { private final CnsFaqQueryRepository query; + private final CnsFaqBasRepository cnsFaqBasRepository; + public List getFaqList(FaqListRQModel model){ List result = query.getFaqList(model.getCategory(), model.getWord()); @@ -28,6 +31,8 @@ public class CnsFaqService { public FaqListRSModel getFaqDetail(int sno){ + cnsFaqBasRepository.updateViewCnt(sno); + FaqListRSModel result = query.getFaqDetail(sno); return result; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java index 273ca20..9492c50 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java @@ -1,5 +1,22 @@ package com.palnet.biz.jpa.repository.cns; -public class CnsFaqBasRepository { +import javax.transaction.Transactional; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import com.palnet.biz.jpa.entity.CnsFaqBas; + +@Repository +public interface CnsFaqBasRepository extends JpaRepository{ + + @Modifying + @Transactional + @Query("update CnsFaqBas c set c.viewCnt = c.viewCnt + 1" + + "where c.faqSno = :sno") + void updateViewCnt(@Param("sno") int sno); + } 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 f2ce636..066a9db 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 @@ -4,7 +4,6 @@ import java.util.List; import org.springframework.stereotype.Repository; -import com.palnet.biz.api.bas.flight.model.BasFlightPlanPilotModel; import com.palnet.biz.api.cns.faq.model.FaqListRSModel; import com.palnet.biz.jpa.entity.QCnsFaqBas; import com.querydsl.core.BooleanBuilder; @@ -65,16 +64,7 @@ public class CnsFaqQueryRepository { QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.delYn.eq("N")); - builder.and(bas.expsrYn.eq("Y")); - -// if(category != null) { -// builder.and(bas.category.eq(category)); -// } -// -// if(word != null) { -// builder.and(bas.title.contains(word)); -// } + builder.and(bas.faqSno.eq(sno)); FaqListRSModel r = query .select(Projections.bean( From fceb5159cfb91341d0462a2aaa1ef04ec3b1ad9e Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Thu, 12 Oct 2023 20:22:50 +0900 Subject: [PATCH 09/20] =?UTF-8?q?file=EC=97=85=EB=A1=9C=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 --- .../cns/qna/controller/CnsQnaController.java | 12 +- .../api/cns/qna/service/CnsQnaService.java | 11 + .../comn/file/constant/ExtensionConstant.java | 19 ++ .../comn/file/service/ComnFileService.java | 190 +++++++++++++++--- .../java/com/palnet/comn/utils/PdfUtils.java | 53 +---- 5 files changed, 199 insertions(+), 86 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 a41b102..a49b42a 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,9 +1,12 @@ package com.palnet.biz.api.cns.qna.controller; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.util.MimeType; import org.springframework.web.bind.annotation.GetMapping; 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 com.palnet.biz.api.cns.qna.model.QnaBasModel; @@ -18,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; @RestController @Slf4j @RequiredArgsConstructor +@RequestMapping("/api/cns/qna") public class CnsQnaController { private final CnsQnaService cnsQnaService; @@ -27,10 +31,9 @@ public class CnsQnaController { @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 등록[답변추가]") public ResponseEntity insertQna(QnaInsertRQModel rq){ - log.warn("CnsFaqController - insertQna()"); - log.warn("rq -> {}", rq); + log.warn("CnsFaqController - insertQna()"); - + cnsQnaService.insertQna(rq); return ResponseEntity.ok().body(null); } @@ -56,8 +59,7 @@ public class CnsQnaController { @GetMapping("/delete") public ResponseEntity deleteQna(@RequestBody QnaBasModel rq){ log.warn("CnsFaqController - deleteQna()"); - log.warn("rq -> {}", rq); - + log.warn("rq -> {}", rq); return ResponseEntity.ok().body(null); } 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 464e3ff..d62186c 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 @@ -1,9 +1,15 @@ package com.palnet.biz.api.cns.qna.service; +import java.util.List; + +import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; import com.palnet.biz.api.comn.file.service.ComnFileService; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,6 +24,11 @@ public class CnsQnaService { public boolean insertQna(QnaInsertRQModel rq){ + log.warn("CnsQnaService - insertQna()"); + + List files = rq.getFiles(); + + comnFileService.fileUpload(files); return true; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java index 0b74066..295a809 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java @@ -1,5 +1,7 @@ package com.palnet.biz.api.comn.file.constant; +import java.util.HashSet; + public enum ExtensionConstant { JPG(".jpg"), PNG(".png"), @@ -14,7 +16,24 @@ public enum ExtensionConstant { public final String extension; + public HashSet hashExtension; + private ExtensionConstant(String extension) { this.extension = extension; } + + public static ExtensionConstant fromExtension(String extension) { + try { + for (ExtensionConstant constant : ExtensionConstant.values()) { + if (constant.extension.equals(extension)) { + + return constant; + } + } + } catch (Exception e) { + return null; + } + + return null; + } } 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 addede7..c774be7 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 @@ -1,5 +1,30 @@ package com.palnet.biz.api.comn.file.service; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Instant; +import java.util.List; +import java.util.Objects; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.transaction.Transactional; + +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.comn.file.constant.ExtensionConstant; import com.palnet.biz.api.comn.file.model.LaancPdfModel; @@ -9,21 +34,9 @@ import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; import com.palnet.comn.utils.InstantUtils; import com.palnet.comn.utils.PdfUtils; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; -import org.springframework.core.io.ClassPathResource; -import org.springframework.stereotype.Service; - -import javax.transaction.Transactional; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.time.Instant; -import java.util.Base64; -import java.util.List; @Slf4j @RequiredArgsConstructor @@ -33,6 +46,12 @@ public class ComnFileService { private final PdfUtils pdfUtils; private final JwtTokenUtil jwtTokenUtil; private final ComFileBasRepository comFileBasRepository; + private final HttpServletRequest request; + private final HttpServletResponse response; + + + @Value("${base-url}") + private String BASE_PATH; /** * 파일명 만들기, 앞에 기본으로 금일 날짜있음 @@ -41,7 +60,7 @@ public class ComnFileService { * @param etcName * @return */ - private String getLaancSaveName(String... etcName) { + private String getLaancSaveName(ExtensionConstant extension, String... etcName) { String date = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss"); @@ -53,9 +72,7 @@ public class ComnFileService { .append(name); } - - - result.append(ExtensionConstant.PDF.extension); + result.append(extension.extension); return result.toString(); } @@ -70,7 +87,7 @@ public class ComnFileService { String airUser = model.getPilotName(); String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 - String fileName = getLaancSaveName(airUser, etc); + String fileName = getLaancSaveName(ExtensionConstant.PDF, airUser, etc); // TODO 추후 img tag의 src로 들어가는 이미지들을 base64로 변환하여 html에 넣어줘야함 // images 넣기(임시) @@ -137,10 +154,133 @@ public class ComnFileService { ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null); if (comFileBas == null) throw new CustomException(ErrorCode.DATA_NOTFIND); - pdfUtils.fileDownload(comFileBas); + InputStream inputStream = null; + OutputStream outputStream = null; + try { + File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); + inputStream = new FileInputStream(pdfFile); + + String fileOriName = comFileBas.getFileOriNm(); + fileOriName = URLEncoder.encode(comFileBas.getFileOriNm(), StandardCharsets.UTF_8); + + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileOriName + "\""); + // response.setContentLengthLong(Long.parseLong(comFileBas.getFileSize())); + // response.setStatus(HttpServletResponse.SC_OK); + + outputStream = response.getOutputStream(); + + byte[] buffer = new byte[1024]; //1KB 설정 + int length; + + while ((length = inputStream.read(buffer)) != -1) { + outputStream.write(buffer); + } + + } catch (FileNotFoundException e) { + throw new CustomException(ErrorCode.DATA_NO); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (outputStream != null) { + Objects.requireNonNull(outputStream).flush(); + outputStream.close(); + } + + if (inputStream != null) { + inputStream.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + } + + } + + public boolean fileUpload(List files){ + + if(!this.validCheck(files)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); + + String fileGroupNo = lastFileGroupNo().toString(); + + // TODO : 절대경로 + String absPath = "/Users/igyeongdo/WokrSpace/"; + + String fileUrl = new StringBuilder() + .append(absPath) + .append(this.BASE_PATH) + .append(InstantUtils.toDateStringByFormat(Instant.now(), "yyyyMMdd")) + .append("/") + .toString(); + + + + + for(MultipartFile file : files){ + + String oriNm = file.getOriginalFilename(); + String extension = oriNm.substring(oriNm.lastIndexOf(".")); + String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 + String fileName = this.getLaancSaveName(ExtensionConstant.fromExtension(extension), fileGroupNo, "qna", etc); + + log.error("fileName -> {}", fileName); + + try { + + Path directoryPath = Paths.get(fileUrl); + if (!Files.exists(directoryPath)) { + Files.createDirectories(directoryPath); + } + // 파일 저장 경로 + String filePath = fileUrl + fileName; + + File saveFile = new File(filePath); + file.transferTo(saveFile); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + + return true; } + /** + * 정해진 확장자만 올 수 있도록 validation처리, + * TODO :: 혹시 mime 타입으로 확인하여 처리해야 할까요? + * @param files + * @return + */ + private boolean validCheck(List files){ + + for(MultipartFile file : files){ + + try { + String oriNm = file.getOriginalFilename(); + String extension = oriNm.substring(oriNm.lastIndexOf(".")); + + ExtensionConstant constants = ExtensionConstant.fromExtension(extension); + + // 허락된 확장자가 아닐 경우 return false + if(constants == null) return false; + + + } catch (Exception e) { + // 확장자가 없는 파일일 경우 return false; + return false; + } + + } + + return true; + } + + public String imagesToBase64ForSrc(String path) { StringBuilder str = new StringBuilder(); ClassPathResource resource = new ClassPathResource(path); @@ -164,20 +304,12 @@ public class ComnFileService { } return str.toString(); } - - - public boolean fileUpload(ComFileBas comFileBas){ - - - - return true; - } - + /** * 마지막 fileGroupNo 가져와 +1 후 반환 * @return */ - private int lastFileGroupNo(){ + private Integer lastFileGroupNo(){ ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileGroupNoDesc(); int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; diff --git a/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java index 242c7a3..d9cda03 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java @@ -161,56 +161,5 @@ public class PdfUtils { return result; } - - /** - * 파일 Download - * - * @param comFileBas - */ - public void fileDownload(ComFileBas comFileBas) { - InputStream inputStream = null; - OutputStream outputStream = null; - - try { - File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); - inputStream = new FileInputStream(pdfFile); - - String fileOriName = comFileBas.getFileOriNm(); - fileOriName = URLEncoder.encode(comFileBas.getFileOriNm(), StandardCharsets.UTF_8); - - response.setContentType("application/octet-stream"); - response.setCharacterEncoding("UTF-8"); - response.setHeader("Content-Disposition", "attachment; filename=\"" + fileOriName + "\""); - // response.setContentLengthLong(Long.parseLong(comFileBas.getFileSize())); - // response.setStatus(HttpServletResponse.SC_OK); - - outputStream = response.getOutputStream(); - - byte[] buffer = new byte[1024]; //1KB 설정 - int length; - - while ((length = inputStream.read(buffer)) != -1) { - outputStream.write(buffer); - } - - } catch (FileNotFoundException e) { - throw new CustomException(ErrorCode.DATA_NO); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (outputStream != null) { - Objects.requireNonNull(outputStream).flush(); - outputStream.close(); - } - - if (inputStream != null) { - inputStream.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - - } - } + } From 3d029ec84e26316f214c10ef6ef4c918ffdaff2c Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Thu, 12 Oct 2023 20:34:06 +0900 Subject: [PATCH 10/20] =?UTF-8?q?DB=20Insert=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comn/file/service/ComnFileService.java | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) 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 c774be7..da0631e 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 @@ -12,6 +12,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -205,7 +206,7 @@ public class ComnFileService { if(!this.validCheck(files)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); - String fileGroupNo = lastFileGroupNo().toString(); + Integer fileGroupNo = lastFileGroupNo(); // TODO : 절대경로 String absPath = "/Users/igyeongdo/WokrSpace/"; @@ -215,22 +216,25 @@ public class ComnFileService { .append(this.BASE_PATH) .append(InstantUtils.toDateStringByFormat(Instant.now(), "yyyyMMdd")) .append("/") - .toString(); - - - + .toString(); - for(MultipartFile file : files){ + List comFileBas = new ArrayList<>(); + for(MultipartFile file : files){ String oriNm = file.getOriginalFilename(); String extension = oriNm.substring(oriNm.lastIndexOf(".")); String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 - String fileName = this.getLaancSaveName(ExtensionConstant.fromExtension(extension), fileGroupNo, "qna", etc); + String fileName = this.getLaancSaveName(ExtensionConstant.fromExtension(extension), fileGroupNo.toString(), "qna", etc); - log.error("fileName -> {}", fileName); - - try { - + ComFileBas node = new ComFileBas(); + node.setFileGroupNo(fileGroupNo); + node.setFilePath(fileUrl); + node.setFileExt(extension); + node.setCreateDt(Instant.now()); + node.setFileSaveNm(fileName); + node.setFileOriNm(oriNm); + + try { Path directoryPath = Paths.get(fileUrl); if (!Files.exists(directoryPath)) { Files.createDirectories(directoryPath); @@ -240,12 +244,21 @@ public class ComnFileService { File saveFile = new File(filePath); file.transferTo(saveFile); + + long fileSize = Files.size(Paths.get(filePath)) / 1024; + node.setFileSize(String.valueOf(fileSize)); } catch (IOException e) { e.printStackTrace(); } + String userId = jwtTokenUtil.getUserIdByToken(); + if (userId == null) userId = "NONE"; + node.setCreateUserId(userId); + + comFileBas.add(node); } + this.saveAll(comFileBas); return true; } From 69e44f00d8427bbff540aa5a00c355c0d177b9e3 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Fri, 13 Oct 2023 11:02:11 +0900 Subject: [PATCH 11/20] =?UTF-8?q?Qna=20=EC=B6=94=EA=B0=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/qna/controller/CnsQnaController.java | 4 +- .../api/cns/qna/model/QnaInsertRQModel.java | 2 +- .../api/cns/qna/service/CnsQnaService.java | 31 ++++++++++++--- .../comn/file/service/ComnFileService.java | 38 +++++++++---------- .../com/palnet/biz/jpa/entity/CnsQnaBas.java | 1 + .../repository/cns/CnsQnaBasRepository.java | 8 +++- 6 files changed, 55 insertions(+), 29 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 a49b42a..0782b19 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 @@ -33,9 +33,9 @@ public class CnsQnaController { public ResponseEntity insertQna(QnaInsertRQModel rq){ log.warn("CnsFaqController - insertQna()"); - cnsQnaService.insertQna(rq); + boolean success = cnsQnaService.insertQna(rq); - return ResponseEntity.ok().body(null); + return ResponseEntity.ok().body(success); } @GetMapping("/select") diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java index 22eb243..086f2ba 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java @@ -9,7 +9,7 @@ import lombok.Data; @Data public class QnaInsertRQModel { - private int targetSno; // 상위 파일 번호 + private Integer targetSno; // 상위 파일 번호 private String category; 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 d62186c..7c874dc 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 @@ -1,15 +1,16 @@ package com.palnet.biz.api.cns.qna.service; +import java.time.Instant; import java.util.List; -import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; import com.palnet.biz.api.comn.file.service.ComnFileService; -import com.palnet.comn.code.ErrorCode; -import com.palnet.comn.exception.CustomException; +import com.palnet.biz.jpa.entity.CnsQnaBas; +import com.palnet.biz.jpa.repository.cns.CnsQnaBasRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,14 +22,34 @@ public class CnsQnaService { private final ComnFileService comnFileService; + + private final CnsQnaBasRepository cnsQnaBasRepository; + + private final JwtTokenUtil jwtTokenUtil; public boolean insertQna(QnaInsertRQModel rq){ log.warn("CnsQnaService - insertQna()"); List files = rq.getFiles(); - - comnFileService.fileUpload(files); + int fileGroupNo = comnFileService.fileUpload(files); + String userId = jwtTokenUtil.getUserIdByToken(); + + if (userId == null) userId = "NONE"; + + CnsQnaBas cnsQnaBas = new CnsQnaBas(); + cnsQnaBas.setCategory(rq.getCategory()); + cnsQnaBas.setTitle(rq.getTitle()); + cnsQnaBas.setContent(rq.getContent()); + cnsQnaBas.setFileGroupNo(fileGroupNo); + cnsQnaBas.setCreateDt(Instant.now()); + cnsQnaBas.setCreateUserId(userId); + cnsQnaBas.setUpdateDt(Instant.now()); + cnsQnaBas.setUpdateUserId(userId); + + if(rq.getTargetSno() != null) cnsQnaBas.setTargetSno(rq.getTargetSno()); + + cnsQnaBasRepository.save(cnsQnaBas); return 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 da0631e..bc5d1b9 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 @@ -16,7 +16,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.transaction.Transactional; @@ -47,7 +46,6 @@ public class ComnFileService { private final PdfUtils pdfUtils; private final JwtTokenUtil jwtTokenUtil; private final ComFileBasRepository comFileBasRepository; - private final HttpServletRequest request; private final HttpServletResponse response; @@ -202,7 +200,7 @@ public class ComnFileService { } - public boolean fileUpload(List files){ + public Integer fileUpload(List files){ if(!this.validCheck(files)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); @@ -226,14 +224,6 @@ public class ComnFileService { String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 String fileName = this.getLaancSaveName(ExtensionConstant.fromExtension(extension), fileGroupNo.toString(), "qna", etc); - ComFileBas node = new ComFileBas(); - node.setFileGroupNo(fileGroupNo); - node.setFilePath(fileUrl); - node.setFileExt(extension); - node.setCreateDt(Instant.now()); - node.setFileSaveNm(fileName); - node.setFileOriNm(oriNm); - try { Path directoryPath = Paths.get(fileUrl); if (!Files.exists(directoryPath)) { @@ -245,22 +235,30 @@ public class ComnFileService { File saveFile = new File(filePath); file.transferTo(saveFile); - long fileSize = Files.size(Paths.get(filePath)) / 1024; - + long fileSize = Files.size(Paths.get(filePath)) / 1024; + + String userId = jwtTokenUtil.getUserIdByToken(); + if (userId == null) userId = "NONE"; + + ComFileBas node = new ComFileBas(); + node.setFileGroupNo(fileGroupNo); + node.setFilePath(fileUrl); + node.setFileExt(extension); + node.setCreateDt(Instant.now()); + node.setCreateUserId(userId); + node.setFileSaveNm(fileName); + node.setFileOriNm(oriNm); node.setFileSize(String.valueOf(fileSize)); + + comFileBas.add(node); } catch (IOException e) { e.printStackTrace(); - } - String userId = jwtTokenUtil.getUserIdByToken(); - if (userId == null) userId = "NONE"; - node.setCreateUserId(userId); - - comFileBas.add(node); + } } this.saveAll(comFileBas); - return true; + return fileGroupNo; } /** 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 d5e5166..57ebd1f 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 @@ -5,6 +5,7 @@ import java.time.Instant; import javax.persistence.*; +import lombok.Builder; import lombok.Data; @Entity 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 33c0751..d8406d9 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 @@ -1,5 +1,11 @@ package com.palnet.biz.jpa.repository.cns; -public class CnsQnaBasRepository { +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.palnet.biz.jpa.entity.CnsQnaBas; + +@Repository +public interface CnsQnaBasRepository extends JpaRepository{ } From 5c282da7d86e6fd855305e5c445b93ed1ae31242 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Fri, 13 Oct 2023 11:27:07 +0900 Subject: [PATCH 12/20] =?UTF-8?q?QnaList=20=EC=A1=B0=ED=9A=8C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/qna/controller/CnsQnaController.java | 34 ++++++++--- .../biz/api/cns/qna/model/QnaRSModel.java | 27 ++++++++- .../api/cns/qna/model/QnaSelectListRQ.java | 11 ++++ .../api/cns/qna/service/CnsQnaService.java | 31 +++++++++- .../repository/cns/CnsQnaQueryRepository.java | 58 +++++++++++++++++++ 5 files changed, 149 insertions(+), 12 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java 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 0782b19..ffc869e 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,16 +1,20 @@ package com.palnet.biz.api.cns.qna.controller; -import org.springframework.http.MediaType; +import java.util.List; + import org.springframework.http.ResponseEntity; -import org.springframework.util.MimeType; 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.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 io.swagger.annotations.ApiOperation; @@ -30,25 +34,39 @@ public class CnsQnaController { @PostMapping(value = "/insert", consumes = "multipart/form-data") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 등록[답변추가]") - public ResponseEntity insertQna(QnaInsertRQModel rq){ + public ResponseEntity insertQna(QnaInsertRQModel rq){ log.warn("CnsFaqController - insertQna()"); - boolean success = cnsQnaService.insertQna(rq); + boolean success = cnsQnaService.insertQna(rq); + + QnaRSModel rs = new QnaRSModel(success); - return ResponseEntity.ok().body(success); + return ResponseEntity.ok().body(rs); } @GetMapping("/select") - public ResponseEntity selectQna(@RequestBody QnaBasModel rq){ + @Tag(name = "QNA", description = "QNA 관련 API") + @ApiOperation(value = "QnA 리스트 조회") + public ResponseEntity selectQna(QnaSelectListRQ rq){ + log.warn("CnsFaqController - selectQna()"); + + List result = cnsQnaService.selectQnaList(rq); + + return ResponseEntity.ok().body(result); + } + + @GetMapping("/detail/{qnaSno}") + public ResponseEntity detailQna(@PathVariable int qnaSno){ log.warn("CnsFaqController - selectQna()"); - log.warn("rq -> {}", rq); + log.warn("rq -> {}", qnaSno); + return ResponseEntity.ok().body(null); } @PostMapping("/update") - public ResponseEntity updateQna(@RequestBody QnaBasModel rq){ + public ResponseEntity updateQna(@RequestBody QnaInsertRQModel rq){ log.warn("CnsFaqController - updateQna()"); log.warn("rq -> {}", rq); diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRSModel.java index 0d17caa..9295a36 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRSModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRSModel.java @@ -3,6 +3,31 @@ package com.palnet.biz.api.cns.qna.model; import lombok.Data; @Data -public class QnaRSModel { +public class QnaRSModel{ + + private int code; + + private String desc; + + private Object body; + + public QnaRSModel() { + this.code = 200; + } + + public QnaRSModel(Object body){ + this.code = 200; + this.body = body; + } + public QnaRSModel(int code, Object body){ + this.code = code; + this.body = body; + } + + public QnaRSModel(int code, String desc, Object body){ + this.code = code; + this.desc = desc; + this.body = body; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java new file mode 100644 index 0000000..ccd1b76 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java @@ -0,0 +1,11 @@ +package com.palnet.biz.api.cns.qna.model; + +import lombok.Data; + +@Data +public class QnaSelectListRQ { + + private String word; + + private String category; +} 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 7c874dc..e7f8145 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 @@ -3,14 +3,19 @@ package com.palnet.biz.api.cns.qna.service; import java.time.Instant; import java.util.List; +import javax.transaction.Transactional; + import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; +import com.palnet.biz.api.cns.qna.model.QnaBasModel; import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; +import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ; import com.palnet.biz.api.comn.file.service.ComnFileService; import com.palnet.biz.jpa.entity.CnsQnaBas; import com.palnet.biz.jpa.repository.cns.CnsQnaBasRepository; +import com.palnet.biz.jpa.repository.cns.CnsQnaQueryRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -25,16 +30,34 @@ public class CnsQnaService { private final CnsQnaBasRepository cnsQnaBasRepository; + private final CnsQnaQueryRepository cnsQnaQueryRepository; + private final JwtTokenUtil jwtTokenUtil; + public List selectQnaList(QnaSelectListRQ rq){ + log.warn("CnsQnaService - selectQnaList()"); + log.warn("rq -> {}", rq); + + List result = cnsQnaQueryRepository.getQnaList(rq.getCategory(), rq.getCategory()); + + return result; + } + + + /** + * QnaInsert + * @param rq + * @return + */ + @Transactional public boolean insertQna(QnaInsertRQModel rq){ - log.warn("CnsQnaService - insertQna()"); List files = rq.getFiles(); - int fileGroupNo = comnFileService.fileUpload(files); - String userId = jwtTokenUtil.getUserIdByToken(); + int fileGroupNo = comnFileService.fileUpload(files); // File 업로드 + String userId = jwtTokenUtil.getUserIdByToken(); + if (userId == null) userId = "NONE"; CnsQnaBas cnsQnaBas = new CnsQnaBas(); @@ -53,4 +76,6 @@ public class CnsQnaService { return true; } + + } 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 545f3bd..637a6a7 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 @@ -1,5 +1,63 @@ package com.palnet.biz.jpa.repository.cns; +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.api.cns.qna.model.QnaBasModel; +import com.palnet.biz.jpa.entity.QCnsFaqBas; +import com.palnet.biz.jpa.entity.QCnsQnaBas; +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.Projections; +import com.querydsl.jpa.impl.JPAQueryFactory; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Repository +@RequiredArgsConstructor public class CnsQnaQueryRepository { + private final JPAQueryFactory query; + + public List getQnaList(String category, String word) { + + QCnsQnaBas bas = QCnsQnaBas.cnsQnaBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.delYn.eq("N")); + builder.and(bas.expsrYn.eq("Y")); + + if(category != null) { + builder.and(bas.category.eq(category)); + } + + if(word != null) { + builder.and(bas.title.contains(word)); + } + + List r = query + .select(Projections.bean( + QnaBasModel.class, + bas.qnaSno, + bas.category, + bas.title, + bas.content, + bas.fileGroupNo, + bas.viewCnt, + bas.expsrYn, + bas.delYn, + bas.createUserId, + bas.createDt, + bas.updateUserId, + bas.updateDt + )) + .from(bas) + .where(builder) + .fetch(); + + return r; + } } From edc3503cc7dc9f407b29fcd0c1bb8f35ba3320d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?qkr7828=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Fri, 13 Oct 2023 13:50:42 +0900 Subject: [PATCH 13/20] . --- .../palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java | 2 -- 1 file changed, 2 deletions(-) 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 637a6a7..b166815 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 @@ -4,9 +4,7 @@ import java.util.List; import org.springframework.stereotype.Repository; -import com.palnet.biz.api.cns.faq.model.FaqListRSModel; import com.palnet.biz.api.cns.qna.model.QnaBasModel; -import com.palnet.biz.jpa.entity.QCnsFaqBas; import com.palnet.biz.jpa.entity.QCnsQnaBas; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; From 227302dc70636bfbf9f82f40b6933f25f50561b9 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Fri, 13 Oct 2023 14:21:26 +0900 Subject: [PATCH 14/20] =?UTF-8?q?Qna=20=EC=83=81=EC=84=B8=20=EB=B6=88?= =?UTF-8?q?=EB=9F=AC=EC=98=A4=EA=B8=B0=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 | 14 +- .../biz/api/cns/qna/model/QnaBasModel.java | 2 +- .../api/cns/qna/model/QnaDetailRSModel.java | 34 +++++ .../api/cns/qna/model/QnaInsertRQModel.java | 2 +- .../biz/api/cns/qna/model/QnaRQModel.java | 8 -- .../api/cns/qna/service/CnsQnaService.java | 83 ++++++++++-- .../repository/cns/CnsQnaBasRepository.java | 5 + .../repository/cns/CnsQnaQueryRepository.java | 120 +++++++++++++----- .../repository/com/ComFileBasRepository.java | 5 + 9 files changed, 211 insertions(+), 62 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java delete mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRQModel.java 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 ffc869e..a5afd61 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 @@ -12,6 +12,7 @@ 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; @@ -47,7 +48,7 @@ public class CnsQnaController { @GetMapping("/select") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 리스트 조회") - public ResponseEntity selectQna(QnaSelectListRQ rq){ + public ResponseEntity> selectQna(QnaSelectListRQ rq){ log.warn("CnsFaqController - selectQna()"); List result = cnsQnaService.selectQnaList(rq); @@ -55,17 +56,18 @@ public class CnsQnaController { return ResponseEntity.ok().body(result); } - @GetMapping("/detail/{qnaSno}") + + @GetMapping("/{qnaSno}/detail") public ResponseEntity detailQna(@PathVariable int qnaSno){ log.warn("CnsFaqController - selectQna()"); log.warn("rq -> {}", qnaSno); + List reulst = cnsQnaService.getQnaDetail(qnaSno); - - return ResponseEntity.ok().body(null); + return ResponseEntity.ok().body(reulst); } - @PostMapping("/update") + @PostMapping("/{qnaSno}/update") public ResponseEntity updateQna(@RequestBody QnaInsertRQModel rq){ log.warn("CnsFaqController - updateQna()"); log.warn("rq -> {}", rq); @@ -74,7 +76,7 @@ public class CnsQnaController { return ResponseEntity.ok().body(null); } - @GetMapping("/delete") + @GetMapping("/{qnaSno}/delete") public ResponseEntity deleteQna(@RequestBody QnaBasModel rq){ log.warn("CnsFaqController - deleteQna()"); log.warn("rq -> {}", rq); diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java index 907e69a..945df59 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java @@ -15,7 +15,7 @@ public class QnaBasModel { private String title; - private String content; + private String content; private int fileGroupNo; diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java new file mode 100644 index 0000000..c86bf5c --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java @@ -0,0 +1,34 @@ +package com.palnet.biz.api.cns.qna.model; + +import java.time.Instant; +import java.util.List; + +import com.palnet.biz.jpa.entity.ComFileBas; + +import lombok.Data; + +@Data +public class QnaDetailRSModel { + + private int qnaSno; + + private int targetSno; + + private String category; + + private String title; + + private String content; + + private Integer viewCnt; + + private String createUserId; + + private Instant createDt; + + private String updateUserId; + + private Instant updateDt; + + private List files; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java index 086f2ba..78f5d21 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java @@ -9,7 +9,7 @@ import lombok.Data; @Data public class QnaInsertRQModel { - private Integer targetSno; // 상위 파일 번호 + private Integer targetSno; // 상위 Qna 번호 private String category; diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRQModel.java deleted file mode 100644 index 1d6de86..0000000 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaRQModel.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.palnet.biz.api.cns.qna.model; - -import lombok.Data; - -@Data -public class QnaRQModel { - -} 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 e7f8145..be99fa7 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 @@ -1,6 +1,7 @@ package com.palnet.biz.api.cns.qna.service; import java.time.Instant; +import java.util.ArrayList; import java.util.List; import javax.transaction.Transactional; @@ -10,12 +11,15 @@ import org.springframework.web.multipart.MultipartFile; import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; 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.QnaSelectListRQ; import com.palnet.biz.api.comn.file.service.ComnFileService; import com.palnet.biz.jpa.entity.CnsQnaBas; +import com.palnet.biz.jpa.entity.ComFileBas; import com.palnet.biz.jpa.repository.cns.CnsQnaBasRepository; import com.palnet.biz.jpa.repository.cns.CnsQnaQueryRepository; +import com.palnet.biz.jpa.repository.com.ComFileBasRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -25,25 +29,80 @@ import lombok.extern.slf4j.Slf4j; @RequiredArgsConstructor public class CnsQnaService { - private final ComnFileService comnFileService; private final CnsQnaBasRepository cnsQnaBasRepository; private final CnsQnaQueryRepository cnsQnaQueryRepository; + private final ComFileBasRepository comFileBasRepository; + private final JwtTokenUtil jwtTokenUtil; - public List selectQnaList(QnaSelectListRQ rq){ - log.warn("CnsQnaService - selectQnaList()"); - log.warn("rq -> {}", rq); - List result = cnsQnaQueryRepository.getQnaList(rq.getCategory(), rq.getCategory()); + /** + * Qna 상세불러오기 + * @param qnaSno + * @return + */ + public List getQnaDetail(int qnaSno){ + + QnaBasModel qnaBasModel = cnsQnaQueryRepository.getQnaDetail(qnaSno).get(0); + List files = null; + if(qnaBasModel.getFileGroupNo() != 0) files = comFileBasRepository.findByFileGroupNo(qnaBasModel.getFileGroupNo()); + + QnaDetailRSModel node = new QnaDetailRSModel(); + node.setQnaSno(qnaSno); + node.setTargetSno(qnaBasModel.getTargetSno()); + node.setCategory(qnaBasModel.getCategory()); + node.setTitle(qnaBasModel.getTitle()); + node.setContent(qnaBasModel.getContent()); + node.setViewCnt(qnaBasModel.getViewCnt()); + node.setCreateUserId(qnaBasModel.getCreateUserId()); + node.setCreateDt(qnaBasModel.getCreateDt()); + node.setUpdateUserId(qnaBasModel.getUpdateUserId()); + node.setUpdateDt(qnaBasModel.getUpdateDt()); + node.setFiles(files); + + int targetSno = qnaSno; + + List result = new ArrayList<>(); + result.add(node); + + // 대댓글 불러오기 + while(true){ + + CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSno(targetSno); + if(cnsQnaBas == null) break; + + QnaDetailRSModel detailNode = new QnaDetailRSModel(); + detailNode.setQnaSno(cnsQnaBas.getQnaSno()); + detailNode.setTargetSno(cnsQnaBas.getTargetSno()); + detailNode.setCategory(cnsQnaBas.getCategory()); + detailNode.setTitle(cnsQnaBas.getTitle()); + detailNode.setContent(cnsQnaBas.getContent()); + detailNode.setCreateUserId(cnsQnaBas.getCreateUserId()); + detailNode.setCreateDt(cnsQnaBas.getCreateDt()); + detailNode.setUpdateUserId(cnsQnaBas.getUpdateUserId()); + detailNode.setUpdateDt(cnsQnaBas.getUpdateDt()); + + result.add(detailNode); + + targetSno = cnsQnaBas.getQnaSno(); + } return result; - } - + } + /** + * Qna리스트 조회 + * @param rq + * @return + */ + public List selectQnaList(QnaSelectListRQ rq){ + + return cnsQnaQueryRepository.getQnaList(rq.getCategory(), rq.getCategory()); + } /** * QnaInsert @@ -53,8 +112,9 @@ public class CnsQnaService { @Transactional public boolean insertQna(QnaInsertRQModel rq){ - List files = rq.getFiles(); - int fileGroupNo = comnFileService.fileUpload(files); // File 업로드 + List files = rq.getFiles(); + Integer fileGroupNo = null; + if(files != null && files.size() > 0) fileGroupNo = comnFileService.fileUpload(files); // File 업로드 String userId = jwtTokenUtil.getUserIdByToken(); @@ -64,12 +124,13 @@ public class CnsQnaService { cnsQnaBas.setCategory(rq.getCategory()); cnsQnaBas.setTitle(rq.getTitle()); cnsQnaBas.setContent(rq.getContent()); - cnsQnaBas.setFileGroupNo(fileGroupNo); cnsQnaBas.setCreateDt(Instant.now()); cnsQnaBas.setCreateUserId(userId); cnsQnaBas.setUpdateDt(Instant.now()); cnsQnaBas.setUpdateUserId(userId); - + cnsQnaBas.setExpsrYn("Y"); + + if(fileGroupNo != null) cnsQnaBas.setFileGroupNo(fileGroupNo); if(rq.getTargetSno() != null) cnsQnaBas.setTargetSno(rq.getTargetSno()); cnsQnaBasRepository.save(cnsQnaBas); 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 d8406d9..42b104d 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 @@ -1,5 +1,9 @@ package com.palnet.biz.jpa.repository.cns; +import java.util.List; + +import javax.persistence.Id; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,4 +12,5 @@ import com.palnet.biz.jpa.entity.CnsQnaBas; @Repository public interface CnsQnaBasRepository extends JpaRepository{ + CnsQnaBas findFirstByTargetSno(int targetSno); } 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 637a6a7..7d5b52c 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 @@ -8,6 +8,8 @@ import com.palnet.biz.api.cns.faq.model.FaqListRSModel; import com.palnet.biz.api.cns.qna.model.QnaBasModel; import com.palnet.biz.jpa.entity.QCnsFaqBas; import com.palnet.biz.jpa.entity.QCnsQnaBas; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -20,44 +22,92 @@ import lombok.extern.slf4j.Slf4j; @RequiredArgsConstructor public class CnsQnaQueryRepository { - private final JPAQueryFactory query; - - public List getQnaList(String category, String word) { - - QCnsQnaBas bas = QCnsQnaBas.cnsQnaBas; - - BooleanBuilder builder = new BooleanBuilder(); - builder.and(bas.delYn.eq("N")); - builder.and(bas.expsrYn.eq("Y")); - - if(category != null) { - builder.and(bas.category.eq(category)); - } - - if(word != null) { - builder.and(bas.title.contains(word)); - } - - List r = query + private final JPAQueryFactory query; + + /** + * 카테고리와 글로 게시글 검색, 만약 조건 없으면 전체검색 + * @param category + * @param word + * @return + */ + public List getQnaList(String category, String word) { + QCnsQnaBas bas = QCnsQnaBas.cnsQnaBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.delYn.eq("N")); + builder.and(bas.expsrYn.eq("Y")); + + if(category != null) { + builder.and(bas.category.eq(category)); + } + + if(word != null) { + builder.and(bas.title.contains(word)); + } + + List r = query .select(Projections.bean( - QnaBasModel.class, - bas.qnaSno, - bas.category, - bas.title, - bas.content, - bas.fileGroupNo, - bas.viewCnt, - bas.expsrYn, - bas.delYn, - bas.createUserId, - bas.createDt, - bas.updateUserId, - bas.updateDt + QnaBasModel.class, + bas.qnaSno, + bas.category, + bas.title, + bas.content, + bas.fileGroupNo, + bas.viewCnt, + bas.expsrYn, + bas.delYn, + bas.createUserId, + bas.createDt, + bas.updateUserId, + bas.updateDt )) .from(bas) .where(builder) .fetch(); - - return r; - } + + 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; + } + + } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java index 0586623..6cc4fb2 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java @@ -1,5 +1,7 @@ package com.palnet.biz.jpa.repository.com; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -11,4 +13,7 @@ public interface ComFileBasRepository extends JpaRepository ComFileBas findFirstByOrderByFileSnoDesc(); ComFileBas findFirstByOrderByFileGroupNoDesc(); + + List findByFileGroupNo(int fileGroupNo); + } From 9736eab347cb14a9ca1f99d209540232fcc8530a Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Fri, 13 Oct 2023 14:43:11 +0900 Subject: [PATCH 15/20] =?UTF-8?q?Qna=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20/=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/qna/controller/CnsQnaController.java | 15 ++++----- .../api/cns/qna/model/QnaInsertRQModel.java | 2 ++ .../api/cns/qna/service/CnsQnaService.java | 31 ++++++++++++++++++- .../repository/cns/CnsQnaBasRepository.java | 11 ++++--- 4 files changed, 45 insertions(+), 14 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 a5afd61..525a3ae 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 @@ -36,7 +36,6 @@ public class CnsQnaController { @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 등록[답변추가]") public ResponseEntity insertQna(QnaInsertRQModel rq){ - log.warn("CnsFaqController - insertQna()"); boolean success = cnsQnaService.insertQna(rq); @@ -48,8 +47,7 @@ public class CnsQnaController { @GetMapping("/select") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 리스트 조회") - public ResponseEntity> selectQna(QnaSelectListRQ rq){ - log.warn("CnsFaqController - selectQna()"); + public ResponseEntity> selectQna(QnaSelectListRQ rq){ List result = cnsQnaService.selectQnaList(rq); @@ -58,9 +56,7 @@ public class CnsQnaController { @GetMapping("/{qnaSno}/detail") - public ResponseEntity detailQna(@PathVariable int qnaSno){ - log.warn("CnsFaqController - selectQna()"); - log.warn("rq -> {}", qnaSno); + public ResponseEntity> detailQna(@PathVariable int qnaSno){ List reulst = cnsQnaService.getQnaDetail(qnaSno); @@ -68,12 +64,13 @@ public class CnsQnaController { } @PostMapping("/{qnaSno}/update") - public ResponseEntity updateQna(@RequestBody QnaInsertRQModel rq){ + public ResponseEntity updateQna(@PathVariable int qnaSno,@RequestBody QnaInsertRQModel rq){ log.warn("CnsFaqController - updateQna()"); - log.warn("rq -> {}", rq); + log.warn("qnaSno -> {} rq -> {}", qnaSno, rq); + boolean result = cnsQnaService.updateQna(qnaSno, rq); - return ResponseEntity.ok().body(null); + return ResponseEntity.ok().body(result); } @GetMapping("/{qnaSno}/delete") diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java index 78f5d21..a07315d 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java @@ -9,6 +9,8 @@ import lombok.Data; @Data public class QnaInsertRQModel { + private Integer qnaSno; + private Integer targetSno; // 상위 Qna 번호 private String category; 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 be99fa7..398743b 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,6 +7,7 @@ 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; @@ -20,6 +21,8 @@ import com.palnet.biz.jpa.entity.ComFileBas; import com.palnet.biz.jpa.repository.cns.CnsQnaBasRepository; import com.palnet.biz.jpa.repository.cns.CnsQnaQueryRepository; import com.palnet.biz.jpa.repository.com.ComFileBasRepository; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -40,13 +43,39 @@ public class CnsQnaService { private final JwtTokenUtil jwtTokenUtil; + + + /** + * Qna 업데이트하기 + * @param qnaSno + * @param rq + * @return + */ + @Transactional + public boolean updateQna(int qnaSno, QnaInsertRQModel rq){ + + CnsQnaBas entity = cnsQnaBasRepository.findById(qnaSno).orElse(null); + if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); + + if(rq.getCategory() != null) entity.setCategory(rq.getCategory()); + if(rq.getContent() != null) entity.setContent(rq.getContent()); + if(rq.getTitle() != null) entity.setTitle(rq.getTitle()); + + cnsQnaBasRepository.save(entity); + + return true; + } + /** * Qna 상세불러오기 * @param qnaSno * @return */ + @Transactional // 조회수 증가하기떄문 public List getQnaDetail(int qnaSno){ + cnsQnaBasRepository.pulsViewCount(qnaSno); + QnaBasModel qnaBasModel = cnsQnaQueryRepository.getQnaDetail(qnaSno).get(0); List files = null; if(qnaBasModel.getFileGroupNo() != 0) files = comFileBasRepository.findByFileGroupNo(qnaBasModel.getFileGroupNo()); @@ -89,7 +118,7 @@ public class CnsQnaService { result.add(detailNode); targetSno = cnsQnaBas.getQnaSno(); - } + } return result; } 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 42b104d..f596ac0 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 @@ -1,10 +1,9 @@ package com.palnet.biz.jpa.repository.cns; -import java.util.List; - -import javax.persistence.Id; - import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.palnet.biz.jpa.entity.CnsQnaBas; @@ -13,4 +12,8 @@ import com.palnet.biz.jpa.entity.CnsQnaBas; public interface CnsQnaBasRepository extends JpaRepository{ CnsQnaBas findFirstByTargetSno(int targetSno); + + @Modifying + @Query("UPDATE CnsQnaBas q SET q.viewCnt = q.viewCnt + 1 WHERE q.qnaSno = :qnaSno") + void pulsViewCount(@Param("qnaSno")int qnaSno); } From 6e3e83d04e894fa12a6f0162bc96fd5249a4a515 Mon Sep 17 00:00:00 2001 From: lkd9125 Date: Fri, 13 Oct 2023 15:06:32 +0900 Subject: [PATCH 16/20] =?UTF-8?q?Qna=20=EC=82=AD=EC=A0=9C=20=EC=B6=94?= =?UTF-8?q?=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 525a3ae..70fb709 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 398743b..ac08534 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 bc5d1b9..069412b 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 f596ac0..e166ae9 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 a87f57c..32c787b 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; - } - - } From 82d69eb94098b61263548d6fe73d1615c8e8bfa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?qkr7828=28=EB=B0=95=EC=9E=AC=EC=9A=B0=29?= Date: Fri, 13 Oct 2023 16:35:31 +0900 Subject: [PATCH 17/20] faq crud --- .../cns/faq/controller/CnsFaqController.java | 47 +++++++++--- ...{FaqListRSModel.java => FaqListModel.java} | 4 +- .../api/cns/faq/service/CnsFaqService.java | 73 +++++++++++++++++-- .../repository/cns/CnsFaqBasRepository.java | 7 +- .../repository/cns/CnsFaqQueryRepository.java | 33 +++++++-- 5 files changed, 140 insertions(+), 24 deletions(-) rename pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/{FaqListRSModel.java => FaqListModel.java} (88%) diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java index c546ff7..a3cfbfd 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/controller/CnsFaqController.java @@ -2,44 +2,73 @@ package com.palnet.biz.api.cns.faq.controller; import java.util.List; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; 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 com.palnet.biz.api.cns.faq.model.FaqListRQModel; -import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.api.cns.faq.model.FaqListModel; import com.palnet.biz.api.cns.faq.service.CnsFaqService; +import com.palnet.biz.api.comn.response.BasicResponse; +import com.palnet.biz.api.comn.response.SuccessResponse; -import io.swagger.v3.oas.annotations.parameters.RequestBody; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @RestController @Slf4j @RequiredArgsConstructor -@RequestMapping(value = "/api/bas/cns") +@RequestMapping(value = "/api/bas/cns/faq") public class CnsFaqController { private final CnsFaqService service; + /*FAQ 목록 조회*/ @PostMapping("/list") - public List getFaqList(@RequestBody FaqListRQModel model) { + public ResponseEntity getFaqList(@RequestBody FaqListRQModel model) { - List result = null; + List result = null; result = service.getFaqList(model); - return result; + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } + /*FAQ 상세 조회*/ @GetMapping("/detail") - public FaqListRSModel getFaqDetail(int sno) { + public ResponseEntity getFaqDetail(int sno) { - FaqListRSModel result = null; + FaqListModel result = null; result = service.getFaqDetail(sno); - return result; + return ResponseEntity.ok().body(result); + } + + /*FAQ 작성*/ + @PostMapping("/insert") + public void insertFaq(@RequestBody FaqListModel model) { + + service.insertFaq(model); + + } + + /*FAQ 업데이트*/ + @PostMapping("/update") + public void updateFaq(@RequestBody FaqListModel model) { + + service.updateFaq(model); + + } + + /*FAQ 논리 삭제*/ + @PostMapping("/delete") + public void deleteFaq(int sno) { + + service.deleteFaq(sno); + } } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java similarity index 88% rename from pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java rename to pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java index 579b9e1..891a7a1 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListRSModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java @@ -5,9 +5,9 @@ import java.time.Instant; import lombok.Data; @Data -public class FaqListRSModel { +public class FaqListModel { - private int qnaSno; + private int faqSno; private String category; 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 918b2a0..d6a105e 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 @@ -1,13 +1,19 @@ package com.palnet.biz.api.cns.faq.service; +import java.time.Instant; import java.util.List; +import javax.transaction.Transactional; + import org.springframework.stereotype.Service; +import com.palnet.biz.api.cns.faq.model.FaqListModel; import com.palnet.biz.api.cns.faq.model.FaqListRQModel; -import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.jpa.entity.CnsFaqBas; import com.palnet.biz.jpa.repository.cns.CnsFaqBasRepository; import com.palnet.biz.jpa.repository.cns.CnsFaqQueryRepository; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,22 +27,79 @@ public class CnsFaqService { private final CnsFaqBasRepository cnsFaqBasRepository; - public List getFaqList(FaqListRQModel model){ + public List getFaqList(FaqListRQModel model){ + + List result = query.getFaqList(model.getCategory(), model.getWord()); - List result = query.getFaqList(model.getCategory(), model.getWord()); + if(result == null || result.size() < 1) throw new CustomException(ErrorCode.DATA_NO); return result; } - public FaqListRSModel getFaqDetail(int sno){ + public FaqListModel getFaqDetail(int sno){ cnsFaqBasRepository.updateViewCnt(sno); - FaqListRSModel result = query.getFaqDetail(sno); + FaqListModel result = query.getFaqDetail(sno); + + if(result == null) throw new CustomException(ErrorCode.DATA_NO); return result; } + @Transactional + public void insertFaq(FaqListModel model){ + + CnsFaqBas bas = new CnsFaqBas(); + + bas.setCreateDt(Instant.now()); + bas.setUpdateDt(Instant.now()); + + bas.setCategory(model.getCategory()); + bas.setContent(model.getContent()); + bas.setCreateUserId(model.getCreateUserId()); + bas.setDelYn(model.getDelYn()); + bas.setExpsrYn(model.getExpsrYn()); + bas.setTitle(model.getTitle()); + bas.setUpdateUserId(model.getUpdateUserId()); + bas.setViewCnt(0); + + try { + cnsFaqBasRepository.save(bas); + } catch(Exception e) { + throw new CustomException(ErrorCode.NON_VALID_PARAMETER); + } + } + + @Transactional + public void updateFaq(FaqListModel model) { + + FaqListModel prevData = query.getFaqDetail(model.getFaqSno()); + + if(prevData == null) throw new CustomException(ErrorCode.DATA_NO); + + if(model.getCategory() != null) prevData.setCategory(model.getCategory()); + if(model.getTitle() != null) prevData.setTitle(model.getTitle()); + if(model.getContent() != null) prevData.setContent(model.getContent()); + if(model.getExpsrYn() != null) prevData.setExpsrYn(model.getExpsrYn()); + if(model.getUpdateUserId() != null) prevData.setUpdateUserId(model.getUpdateUserId()); + + prevData.setUpdateDt(Instant.now()); + + try { + query.updateFaq(prevData); + } catch(Exception e) { + throw new CustomException(ErrorCode.NON_VALID_PARAMETER); + } + } + + public void deleteFaq(int sno) { + + int delCnt = cnsFaqBasRepository.deleteFaq(sno); + + if(delCnt == 0) throw new CustomException(ErrorCode.DATA_NO); + + } } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java index 9492c50..ecf46ff 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqBasRepository.java @@ -17,6 +17,11 @@ public interface CnsFaqBasRepository extends JpaRepository{ @Transactional @Query("update CnsFaqBas c set c.viewCnt = c.viewCnt + 1" + "where c.faqSno = :sno") - void updateViewCnt(@Param("sno") int sno); + int updateViewCnt(@Param("sno") int sno); + @Modifying + @Transactional + @Query("update CnsFaqBas c set c.delYn = 'Y' " + + "where c.faqSno = :sno") + int deleteFaq(@Param("sno") int sno); } 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 066a9db..e3b092f 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 @@ -4,7 +4,7 @@ import java.util.List; import org.springframework.stereotype.Repository; -import com.palnet.biz.api.cns.faq.model.FaqListRSModel; +import com.palnet.biz.api.cns.faq.model.FaqListModel; import com.palnet.biz.jpa.entity.QCnsFaqBas; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; @@ -20,7 +20,7 @@ public class CnsFaqQueryRepository { private final JPAQueryFactory query; - public List getFaqList(String category, String word) { + public List getFaqList(String category, String word) { QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; @@ -36,9 +36,9 @@ public class CnsFaqQueryRepository { builder.and(bas.title.contains(word)); } - List r = query + List r = query .select(Projections.bean( - FaqListRSModel.class, + FaqListModel.class, bas.faqSno, bas.category, bas.title, @@ -59,16 +59,16 @@ public class CnsFaqQueryRepository { return r; } - public FaqListRSModel getFaqDetail(int sno) { + public FaqListModel getFaqDetail(int sno) { QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; BooleanBuilder builder = new BooleanBuilder(); builder.and(bas.faqSno.eq(sno)); - FaqListRSModel r = query + FaqListModel r = query .select(Projections.bean( - FaqListRSModel.class, + FaqListModel.class, bas.faqSno, bas.category, bas.title, @@ -89,4 +89,23 @@ public class CnsFaqQueryRepository { return r; } + public void updateFaq(FaqListModel model) { + QCnsFaqBas bas = QCnsFaqBas.cnsFaqBas; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(bas.faqSno.eq(model.getFaqSno())); + + query.update(bas) + .set(bas.category, model.getCategory()) + .set(bas.title, model.getTitle()) + .set(bas.content, model.getContent()) + .set(bas.viewCnt, model.getViewCnt()) + .set(bas.expsrYn, model.getExpsrYn()) + .set(bas.updateUserId, model.getUpdateUserId()) + .set(bas.updateDt, model.getUpdateDt()) + .where(builder) + .execute(); + + } + } \ No newline at end of file From fb214e03230315aa01e78ba62e8e3f6c473dbb90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Fri, 13 Oct 2023 18:32:20 +0900 Subject: [PATCH 18/20] =?UTF-8?q?File=20update=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 | 7 +++++-- .../comn/file/service/ComnFileService.java | 14 ++++++------- 3 files changed, 23 insertions(+), 18 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 70fb709..bd2ac20 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 @@ -35,13 +35,11 @@ public class CnsQnaController { @PostMapping(value = "/insert", consumes = "multipart/form-data") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 등록[답변추가]") - public ResponseEntity insertQna(QnaInsertRQModel rq){ + public ResponseEntity insertQna(QnaInsertRQModel rq){ - boolean success = cnsQnaService.insertQna(rq); + boolean result = cnsQnaService.insertQna(rq); - QnaRSModel rs = new QnaRSModel(success); - - return ResponseEntity.ok().body(rs); + return ResponseEntity.ok().body(result); } @GetMapping("/select") @@ -68,7 +66,7 @@ public class CnsQnaController { @PostMapping("/{qnaSno}/update") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 업데이트") - public ResponseEntity updateQna(@PathVariable int qnaSno,@RequestBody QnaInsertRQModel rq){ + public ResponseEntity updateQna(@PathVariable int qnaSno, QnaInsertRQModel rq){ boolean result = cnsQnaService.updateQna(qnaSno, rq); @@ -79,11 +77,17 @@ public class CnsQnaController { @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 삭제하기") public ResponseEntity deleteQna(@PathVariable int qnaSno){ - log.warn("CnsFaqController - deleteQna()"); - log.warn("rq -> {}", qnaSno); boolean result = cnsQnaService.deleteQna(qnaSno); return ResponseEntity.ok().body(result); } + + @GetMapping("/{qnaSno}/{fileSno}/delete") + public ResponseEntity deleteQnaFile(){ + log.warn("CnsQnaController - deleteQnaFile()"); + + + return ResponseEntity.ok().body(null); + } } 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 ac08534..2fbe9f6 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 @@ -91,7 +91,10 @@ public class CnsQnaService { CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSno(qnaSno, 0); if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); - + + List files = rq.getFiles(); + if(files != null && files.size() > 0) comnFileService.fileUpload(files, entity.getFileGroupNo()); // File 업로드 + if(rq.getCategory() != null) entity.setCategory(rq.getCategory()); if(rq.getContent() != null) entity.setContent(rq.getContent()); if(rq.getTitle() != null) entity.setTitle(rq.getTitle()); @@ -178,7 +181,7 @@ public class CnsQnaService { List files = rq.getFiles(); Integer fileGroupNo = null; - if(files != null && files.size() > 0) fileGroupNo = comnFileService.fileUpload(files); // File 업로드 + if(files != null && files.size() > 0) fileGroupNo = comnFileService.fileUpload(files, null); // File 업로드 String userId = jwtTokenUtil.getUserIdByToken(); 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 069412b..4dfd56a 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 @@ -125,16 +125,14 @@ public class ComnFileService { comFileBas.setFileGroupNo(fileGroupNo); return comFileBasRepository.save(comFileBas); - } + } /** * 다건 DB 인서트, 최신데이터 가져온 후 Group NO 1추가함 * @param comFileBas * @return */ - public List saveAll(List comFileBas){ - - int fileGroupNo = this.lastFileGroupNo(); + public List saveAll(List comFileBas, Integer fileGroupNo){ for(ComFileBas fileBas : comFileBas){ fileBas.setFileGroupNo(fileGroupNo); @@ -200,11 +198,11 @@ public class ComnFileService { } - public Integer fileUpload(List files){ + public Integer fileUpload(List files, Integer fileGroupNo){ if(!this.validCheck(files)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); - Integer fileGroupNo = lastFileGroupNo(); + if(fileGroupNo == null || fileGroupNo == 0) fileGroupNo = lastFileGroupNo(); // TODO : 절대경로 String absPath = "/Users/igyeongdo/WokrSpace/"; @@ -255,8 +253,8 @@ public class ComnFileService { e.printStackTrace(); } } - - this.saveAll(comFileBas); + + this.saveAll(comFileBas, fileGroupNo); return fileGroupNo; } From 58709feba37bc6ad85cf09f32a3f58e954aa68d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Fri, 13 Oct 2023 18:51:37 +0900 Subject: [PATCH 19/20] =?UTF-8?q?Qna=20File=20=EA=B0=9C=EB=B3=84=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20[=ED=8C=8C=EC=9D=BC=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EA=B8=B0=ED=9A=8D=EC=9D=B4=20=EC=97=86=EC=96=B4=20?= =?UTF-8?q?=EB=A7=8C=EB=93=AC]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/qna/controller/CnsQnaController.java | 13 +++++++-- .../api/cns/qna/service/CnsQnaService.java | 29 ++++++++++++------- .../comn/file/service/ComnFileService.java | 20 ++++++++++++- .../com/palnet/biz/jpa/entity/CnsQnaBas.java | 2 +- .../repository/cns/CnsQnaBasRepository.java | 6 ++-- .../repository/com/ComFileBasRepository.java | 4 ++- 6 files changed, 56 insertions(+), 18 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 bd2ac20..5716f7a 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 @@ -83,11 +83,20 @@ public class CnsQnaController { return ResponseEntity.ok().body(result); } + /** + * Qna Files 개별삭제 TODO:: 파일 업데이트의 기획이 어떻게 되는지 모름 + * @param qnaSno + * @param fileSno + * @return + */ @GetMapping("/{qnaSno}/{fileSno}/delete") - public ResponseEntity deleteQnaFile(){ + @Tag(name = "QNA", description = "QNA 관련 API") + @ApiOperation(value = "QnA 파일 개별삭제") + public ResponseEntity deleteQnaFile(@PathVariable int qnaSno, @PathVariable int fileSno){ log.warn("CnsQnaController - deleteQnaFile()"); + boolean result = cnsQnaService.deleteQnaFile(fileSno); - return ResponseEntity.ok().body(null); + 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 2fbe9f6..63d0b91 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 @@ -29,9 +29,7 @@ import lombok.extern.slf4j.Slf4j; @Service @Slf4j @RequiredArgsConstructor -public class CnsQnaService { - - private final ComnFileService comnFileService; +public class CnsQnaService { private final CnsQnaBasRepository cnsQnaBasRepository; @@ -39,9 +37,18 @@ public class CnsQnaService { private final ComFileBasRepository comFileBasRepository; + private final ComnFileService comnFileService; + private final JwtTokenUtil jwtTokenUtil; + public boolean deleteQnaFile(int fileSno){ + + comnFileService.deleteFile(fileSno); + + return true; + } + /** * Qna 삭제하기, file들도 모두 논리삭제함. * @param qnaSno @@ -50,10 +57,10 @@ public class CnsQnaService { @Transactional public boolean deleteQna(int qnaSno){ - CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSno(qnaSno, 0); + CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(qnaSno, "N", "Y"); if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); - boolean fileDelete = comnFileService.deleteFiles(entity.getFileGroupNo()); + if(entity.getFileGroupNo() != null) comnFileService.deleteFiles(entity.getFileGroupNo()); entity.setDelYn("Y"); @@ -65,7 +72,7 @@ public class CnsQnaService { // 대댓글 불러오기 while(true){ - CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSno(targetSno); + CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSnoAndDelYnAndExpsrYn(targetSno, "N", "Y"); if(cnsQnaBas == null) break; cnsQnaBas.setDelYn("Y"); @@ -77,7 +84,7 @@ public class CnsQnaService { deleteList = cnsQnaBasRepository.saveAll(deleteList); - return deleteList != null && fileDelete; + return true; } /** @@ -89,7 +96,7 @@ public class CnsQnaService { @Transactional public boolean updateQna(int qnaSno, QnaInsertRQModel rq){ - CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSno(qnaSno, 0); + CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y"); if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); List files = rq.getFiles(); @@ -114,9 +121,9 @@ public class CnsQnaService { cnsQnaBasRepository.pulsViewCount(qnaSno); - CnsQnaBas qnaBasModel = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSno(qnaSno, 0); + CnsQnaBas qnaBasModel = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y"); List files = null; - if(qnaBasModel.getFileGroupNo() != 0) files = comFileBasRepository.findByFileGroupNo(qnaBasModel.getFileGroupNo()); + if(qnaBasModel.getFileGroupNo() != 0) files = comFileBasRepository.findByFileGroupNoAndDelYn(qnaBasModel.getFileGroupNo(), "N"); QnaDetailRSModel node = new QnaDetailRSModel(); node.setQnaSno(qnaSno); @@ -139,7 +146,7 @@ public class CnsQnaService { // 대댓글 불러오기 while(true){ - CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSno(targetSno); + CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSnoAndDelYnAndExpsrYn(targetSno, "N", "Y"); if(cnsQnaBas == null) break; QnaDetailRSModel detailNode = new QnaDetailRSModel(); 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 4dfd56a..1b6da35 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 @@ -328,7 +328,7 @@ public class ComnFileService { @Transactional public boolean deleteFiles(int fileGroupNo){ - List files = comFileBasRepository.findByFileGroupNo(fileGroupNo); + List files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N"); String userId = jwtTokenUtil.getUserIdByToken(); @@ -345,4 +345,22 @@ public class ComnFileService { return true; } + @Transactional + public boolean deleteFile(int fileSno){ + + ComFileBas file = comFileBasRepository.findByFileSnoAndDelYn(fileSno, "N"); + + String userId = jwtTokenUtil.getUserIdByToken(); + + if (userId == null) userId = "NONE"; + + file.setDelYn("Y"); + file.setDelUserId(userId); + 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 57ebd1f..b9fdaaf 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 @@ -34,7 +34,7 @@ public class CnsQnaBas implements Serializable { private String content; @Column(name="FILE_GROUP_NO") - private int fileGroupNo; + private Integer fileGroupNo; @Column(name="EXPSR_YN") private String expsrYn = "N"; 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 e166ae9..9c56915 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 @@ -11,9 +11,11 @@ import com.palnet.biz.jpa.entity.CnsQnaBas; @Repository public interface CnsQnaBasRepository extends JpaRepository{ - CnsQnaBas findFirstByTargetSno(int targetSno); + CnsQnaBas findFirstByTargetSnoAndDelYnAndExpsrYn(int targetSno, String delYn, String expsrYn); - CnsQnaBas findFirstByQnaSnoAndTargetSno(int qnaSno, int targetSno); + CnsQnaBas findByQnaSnoAndDelYnAndExpsrYn(int qnaSno, String delYn, String expsrYn); + + CnsQnaBas findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(int qnaSno, int targetSno, String delYn, String expsrYn); @Modifying @Query("UPDATE CnsQnaBas q SET q.viewCnt = q.viewCnt + 1 WHERE q.qnaSno = :qnaSno") diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java index 6cc4fb2..95a92c7 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java @@ -14,6 +14,8 @@ public interface ComFileBasRepository extends JpaRepository ComFileBas findFirstByOrderByFileGroupNoDesc(); - List findByFileGroupNo(int fileGroupNo); + List findByFileGroupNoAndDelYn(int fileGroupNo, String delYn); + + ComFileBas findByFileSnoAndDelYn(int fileSno, String delYn); } From 2b76d6488ccadc1aba53231eb0692a7d37fbbc90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Fri, 13 Oct 2023 19:01:33 +0900 Subject: [PATCH 20/20] =?UTF-8?q?files=20=EC=A0=80=EC=9E=A5=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comn/file/service/ComnFileService.java | 3 ++ .../java/com/palnet/comn/utils/PdfUtils.java | 52 ++++++++++--------- 2 files changed, 31 insertions(+), 24 deletions(-) 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 1b6da35..ada9e1c 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 @@ -51,6 +51,8 @@ public class ComnFileService { @Value("${base-url}") private String BASE_PATH; + + private final String NORMAL_FORDER_PATH = "normal/"; /** * 파일명 만들기, 앞에 기본으로 금일 날짜있음 @@ -210,6 +212,7 @@ public class ComnFileService { String fileUrl = new StringBuilder() .append(absPath) .append(this.BASE_PATH) + .append(this.NORMAL_FORDER_PATH) .append(InstantUtils.toDateStringByFormat(Instant.now(), "yyyyMMdd")) .append("/") .toString(); diff --git a/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java index d9cda03..55fd54d 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java @@ -1,45 +1,43 @@ package com.palnet.comn.utils; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Instant; +import java.util.Map; +import java.util.Map.Entry; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; + import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.io.font.PdfEncodings; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.font.FontProvider; +import com.palnet.biz.api.comn.file.constant.ExtensionConstant; import com.palnet.biz.api.comn.file.model.PdfBaseModel; import com.palnet.biz.jpa.entity.ComFileBas; -import com.palnet.comn.code.ErrorCode; -import com.palnet.comn.exception.CustomException; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.thymeleaf.TemplateEngine; -import org.thymeleaf.context.Context; - -import javax.servlet.http.HttpServletResponse; -import java.io.*; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.Instant; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; @Slf4j @RequiredArgsConstructor @Component public class PdfUtils { - - private final HttpServletResponse response; + private final TemplateEngine templateEngine; - + @Value("${base-url}") private String BASE_PATH; - - private final String FILE_EXTENSION = ".pdf"; + + private final String PDF_FORDER_PATH = BASE_PATH + "od/"; /** @@ -80,7 +78,13 @@ public class PdfUtils { ComFileBas result = new ComFileBas(); - String pdfPath = this.BASE_PATH + InstantUtils.toDateStringByFormat(Instant.now(), "yyyyMMdd") + "/"; + String pdfPath = new StringBuilder() + .append(this.BASE_PATH) + .append(this.PDF_FORDER_PATH) + .append(InstantUtils.toDateStringByFormat(Instant.now(), "yyyyMMdd")) + .append("/") + .toString(); + String pdfFilePath = pdfPath + fileName; File path = new File(pdfPath); @@ -145,7 +149,7 @@ public class PdfUtils { result.setFileGroupNo(0); result.setFilePath(pdfPath); - result.setFileExt(this.FILE_EXTENSION); + result.setFileExt(ExtensionConstant.PDF.extension); result.setCreateDt(Instant.now()); result.setFileSaveNm(fileName); result.setFileOriNm(fileName);