From d98025b99f0cf59db6683d2df087f8c08e1ca1a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Mon, 16 Oct 2023 18:57:19 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=9D=BC=EB=AA=B0=20=EC=9D=BC=EC=B6=9C=20a?= =?UTF-8?q?pi=20=EC=B6=94=EA=B0=80=20-=20=ED=95=B4=EB=8B=B9=20=EC=A2=8C?= =?UTF-8?q?=ED=91=9C=EC=97=90=20=EA=B7=BC=EC=A0=91=ED=95=9C=20=EC=A7=80?= =?UTF-8?q?=EC=97=AD=EC=9D=98=206=EA=B0=9C=EC=9B=94=EC=B9=98=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ComnSunrisesetController.java | 35 ++++++++++++++++++- .../model/ComnSunrisesetCoordRq.java | 5 +++ .../service/ComnSunrisesetService.java | 9 +++-- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java index 019afd3f..cd893a27 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/controller/ComnSunrisesetController.java @@ -8,6 +8,8 @@ import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRq; import com.palnet.biz.api.comn.sunriseset.model.ComnSunrisesetRs; import com.palnet.biz.api.comn.sunriseset.service.ComnSunrisesetService; import com.palnet.comn.exception.CustomException; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -17,6 +19,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; import java.util.HashMap; import java.util.List; @@ -72,8 +75,38 @@ public class ComnSunrisesetController { @ApiOperation(value = "일출/일몰 조회(좌표)", notes = "기간내 근접한 지역의 일출/일몰 조회") @Tag(name = "공통 API", description = "공통 API") @GetMapping("/coord") - public ResponseEntity getSunRiseSetByCoord(ComnSunrisesetCoordRq rq) { + public ResponseEntity getSunRiseSetByCoordAndDate(ComnSunrisesetCoordRq rq) { ComnSunrisesetRs rs = null; + try { + log.debug(">>> rq : {}", rq); + rs = comnSunrisesetService.getSunRiseSetByCoordAndDate(rq); +// log.debug(">>> rs : {}", rs); + + } catch (CustomException e) { + Map resultMap = new HashMap(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(rs)); + } + + @ApiOperation(value = "일출/일몰 조회(좌표-6개월치)", notes = "근접한 지역의 현재~6개월치의 일출/일몰 데이터 조회") + @Tag(name = "공통 API", description = "공통 API") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "lat", value = "위도", required = true, dataType = "double", paramType = "query", example = "37.5665", defaultValue = "37.5665"), + @ApiImplicitParam(name = "lon", value = "경도", required = true, dataType = "double", paramType = "query", example = "126.9780", defaultValue = "126.9780"), + }) + @GetMapping("/coord/list") + public ResponseEntity getSunRiseSetByCoord(@ApiIgnore ComnSunrisesetCoordRq rq) { + List rs = null; try { log.debug(">>> rq : {}", rq); rs = comnSunrisesetService.getSunRiseSetByCoord(rq); diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetCoordRq.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetCoordRq.java index 7fa9d656..8c86f331 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetCoordRq.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/model/ComnSunrisesetCoordRq.java @@ -36,4 +36,9 @@ public class ComnSunrisesetCoordRq { public boolean hasAllData() { return (locStDate != null && !locStDate.isEmpty()) && (locEndDate != null && !locEndDate.isEmpty()) && lat != null && lon != null; } + + @JsonIgnore + public boolean hasCoord() { + return lat != null && lon != null; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java index afa29194..851c3707 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/sunriseset/service/ComnSunrisesetService.java @@ -36,8 +36,13 @@ public class ComnSunrisesetService { } - public ComnSunrisesetRs getSunRiseSetByCoord(ComnSunrisesetCoordRq rq) { + public ComnSunrisesetRs getSunRiseSetByCoordAndDate(ComnSunrisesetCoordRq rq) { if(rq == null || !rq.hasAllData()) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); - return comRiseSetQueryRepository.findBySearchCoordTransform(rq); + return comRiseSetQueryRepository.findBySearchCoordDateTransform(rq); + } + + public List getSunRiseSetByCoord(ComnSunrisesetCoordRq rq) { + if(rq == null || !rq.hasCoord()) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); + return comRiseSetQueryRepository.findAllBySearchCoordTransform(rq); } } From 7dabd67695133606560872ebb14e927bcfb5e8e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Mon, 16 Oct 2023 19:04:15 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=9D=BC=EB=AA=B0=20=EC=9D=BC=EC=B6=9C=20a?= =?UTF-8?q?pi=20=EC=B6=94=EA=B0=80=20-=20=ED=95=B4=EB=8B=B9=20=EC=A2=8C?= =?UTF-8?q?=ED=91=9C=EC=97=90=20=EA=B7=BC=EC=A0=91=ED=95=9C=20=EC=A7=80?= =?UTF-8?q?=EC=97=AD=EC=9D=98=206=EA=B0=9C=EC=9B=94=EC=B9=98=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ComRiseSetQueryRepository.java | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java index a00fdce0..0ea03f85 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComRiseSetQueryRepository.java @@ -13,6 +13,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.List; /** @@ -64,10 +66,10 @@ public class ComRiseSetQueryRepository { BooleanBuilder builder = new BooleanBuilder(); if (rq != null) { if (rq.getLocStDate() != null) { - builder.and(bas.id.locDate.loe(rq.getLocStDate())); + builder.and(bas.id.locDate.goe(rq.getLocStDate())); } if (rq.getLocEndDate() != null) { - builder.and(bas.id.locDate.goe(rq.getLocEndDate())); + builder.and(bas.id.locDate.loe(rq.getLocEndDate())); } if (rq.getLocation() != null) { builder.and(bas.id.location.eq(rq.getLocation())); @@ -93,7 +95,7 @@ public class ComRiseSetQueryRepository { } - public ComnSunrisesetRs findBySearchCoordTransform(ComnSunrisesetCoordRq rq) { + public ComnSunrisesetRs findBySearchCoordDateTransform(ComnSunrisesetCoordRq rq) { QComRiseSetBas bas = QComRiseSetBas.comRiseSetBas; BooleanBuilder builder = new BooleanBuilder(); builder.and(bas.id.locDate.goe(rq.getLocStDate())); @@ -123,4 +125,47 @@ public class ComRiseSetQueryRepository { ).asc()) .fetchFirst(); } + + public List findAllBySearchCoordTransform(ComnSunrisesetCoordRq rq) { + QComRiseSetBas bas = QComRiseSetBas.comRiseSetBas; + + BooleanBuilder builder = new BooleanBuilder(); + LocalDate stDate = LocalDate.now(); + LocalDate endDate = stDate.plusMonths(6); + String stDateStr = stDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String endDateStr = endDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + builder.and(bas.id.locDate.goe(stDateStr)); + builder.and(bas.id.locDate.loe(endDateStr)); + + String location = query.select(bas.id.location) + .from(bas) + .where(builder) + .groupBy(bas.id.location) + .orderBy(Expressions.stringTemplate("ST_Distance_Sphere({0}, {1})", + Expressions.stringTemplate("POINT({0}, {1})", + rq.getLon(), + rq.getLat() + ), + Expressions.stringTemplate("POINT({0}, {1})", + bas.lon, + bas.lat + ) + ).asc()) + .fetchFirst(); + + builder.and(bas.id.location.eq(location)); + List rs = query.select(Projections.bean( + ComnSunrisesetRs.class, + bas.id.locDate, + bas.id.location, + bas.sunrise, + bas.sunset, + bas.civilm, + bas.civile)) + .from(bas) + .where(builder) + .orderBy(bas.id.locDate.asc()) + .fetch(); + return rs; + } } From 694be4caf16ba3e39a02959df3502fd88c128e14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Tue, 17 Oct 2023 09:00:16 +0900 Subject: [PATCH 3/4] =?UTF-8?q?faq=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cns/faq/controller/CnsFaqController.java | 138 ++++++++++++++---- .../biz/api/cns/faq/model/FaqListModel.java | 2 +- .../biz/api/cns/faq/service/CnsFaqMapper.java | 31 ++++ .../api/cns/faq/service/CnsFaqService.java | 82 +++++------ .../com/palnet/biz/jpa/entity/CnsFaqBas.java | 8 +- 5 files changed, 187 insertions(+), 74 deletions(-) create mode 100644 pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqMapper.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 a3cfbfdf..5ff5e8ef 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,17 @@ package com.palnet.biz.api.cns.faq.controller; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import com.palnet.biz.api.bas.laanc.model.BasLaancAprvRs; +import com.palnet.biz.api.comn.response.ErrorResponse; +import com.palnet.comn.exception.CustomException; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.data.domain.Page; +import org.springframework.http.HttpStatus; 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 org.springframework.web.bind.annotation.*; import com.palnet.biz.api.cns.faq.model.FaqListRQModel; import com.palnet.biz.api.cns.faq.model.FaqListModel; @@ -20,6 +24,7 @@ import lombok.extern.slf4j.Slf4j; @RestController @Slf4j +@Tag(name = "FAQ API", description = "FAQ 관련 API") @RequiredArgsConstructor @RequestMapping(value = "/api/bas/cns/faq") public class CnsFaqController { @@ -27,48 +32,121 @@ public class CnsFaqController { private final CnsFaqService service; /*FAQ 목록 조회*/ - @PostMapping("/list") - public ResponseEntity getFaqList(@RequestBody FaqListRQModel model) { - + @Tag(name = "FAQ API", description = "FAQ 관련 API") + @GetMapping + public ResponseEntity getFaqList(FaqListRQModel model) { List result = null; - - result = service.getFaqList(model); - + try { + result = service.getFaqList(model); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } return ResponseEntity.ok().body(new SuccessResponse<>(result)); } /*FAQ 상세 조회*/ - @GetMapping("/detail") - public ResponseEntity getFaqDetail(int sno) { - + @Tag(name = "FAQ API", description = "FAQ 관련 API") + @GetMapping("/{sno}") + public ResponseEntity getFaqDetail(@PathVariable("sno") int sno) { FaqListModel result = null; - - result = service.getFaqDetail(sno); - - return ResponseEntity.ok().body(result); + try { + result = service.getFaqDetail(sno); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } /*FAQ 작성*/ - @PostMapping("/insert") - public void insertFaq(@RequestBody FaqListModel model) { - - service.insertFaq(model); + @Tag(name = "FAQ API", description = "FAQ 관련 API") + @PostMapping + public ResponseEntity insertFaq(@RequestBody FaqListModel model) { + boolean result = false; + try { + result = service.insertFaq(model); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); + } /*FAQ 업데이트*/ - @PostMapping("/update") - public void updateFaq(@RequestBody FaqListModel model) { - - service.updateFaq(model); + @Tag(name = "FAQ API", description = "FAQ 관련 API") + @PutMapping + public ResponseEntity updateFaq(@RequestBody FaqListModel model) { + boolean result = false; + try { + result = service.updateFaq(model); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } /*FAQ 논리 삭제*/ - @PostMapping("/delete") - public void deleteFaq(int sno) { - - service.deleteFaq(sno); + @Tag(name = "FAQ API", description = "FAQ 관련 API") + @DeleteMapping("/{sno}") + public ResponseEntity deleteFaq(@PathVariable("sno") int sno) { + // TODO 성공/실패 상태값 전송 + try { + service.deleteFaq(sno); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().build(); } } \ No newline at end of file diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java index 891a7a1c..d4782c00 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/model/FaqListModel.java @@ -19,7 +19,7 @@ public class FaqListModel { private String expsrYn; - private String delYn; +// private String delYn; private String createUserId; diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqMapper.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqMapper.java new file mode 100644 index 00000000..661e92a2 --- /dev/null +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqMapper.java @@ -0,0 +1,31 @@ +package com.palnet.biz.api.cns.faq.service; + +import com.palnet.biz.api.cns.faq.model.FaqListModel; +import com.palnet.biz.jpa.entity.CnsFaqBas; +import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; +import org.mapstruct.NullValuePropertyMappingStrategy; +import org.mapstruct.ReportingPolicy; +import org.mapstruct.factory.Mappers; + +/** + * packageName : com.palnet.biz.api.cns.faq.service + * fileName : CnsFaqMapper + * author : dhji + * date : 2023-10-17(017) + * description : + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2023-10-17(017) dhji 최초 생성 + */ +@Mapper(unmappedSourcePolicy = ReportingPolicy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE, nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) +public interface CnsFaqMapper { + CnsFaqMapper MAPPER = Mappers.getMapper(CnsFaqMapper.class); + + FaqListModel toModel(CnsFaqBas updateEntity); + + CnsFaqBas toEntity(FaqListModel model); + + void mergeEntity(@MappingTarget CnsFaqBas prevData, FaqListModel model); +} 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 d6a105e2..72a54e23 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,12 +1,6 @@ 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.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.cns.faq.model.FaqListModel; import com.palnet.biz.api.cns.faq.model.FaqListRQModel; import com.palnet.biz.jpa.entity.CnsFaqBas; @@ -14,9 +8,13 @@ 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; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.ArrayList; +import java.util.List; @Slf4j @Service @@ -24,79 +22,81 @@ import lombok.extern.slf4j.Slf4j; public class CnsFaqService { private final CnsFaqQueryRepository query; - private final CnsFaqBasRepository cnsFaqBasRepository; + private final JwtTokenUtil jwtTokenUtil; public List getFaqList(FaqListRQModel model){ List result = query.getFaqList(model.getCategory(), model.getWord()); - - if(result == null || result.size() < 1) throw new CustomException(ErrorCode.DATA_NO); - + + if(result == null) result = new ArrayList<>(); + return result; } public FaqListModel getFaqDetail(int sno){ - - cnsFaqBasRepository.updateViewCnt(sno); - - FaqListModel result = query.getFaqDetail(sno); - - if(result == null) throw new CustomException(ErrorCode.DATA_NO); - - return result; + + CnsFaqBas findEntity = cnsFaqBasRepository.findById(sno).orElseThrow(() -> new CustomException(ErrorCode.DATA_NO)); + findEntity.setViewCnt(findEntity.getViewCnt() + 1); + CnsFaqBas updateEntity = cnsFaqBasRepository.save(findEntity); + return CnsFaqMapper.MAPPER.toModel(updateEntity); } @Transactional - public void insertFaq(FaqListModel model){ - + public boolean insertFaq(FaqListModel model){ + String userId = jwtTokenUtil.getUserIdByToken(); + CnsFaqBas bas = new CnsFaqBas(); - - bas.setCreateDt(Instant.now()); - bas.setUpdateDt(Instant.now()); - + + bas.setCreateUserId(userId); + bas.setUpdateUserId(userId); + 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.setDelYn("N"); bas.setViewCnt(0); try { - cnsFaqBasRepository.save(bas); + CnsFaqBas saveEntity = cnsFaqBasRepository.save(bas); + if(saveEntity != null) return true; + else return false; } catch(Exception e) { + // TODO parameter validate...?? 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); - + public boolean updateFaq(FaqListModel model) { + String userId = jwtTokenUtil.getUserIdByToken(); + + CnsFaqBas prevData = cnsFaqBasRepository.findById(model.getFaqSno()).orElseThrow(() -> 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()); + prevData.setUpdateUserId(userId); + try { - query.updateFaq(prevData); + CnsFaqBas saveEntity = cnsFaqBasRepository.save(prevData); + if(saveEntity != null) return true; + else return false; } catch(Exception e) { + // TODO parameter validate...?? throw new CustomException(ErrorCode.NON_VALID_PARAMETER); } } public void deleteFaq(int sno) { - + + // TODO 반환값이 실행한 갯수인지 확인 필요 int delCnt = cnsFaqBasRepository.deleteFaq(sno); if(delCnt == 0) throw new CustomException(ErrorCode.DATA_NO); 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 index 3cff6c40..1419be44 100644 --- 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 @@ -6,6 +6,8 @@ import java.time.Instant; import javax.persistence.*; import lombok.Data; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; @Entity @Data @@ -41,13 +43,15 @@ public class CnsFaqBas implements Serializable { @Column(name="CREATE_USER_ID") private String createUserId; - @Column(name="CREATE_DT") + @CreationTimestamp + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false) private Instant createDt; @Column(name="UPDATE_USER_ID") private String updateUserId; - @Column(name="UPDATE_DT") + @UpdateTimestamp + @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; } From 49c2798356cf0525e6a6972e4252ed93510df6f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Tue, 17 Oct 2023 09:28:27 +0900 Subject: [PATCH 4/4] =?UTF-8?q?qna=20url=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/cns/faq/service/CnsFaqService.java | 10 +- .../cns/qna/controller/CnsQnaController.java | 177 +++++++++++++----- .../api/cns/qna/service/CnsQnaService.java | 5 +- .../comn/file/service/ComnFileService.java | 4 +- .../com/palnet/biz/jpa/entity/CnsQnaBas.java | 16 +- .../repository/cns/CnsFaqQueryRepository.java | 6 +- 6 files changed, 150 insertions(+), 68 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java index 72a54e23..5c0e8d17 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/faq/service/CnsFaqService.java @@ -36,12 +36,10 @@ public class CnsFaqService { } public FaqListModel getFaqDetail(int sno){ - - CnsFaqBas findEntity = cnsFaqBasRepository.findById(sno).orElseThrow(() -> new CustomException(ErrorCode.DATA_NO)); - findEntity.setViewCnt(findEntity.getViewCnt() + 1); - CnsFaqBas updateEntity = cnsFaqBasRepository.save(findEntity); - return CnsFaqMapper.MAPPER.toModel(updateEntity); - + cnsFaqBasRepository.updateViewCnt(sno); + FaqListModel result = query.getFaqDetail(sno); + if(result == null) throw new CustomException(ErrorCode.DATA_NO); + return result; } @Transactional diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java index 5716f7a9..0a89299e 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java @@ -1,30 +1,30 @@ package com.palnet.biz.api.cns.qna.controller; -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - import com.palnet.biz.api.cns.qna.model.QnaBasModel; import com.palnet.biz.api.cns.qna.model.QnaDetailRSModel; import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; -import com.palnet.biz.api.cns.qna.model.QnaRSModel; import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ; import com.palnet.biz.api.cns.qna.service.CnsQnaService; - +import com.palnet.biz.api.comn.response.BasicResponse; +import com.palnet.biz.api.comn.response.ErrorResponse; +import com.palnet.biz.api.comn.response.SuccessResponse; +import com.palnet.comn.exception.CustomException; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @RestController @Slf4j +@Tag(name = "QNA", description = "QNA 관련 API") @RequiredArgsConstructor @RequestMapping("/api/cns/qna") public class CnsQnaController { @@ -32,55 +32,123 @@ public class CnsQnaController { private final CnsQnaService cnsQnaService; - @PostMapping(value = "/insert", consumes = "multipart/form-data") + // TODO json 가능 여부 + @PostMapping(consumes = "multipart/form-data") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 등록[답변추가]") - public ResponseEntity insertQna(QnaInsertRQModel rq){ - - boolean result = cnsQnaService.insertQna(rq); - - return ResponseEntity.ok().body(result); + public ResponseEntity insertQna(QnaInsertRQModel rq){ + boolean result = false; + try { + result = cnsQnaService.insertQna(rq); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - @GetMapping("/select") + @GetMapping @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 리스트 조회") - public ResponseEntity> selectQna(QnaSelectListRQ rq){ - - List result = cnsQnaService.selectQnaList(rq); - - return ResponseEntity.ok().body(result); + public ResponseEntity selectQna(QnaSelectListRQ rq){ + + List result = new ArrayList<>(); + try { + result = cnsQnaService.selectQnaList(rq); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - @GetMapping("/{qnaSno}/detail") + @GetMapping("/{qnaSno}") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 상세보기") - public ResponseEntity> detailQna(@PathVariable int qnaSno){ - - List reulst = cnsQnaService.getQnaDetail(qnaSno); - - return ResponseEntity.ok().body(reulst); + public ResponseEntity detailQna(@PathVariable int qnaSno){ + List result = null; + try { + result = cnsQnaService.getQnaDetail(qnaSno); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - @PostMapping("/{qnaSno}/update") + @PutMapping @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 업데이트") - public ResponseEntity updateQna(@PathVariable int qnaSno, QnaInsertRQModel rq){ - - boolean result = cnsQnaService.updateQna(qnaSno, rq); - - return ResponseEntity.ok().body(result); + public ResponseEntity updateQna(QnaInsertRQModel rq){ + boolean result = false; + try { + result = cnsQnaService.updateQna(rq); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } - @GetMapping("/{qnaSno}/delete") + @DeleteMapping("/{qnaSno}") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 삭제하기") - public ResponseEntity deleteQna(@PathVariable int qnaSno){ - - boolean result = cnsQnaService.deleteQna(qnaSno); - - return ResponseEntity.ok().body(result); + public ResponseEntity deleteQna(@PathVariable int qnaSno){ + + boolean result = false; + try { + result = cnsQnaService.deleteQna(qnaSno); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); } /** @@ -89,14 +157,29 @@ public class CnsQnaController { * @param fileSno * @return */ - @GetMapping("/{qnaSno}/{fileSno}/delete") + @DeleteMapping("/file/{qnaSno}/{fileSno}") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 파일 개별삭제") - public ResponseEntity deleteQnaFile(@PathVariable int qnaSno, @PathVariable int fileSno){ + public ResponseEntity deleteQnaFile(@PathVariable int qnaSno, @PathVariable int fileSno){ log.warn("CnsQnaController - deleteQnaFile()"); - boolean result = cnsQnaService.deleteQnaFile(fileSno); + boolean result = false; + try { + result = cnsQnaService.deleteQnaFile(fileSno); + } catch (CustomException e) { + Map resultMap = new HashMap<>(); + log.error("IGNORE : ", e); + resultMap.put("result", false); + resultMap.put("errorCode", e.getErrorCode()); + resultMap.put("errorMessage", e.getMessage()); + return ResponseEntity.ok().body(new SuccessResponse<>(resultMap)); + } catch (Exception e) { + log.error("IGNORE : ", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(new ErrorResponse("Server Error", "-1")); + + } + return ResponseEntity.ok().body(new SuccessResponse<>(result)); - return ResponseEntity.ok().body(result); } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java index c61de4e7..0d1de3cd 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java @@ -89,14 +89,13 @@ public class CnsQnaService { /** * Qna 업데이트하기 TODO :: File 업데이트 기능 아직 구현안함 - * @param qnaSno * @param rq * @return */ @Transactional - public boolean updateQna(int qnaSno, QnaInsertRQModel rq){ + public boolean updateQna(QnaInsertRQModel rq){ - CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y"); + CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(rq.getQnaSno(), 0, "N", "Y"); if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); List files = rq.getFiles(); diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java index ada9e1c9..3184499b 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java @@ -359,8 +359,8 @@ public class ComnFileService { file.setDelYn("Y"); file.setDelUserId(userId); - file.setDelDt(Instant.now()); - + file.setDelDt(Instant.now()); + comFileBasRepository.save(file); return true; diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java index b9fdaafe..1bca2046 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java @@ -1,12 +1,12 @@ package com.palnet.biz.jpa.entity; -import java.io.Serializable; -import java.time.Instant; +import lombok.Data; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; import javax.persistence.*; - -import lombok.Builder; -import lombok.Data; +import java.io.Serializable; +import java.time.Instant; @Entity @Data @@ -48,13 +48,15 @@ public class CnsQnaBas implements Serializable { @Column(name="CREATE_USER_ID") private String createUserId; - @Column(name="CREATE_DT") + @CreationTimestamp + @Column(name="CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false) private Instant createDt; @Column(name="UPDATE_USER_ID") private String updateUserId; - @Column(name="UPDATE_DT") + @UpdateTimestamp + @Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP") private Instant updateDt; } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java index e3b092f1..c947ca57 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsFaqQueryRepository.java @@ -45,7 +45,6 @@ public class CnsFaqQueryRepository { bas.content, bas.viewCnt, bas.expsrYn, - bas.delYn, bas.createUserId, bas.createDt, bas.updateUserId, @@ -65,7 +64,9 @@ public class CnsFaqQueryRepository { BooleanBuilder builder = new BooleanBuilder(); builder.and(bas.faqSno.eq(sno)); - + builder.and(bas.expsrYn.eq("Y")); + builder.and(bas.delYn.eq("N")); + FaqListModel r = query .select(Projections.bean( FaqListModel.class, @@ -75,7 +76,6 @@ public class CnsFaqQueryRepository { bas.content, bas.viewCnt, bas.expsrYn, - bas.delYn, bas.createUserId, bas.createDt, bas.updateUserId,