Browse Source

feat : content(faq, qna) 작업중

feature/renewal/contents
qkr7828 7 months ago
parent
commit
2712ce1700
  1. 6
      app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java
  2. 60
      common/core/src/main/java/kr/co/palnet/kac/core/response/SuccessResponse.java
  3. 6
      data/cns/src/main/java/kr/co/palnet/kac/data/cns/model/CnsFaqBas.java
  4. 19
      data/cns/src/main/java/kr/co/palnet/kac/data/cns/repository/CnsFaqBasRepository.java
  5. 15
      data/cns/src/main/java/kr/co/palnet/kac/data/cns/repository/CnsQnaBasRepository.java
  6. 7
      web/api-cns/build.gradle
  7. 543
      web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/controller/CnsFaqController.java
  8. 14
      web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/model/FaqListDto.java
  9. 4
      web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/model/FaqListRq.java
  10. 26
      web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/model/FaqListRs.java
  11. 6
      web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/model/FaqUpdateDto.java
  12. 255
      web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/service/CnsFaqService.java

6
app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java

@ -5,13 +5,9 @@ import kr.co.palnet.kac.config.security.exception.BaseAccessDeniedHandler;
import kr.co.palnet.kac.config.security.exception.BaseAuthenticationEntryPoint;
import kr.co.palnet.kac.config.security.service.BaseUserDetailsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.web.SecurityFilterChain;
import java.util.ArrayList;
@ -26,7 +22,7 @@ public class AppSecurityConfig extends SecurityConfig {
// 시큐리티 적용 안하는 URL 목록
private final String[] IGNORE_URL = {
"/v1/com/code/**",
"/v1/**",
"/v1/user/account/register",
};

60
common/core/src/main/java/kr/co/palnet/kac/core/response/SuccessResponse.java

@ -1,30 +1,30 @@
//package kr.co.palnet.kac.core.response;
//
//import io.swagger.v3.oas.annotations.media.Schema;
//import lombok.Data;
//import lombok.EqualsAndHashCode;
//
//import java.util.List;
//
//
//@Data
//@EqualsAndHashCode(callSuper=false)
//public class SuccessResponse<T> extends BasicResponse {
//
// @Schema(description = "응답 데이터 건수")
// private int count;
//
// @Schema(description = "응답 데이터")
// private T data;
//
// public SuccessResponse(T data) {
// this.data = data;
// if(data instanceof List) {
// this.count = ((List<?>)data).size();
// } else {
// this.count = 1;
// }
// }
//
//
//}
package kr.co.palnet.kac.core.response;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper=false)
public class SuccessResponse<T> extends BasicResponse {
@Schema(description = "응답 데이터 건수")
private int count;
@Schema(description = "응답 데이터")
private T data;
public SuccessResponse(T data) {
this.data = data;
if(data instanceof List) {
this.count = ((List<?>)data).size();
} else {
this.count = 1;
}
}
}

6
data/cns/src/main/java/kr/co/palnet/kac/data/cns/model/CnsFaqBas.java

@ -9,7 +9,7 @@ import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import java.time.Instant;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@ -64,7 +64,7 @@ public class CnsFaqBas {
// 등록일시
@CreationTimestamp
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false)
private Instant createDt;
private LocalDateTime createDt;
// 수정사용자ID
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false)
@ -73,6 +73,6 @@ public class CnsFaqBas {
// 수정일시
@UpdateTimestamp
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false)
private Instant updateDt;
private LocalDateTime updateDt;
}

19
data/cns/src/main/java/kr/co/palnet/kac/data/cns/repository/CnsFaqBasRepository.java

