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; }