@ -1,9 +1,28 @@
package kr.co.palnet.kac.data.cns.repository;
import jakarta.transaction.Transactional;
import kr.co.palnet.kac.data.cns.model.CnsFaqBas;
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;
@Repository
public interface CnsFaqBasRepository extends JpaRepository<CnsFaqBas, Integer> {
@Modifying
@Transactional
@Query("update CnsFaqBas c set c.viewCnt = c.viewCnt + 1" +
"where c.faqSno = :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);
}

15
data/cns/src/main/java/kr/co/palnet/kac/data/cns/repository/CnsQnaBasRepository.java

@ -3,6 +3,21 @@ package kr.co.palnet.kac.data.cns.repository;
import kr.co.palnet.kac.data.cns.model.CnsQnaBas;
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;
@Repository
public interface CnsQnaBasRepository extends JpaRepository<CnsQnaBas, Integer> {
CnsQnaBas findFirstByTargetSnoAndDelYnAndExpsrYn(int targetSno, String delYn, String expsrYn);
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")
void pulsViewCount(@Param("qnaSno")int qnaSno);
}

7
web/api-cns/build.gradle

@ -7,6 +7,13 @@ dependencies {
compileOnly 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'
implementation project(":data:cns")
implementation project(":data:com")
implementation project(":data:ctr")
implementation project(":data:flt")
implementation project(":data:other")
implementation project(":data:pty")
implementation project(":data:user")
implementation project(":common:core")
compileOnly project(":web:security")
}

543
web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/controller/CnsFaqController.java

@ -1,279 +1,264 @@
//package kr.co.palnet.kac.api.v1.cns.faq.controller;
//
//
//import io.swagger.v3.oas.annotations.Operation;
//import io.swagger.v3.oas.annotations.Parameter;
//import io.swagger.v3.oas.annotations.enums.ParameterIn;
//import io.swagger.v3.oas.annotations.responses.ApiResponse;
//import io.swagger.v3.oas.annotations.responses.ApiResponses;
//import io.swagger.v3.oas.annotations.tags.Tag;
//import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListDto;
//import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListRq;
//import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListRs;
//import kr.co.palnet.kac.api.v1.cns.faq.model.FaqUpdateDto;
//import kr.co.palnet.kac.api.v1.cns.faq.service.CnsFaqService;
//import kr.co.palnet.kac.core.exception.BaseException;
//import kr.co.palnet.kac.core.response.BasicResponse;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.ResponseEntity;
//import org.springframework.web.ErrorResponse;
//import org.springframework.web.bind.annotation.*;
//
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//@RestController
//@Slf4j
//@RequiredArgsConstructor
//@RequestMapping(value = "/v1/cns/faq")
//@Tag(name = "FAQ", description = "FAQ 관련 API")
//public class CnsFaqController {
//
// private final CnsFaqService service;
//
// /**
// * FAQ 목록 조회하는 기능,
// * FaqListRQModel 값에 있는 조건값으로 조회함.
// * @param model
// * @return
// */
// @GetMapping
// @Operation(summary = "FAQ 조회", description = "FAQ를 조회하는 API 입니다.")
// public ResponseEntity<? extends BasicResponse> getFaqList(FaqListRq model) {
// List<FaqListRs> result = null;
// try {
// result = service.getFaqList(model); // FaQ 항목들 조회하는 기능
// } catch (BaseException e) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * CustomException은 개발자가 "의도적으로" 낸 예외처리,
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// Map<String, Object> 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) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// 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 상세 조회하는 기능,
// * 일련번호[sno]로 조회함.
// * @param sno
// * @return
// */
// @GetMapping("/{sno}")
// @Operation(summary = "FAQ 상세 조회", description = "특정 FAQ만 조회하는 API 입니다. sno 값 : 1, 2, 등 ....")
// @ApiResponses(value = {
// @ApiResponse(responseCode = "200", description = "성공",
// content = {
// @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
// array = @io.swagger.v3.oas.annotations.media.ArraySchema(
// schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = FaqListDto.class)))
// })
// })
// public ResponseEntity<? extends BasicResponse> getFaqDetail(
// @Parameter(name="sno", description = "FAQ 시리얼 넘버", in = ParameterIn.PATH, example = "17")@PathVariable int sno) {
// FaqListRs result = null;
// try {
// result = service.getFaqDetail(sno); // 일련번호[sno]로 상세정보를 조회하는 기능
// } catch (CustomException e) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * CustomException은 개발자가 "의도적으로" 낸 예외처리,
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// Map<String, Object> 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) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// 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 작성하는 기능,
// * FaqListModel모델에 있는 값으로 작성하는 기능.
// * @param model
// * @return
// */
// @PostMapping
// @Operation(summary = "FAQ 작성", description = "FAQ를 작성하는 API 입니다.")
// @ApiResponses(value = {
// @ApiResponse(responseCode = "200", description = "성공",
// content = {
// @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
// array = @io.swagger.v3.oas.annotations.media.ArraySchema(
// schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = SuccessResponse.class)))
// })
// })
// public ResponseEntity<? extends BasicResponse> insertFaq(@RequestBody FaqListDto model) {
// boolean result = false;
// try {
// result = service.insertFaq(model); // FaQ 추가하는 기능
// } catch (CustomException e) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * CustomException은 개발자가 "의도적으로" 낸 예외처리,
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// Map<String, Object> 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) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// 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 업데이트 기능,
// * FaqListModel 모델에 있는 값으로 업데이트함.
// * @param model
// * @return
// */
// @PutMapping
// @Operation(summary = "FAQ 수정", description = "FAQ를 수정하는 API 입니다.")
// @ApiResponses(value = {
// @ApiResponse(responseCode = "200", description = "성공",
// content = {
// @io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
// array = @io.swagger.v3.oas.annotations.media.ArraySchema(
// schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = SuccessResponse.class)))
// })
// })
// public ResponseEntity<? extends BasicResponse> updateFaq(@RequestBody FaqUpdateDto model) {
// boolean result = false;
// try {
// result = service.updateFaq(model); // FaQ 수정하는 기능
// } catch (CustomException e) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * CustomException은 개발자가 "의도적으로" 낸 예외처리,
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// Map<String, Object> 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) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// 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 삭제하는 기능,
// * 일련번호[sno]로 삭제하는 기능.
// * @param sno
// * @return
// */
// @DeleteMapping("/{sno}")
// @Operation(summary = "FAQ 삭제", description = "특정 FAQ를 논리 삭제하는 API 입니다. sno 예시 : 1, 2, 등 ...")
// public ResponseEntity<? extends BasicResponse> deleteFaq(@PathVariable("sno") int sno) {
// // TODO 성공/실패 상태값 전송
// try {
// service.deleteFaq(sno); // 일련번호[sno]로 삭제하는 기능
// } catch (CustomException e) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// Map<String, Object> 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) {
// /**
// * try{
// ...
// }
// * try 영역 안 코드들중 문제가 생기면 오는 곳.
// * log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
// */
// log.error("IGNORE : ", e);
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(new ErrorResponse("Server Error", "-1"));
//
// }
// return ResponseEntity.ok().build();
//
// }
//}
package kr.co.palnet.kac.api.v1.cns.faq.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListDto;
import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListRq;
import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListRs;
import kr.co.palnet.kac.api.v1.cns.faq.model.FaqUpdateDto;
import kr.co.palnet.kac.api.v1.cns.faq.service.CnsFaqService;
import kr.co.palnet.kac.core.exception.BaseException;
import kr.co.palnet.kac.core.response.BasicResponse;
import kr.co.palnet.kac.core.response.ErrorResponse;
import kr.co.palnet.kac.core.response.SuccessResponse;
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.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@Slf4j
@RequiredArgsConstructor
@RequestMapping(value = "/v1/cns/faq")
@Tag(name = "FAQ", description = "FAQ 관련 API")
public class CnsFaqController {
private final CnsFaqService service;
/**
* FAQ 목록 조회하는 기능,
* FaqListRQModel 값에 있는 조건값으로 조회함.
* @param model
* @return
*/
@GetMapping
@Operation(summary = "FAQ 조회", description = "FAQ를 조회하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> getFaqList(FaqListRq model) {
List<FaqListRs> result = null;
try {
result = service.getFaqList(model); // FaQ 항목들 조회하는 기능
} catch (BaseException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> 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) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
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 상세 조회하는 기능,
* 일련번호[sno] 조회함.
* @param sno
* @return
*/
@GetMapping("/{sno}")
@Operation(summary = "FAQ 상세 조회", description = "특정 FAQ만 조회하는 API 입니다. sno 값 : 1, 2, 등 ....")
public ResponseEntity<? extends BasicResponse> getFaqDetail(
@Parameter(name="sno", description = "FAQ 시리얼 넘버", in = ParameterIn.PATH, example = "3")@PathVariable int sno) {
FaqListRs result = null;
try {
result = service.getFaqDetail(sno); // 일련번호[sno]로 상세정보를 조회하는 기능
} catch (BaseException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> 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) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
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 작성하는 기능,
* FaqListModel모델에 있는 값으로 작성하는 기능.
* @param model
* @return
*/
@PostMapping
@Operation(summary = "FAQ 작성", description = "FAQ를 작성하는 API 입니다.")
public ResponseEntity<? extends BasicResponse> insertFaq(@RequestBody FaqListDto model) {
boolean result = false;
try {
result = service.insertFaq(model); // FaQ 추가하는 기능
} catch (BaseException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> 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) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
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 업데이트 기능,
* FaqListModel 모델에 있는 값으로 업데이트함.
* @param model
* @return
*/
@PutMapping
@Operation(summary = "FAQ 수정", description = "FAQ를 수정하는 API 입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공",
content = {
@io.swagger.v3.oas.annotations.media.Content(mediaType = "application/json",
array = @io.swagger.v3.oas.annotations.media.ArraySchema(
schema = @io.swagger.v3.oas.annotations.media.Schema(implementation = SuccessResponse.class)))
})
})
public ResponseEntity<? extends BasicResponse> updateFaq(@RequestBody FaqUpdateDto model) {
boolean result = false;
try {
result = service.updateFaq(model); // FaQ 수정하는 기능
} catch (BaseException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* CustomException은 개발자가 "의도적으로" 예외처리,
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> 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) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
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 삭제하는 기능,
* 일련번호[sno] 삭제하는 기능.
* @param sno
* @return
*/
@DeleteMapping("/{sno}")
@Operation(summary = "FAQ 삭제", description = "특정 FAQ를 논리 삭제하는 API 입니다. sno 예시 : 1, 2, 등 ...")
public ResponseEntity<? extends BasicResponse> deleteFaq(@PathVariable("sno") int sno) {
// TODO 성공/실패 상태값 전송
try {
service.deleteFaq(sno); // 일련번호[sno]로 삭제하는 기능
} catch (BaseException e) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
Map<String, Object> 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) {
/**
* try{
...
}
* try 영역 코드들중 문제가 생기면 오는 .
* log.error 로그로 원인 파악과 함께 API를 호출한 곳에 서버에러 내려줌
*/
log.error("IGNORE : ", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("Server Error", "-1"));
}
return ResponseEntity.ok().build();
}
}

14
web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/model/FaqListDto.java

@ -3,7 +3,7 @@ package kr.co.palnet.kac.api.v1.cns.faq.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
import java.time.LocalDateTime;
@Data
public class FaqListDto {
@ -31,14 +31,14 @@ public class FaqListDto {
@Schema(hidden = true)
private String createUserId;
@Schema(description = "생성일자", example = "2023-12-12", implementation = String.class)
private Instant createDt;
@Schema(description = "생성일자", example = "2023-12-12T00:00:00", implementation = String.class)
private LocalDateTime createDt;
@Schema(hidden = true)
private String updateUserId;
@Schema(description = "업데이트 일자", example = "2023-12-12", implementation = String.class)
private Instant updateDt;
@Schema(description = "업데이트 일자", example = "2023-12-12T00:00:00", implementation = String.class)
private LocalDateTime updateDt;
}

4
web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/model/FaqListRq.java

@ -6,10 +6,10 @@ import lombok.Data;
@Data
public class FaqListRq {
@Schema(description = "FAQ 카테고리" , example = "비행승인")
@Schema(description = "FAQ 카테고리" , example = "장치신고")
private String category;
@Schema(description = "해당 단어가 포함된 제목 검색" , example = "비행")
@Schema(description = "해당 단어가 포함된 제목 검색" , example = "제목")
private String word;
}

26
web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/model/FaqListRs.java

@ -1,10 +1,13 @@
package kr.co.palnet.kac.api.v1.cns.faq.model;
import kr.co.palnet.kac.data.cns.model.CnsFaqBas;
import lombok.Builder;
import lombok.Data;
import java.time.Instant;
import java.time.LocalDateTime;
@Data
@Builder
public class FaqListRs {
private int faqSno;
@ -23,10 +26,25 @@ public class FaqListRs {
private String createUserId;
private Instant createDt;
private LocalDateTime createDt;
private String updateUserId;
private Instant updateDt;
private LocalDateTime updateDt;
public static FaqListRs toRs(CnsFaqBas cnsFaqBas){
return FaqListRs.builder()
.faqSno(cnsFaqBas.getFaqSno().intValue())
.category(cnsFaqBas.getCategory())
.title(cnsFaqBas.getTitle())
.content(cnsFaqBas.getContent())
.viewCnt(cnsFaqBas.getViewCnt())
.expsrYn(cnsFaqBas.getExpsrYn())
.delYn(cnsFaqBas.getDelYn())
.createUserId(cnsFaqBas.getCreateUserId())
.createDt(cnsFaqBas.getCreateDt())
.updateUserId(cnsFaqBas.getUpdateUserId())
.updateDt(cnsFaqBas.getUpdateDt())
.build();
}
}

6
web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/model/FaqUpdateDto.java

@ -3,7 +3,7 @@ package kr.co.palnet.kac.api.v1.cns.faq.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.Instant;
import java.time.LocalDateTime;
@Data
public class FaqUpdateDto {
@ -33,12 +33,12 @@ public class FaqUpdateDto {
private String createUserId;
@Schema(hidden = true)
private Instant createDt;
private LocalDateTime createDt;
@Schema(description = "수정한 사람" , example = "palnet")
private String updateUserId;
@Schema(description = "업데이트 일자")
private Instant updateDt;
private LocalDateTime updateDt;
}

255
web/api-cns/src/main/java/kr/co/palnet/kac/api/v1/cns/faq/service/CnsFaqService.java

@ -1,126 +1,129 @@
//package kr.co.palnet.kac.api.v1.cns.faq.service;
//
//
//import jakarta.transaction.Transactional;
//import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListRq;
//import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListRs;
//import kr.co.palnet.kac.core.code.ErrorCode;
//import kr.co.palnet.kac.core.exception.BaseException;
//import kr.co.palnet.kac.data.cns.model.CnsFaqBas;
//import kr.co.palnet.kac.data.cns.repository.CnsFaqBasRepository;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//
//import java.util.ArrayList;
//import java.util.List;
//
//@Slf4j
//@Service
//@RequiredArgsConstructor
//public class CnsFaqService {
//
// private final CnsFaqQueryRepository query;
// private final CnsFaqBasRepository cnsFaqBasRepository;
// private final JwtTokenUtil jwtTokenUtil;
//
// /**
// * FaQ 항목들 조회하는 기능.
// * @param model
// * @return
// */
// public List<FaqListRs> getFaqList(FaqListRq model){
//
// List<FaqListRs> result = query.getFaqList(model.getCategory(), model.getWord());
//
// if(result == null) result = new ArrayList<>();
//
// return result;
//
// }
//
// /**
// * 일련번호[sno]로 상세정보를 조회하는 기능.
// * @param sno
// * @return
// */
// public FaqListRs getFaqDetail(int sno){
// cnsFaqBasRepository.updateViewCnt(sno);
// FaqListRs result = query.getFaqDetail(sno);
// if(result == null) throw new BaseException(ErrorCode.DATA_NO);
// return result;
// }
//
// /**
// * FaQ 추가하는 기능.
// * @param model
// * @return
// */
// @Transactional
// public boolean insertFaq(FaqListModel model){
// String userId = jwtTokenUtil.getUserIdByToken();
//
// CnsFaqBas bas = new CnsFaqBas();
//
// bas.setCreateUserId(userId);
// bas.setUpdateUserId(userId);
//
// bas.setCategory(model.getCategory());
// bas.setContent(model.getContent());
// bas.setExpsrYn(model.getExpsrYn());
// bas.setTitle(model.getTitle());
//
// bas.setDelYn("N");
// bas.setViewCnt(0);
//
// try {
// 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);
// }
// }
//
// /**
// * FaQ 수정하는 기능.
// * @param model
// * @return
// */
// @Transactional
// public boolean updateFaq(FaqUpdateModel 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());
// prevData.setUpdateUserId(userId);
//
//
// try {
// 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);
// }
// }
//
// /**
// * 일련번호[sno]로 삭제하는 기능.
// * @param sno
// */
// public void deleteFaq(int sno) {
//
// // TODO 반환값이 실행한 갯수인지 확인 필요
// int delCnt = cnsFaqBasRepository.deleteFaq(sno);
//
// if(delCnt == 0) throw new CustomException(ErrorCode.DATA_NO);
//
// }
//}
package kr.co.palnet.kac.api.v1.cns.faq.service;
import jakarta.transaction.Transactional;
import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListDto;
import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListRq;
import kr.co.palnet.kac.api.v1.cns.faq.model.FaqListRs;
import kr.co.palnet.kac.api.v1.cns.faq.model.FaqUpdateDto;
import kr.co.palnet.kac.config.security.util.SessionHelper;
import kr.co.palnet.kac.core.exception.BaseErrorCode;
import kr.co.palnet.kac.core.exception.BaseException;
import kr.co.palnet.kac.data.cns.model.CnsFaqBas;
import kr.co.palnet.kac.data.cns.service.CnsFaqDomainService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
public class CnsFaqService {
private final CnsFaqDomainService cnsFaqDomainService;
/**
* FaQ 항목들 조회하는 기능.
* @param model
* @return
*/
public List<FaqListRs> getFaqList(FaqListRq model){
List<CnsFaqBas> result = cnsFaqDomainService.getFaqList(model.getCategory(), model.getWord());
if(result == null) return null;
return result.stream().map(FaqListRs::toRs).toList();
}
/**
* 일련번호[sno] 상세정보를 조회하는 기능.
* @param sno
* @return
*/
public FaqListRs getFaqDetail(int sno){
cnsFaqDomainService.updateViewCnt(sno);
CnsFaqBas result = cnsFaqDomainService.getFaqDetail(sno);
if(result == null) throw new BaseException(BaseErrorCode.DATA_EMPTY);
return FaqListRs.toRs(result);
}
/**
* FaQ 추가하는 기능.
* @param model
* @return
*/
@Transactional
public boolean insertFaq(FaqListDto model){
String userId = SessionHelper.getUserId() == null ? "test" : SessionHelper.getUserId();
CnsFaqBas bas = new CnsFaqBas();
bas.setCreateUserId(userId);
bas.setUpdateUserId(userId);
bas.setCategory(model.getCategory());
bas.setContent(model.getContent());
bas.setExpsrYn(model.getExpsrYn());
bas.setTitle(model.getTitle());
bas.setDelYn("N");
bas.setViewCnt(0);
try {
CnsFaqBas saveEntity = cnsFaqDomainService.saveFaqBas(bas);
if(saveEntity != null) return true;
else return false;
} catch(Exception e) {
// TODO parameter validate...??
throw new BaseException(BaseErrorCode.WEB_PARAM_INVALID);
}
}
/**
* FaQ 수정하는 기능.
* @param model
* @return
*/
@Transactional
public boolean updateFaq(FaqUpdateDto model) {
String userId = SessionHelper.getUserId() == null ? "test" : SessionHelper.getUserId();
CnsFaqBas prevData = cnsFaqDomainService.findById(model.getFaqSno()).orElseThrow(() -> new BaseException(BaseErrorCode.DATA_EMPTY));
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());
prevData.setUpdateUserId(userId);
try {
CnsFaqBas saveEntity = cnsFaqDomainService.saveFaqBas(prevData);
if(saveEntity != null) return true;
else return false;
} catch(Exception e) {
// TODO parameter validate...??
throw new BaseException(BaseErrorCode.WEB_PARAM_INVALID);
}
}
/**
* 일련번호[sno] 삭제하는 기능.
* @param sno
*/
public void deleteFaq(int sno) {
// TODO 반환값이 실행한 갯수인지 확인 필요
int delCnt = cnsFaqDomainService.deleteFaq(sno);
if(delCnt == 0) throw new BaseException(BaseErrorCode.DATA_EMPTY);
}
}
Loading…
Cancel
Save