Browse Source

qna 설계 변경으로 인한 수정

pull/12/head
지대한 11 months ago
parent
commit
2ee86cadcd
  1. 36
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java
  2. 1
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java
  3. 2
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java
  4. 1
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java
  5. 59
      pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java
  6. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java
  7. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java
  8. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasOwnerModel.java
  9. 5
      pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupModel.java
  10. 52
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java
  11. 12
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java
  12. 3
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java
  13. 17
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java
  14. 3
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java
  15. 3
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java
  16. 34
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaMapper.java
  17. 179
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java
  18. 11
      pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java
  19. 27
      pav-server/src/main/java/com/palnet/biz/api/comn/file/model/ComnFileModel.java
  20. 23
      pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileMapper.java
  21. 81
      pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java
  22. 1
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java
  23. 4
      pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWarnLogModel.java
  24. 45
      pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java
  25. 1
      pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java
  26. 86
      pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java
  27. 5
      pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java
  28. 25
      pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java
  29. 1
      pav-server/src/main/java/com/palnet/comn/code/RSErrorCode.java

36
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java

@ -1,32 +1,8 @@
package com.palnet.biz.api.acnt.jwt.controller;
import java.util.HashMap;
import java.util.Map;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
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.RequestAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.palnet.biz.api.acnt.jwt.model.JwtProfileRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRqModel;
import com.palnet.biz.api.acnt.jwt.model.JwtRsModel;
import com.palnet.biz.api.acnt.jwt.model.JwtUserModel;
import com.palnet.biz.api.acnt.jwt.service.JwtService;
import com.palnet.biz.api.acnt.jwt.service.JwtUserDetailsService;
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil;
@ -35,10 +11,18 @@ import com.palnet.biz.api.comn.response.ErrorResponse;
import com.palnet.biz.api.comn.response.SuccessResponse;
import com.palnet.biz.jpa.entity.PtyCstmrBas;
import com.palnet.comn.code.RSErrorCode;
import com.palnet.comn.utils.EncryptUtils;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequiredArgsConstructor

1
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java

@ -13,6 +13,7 @@ public class JwtRsModel implements Serializable {
private String refreshToken;
private String userId;
private String userNm;
private Integer cstmrSno;

2
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java

@ -36,6 +36,8 @@ public class JwtUserModel implements UserDetails {
@Column(name = "CSTMR_STATUS_CD")
private String cstmrStatusCd;
@Transient
private String userNm;
@Transient
private List<JwtGroupModel> group;

1
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java

@ -113,6 +113,7 @@ public class JwtService {
result.setRefreshToken(refreshToken);
result.setAuth(userDetails.getAuth());
result.setUserId(userDetails.getUserId());
result.setUserNm(userDetails.getUserNm());
result.setCstmrSno(userDetails.getCstmrSno());
ptyCstmrDtlRepository.findById(userDetails.getCstmrSno()).ifPresent(ptyCstmrDtl -> {

59
pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java

@ -14,7 +14,6 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.time.Instant;
import java.util.*;
import java.util.function.Function;
@ -25,8 +24,8 @@ public class JwtTokenUtil implements Serializable {
private static final long serialVersionUID = -2550185165626007488L;
public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60; // 5시간
// public static final long JWT_TOKEN_VALIDITY = 10; // 10초
public static final long JWT_REFRESH_TOKEN_VALIDTY = 21* 24 * 60 * 60; //21일
// public static final long JWT_TOKEN_VALIDITY = 10; // 10초
public static final long JWT_REFRESH_TOKEN_VALIDTY = 21 * 24 * 60 * 60; //21일
@Value("${spring.jwt.secret}")
@ -50,6 +49,7 @@ public class JwtTokenUtil implements Serializable {
final Claims claims = getAllClaimsFromToken(token);
return claimsResolver.apply(claims);
}
//for retrieveing any information from token we will need the secret key
private Claims getAllClaimsFromToken(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
@ -71,15 +71,16 @@ public class JwtTokenUtil implements Serializable {
claims.put("cstmrSno", userDetails.getCstmrSno());
claims.put("auth", userDetails.getAuth());
claims.put("group", userDetails.getGroup());
claims.put("userNm", userDetails.getUserNm());
return doGenerateToken(claims, userDetails.getUsername());
}
public String generateRefreshToken(JwtUserModel userDetails) {
Map<String, Object> claims = new HashMap<>();
claims.put("userId", userDetails.getUserId());
claims.put("cstmrSno", userDetails.getCstmrSno());
return doGenerateRefreshToken(claims, userDetails.getUsername());
Map<String, Object> claims = new HashMap<>();
claims.put("userId", userDetails.getUserId());
claims.put("cstmrSno", userDetails.getCstmrSno());
return doGenerateRefreshToken(claims, userDetails.getUsername());
}
@ -95,10 +96,10 @@ public class JwtTokenUtil implements Serializable {
.signWith(SignatureAlgorithm.HS512, secret).compact();
}
private String doGenerateRefreshToken(Map<String , Object> claims , String subject) {
return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + JWT_REFRESH_TOKEN_VALIDTY * 1000))
.signWith(SignatureAlgorithm.HS512, secret).compact();
private String doGenerateRefreshToken(Map<String, Object> claims, String subject) {
return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + JWT_REFRESH_TOKEN_VALIDTY * 1000))
.signWith(SignatureAlgorithm.HS512, secret).compact();
}
//validate token
@ -111,22 +112,34 @@ public class JwtTokenUtil implements Serializable {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
String userId = getUsernameFromToken(token);
return userId;
}
public String getUserNmByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);
return payload.get("userNm", String.class);
}
public Integer getCstmrSnoByToken() {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);
Integer cstmrSno = payload.get("cstmrSno",Integer.class);
Integer cstmrSno = payload.get("cstmrSno", Integer.class);
return cstmrSno;
}
@ -135,20 +148,20 @@ public class JwtTokenUtil implements Serializable {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);
List<LinkedHashMap> groupList = payload.get("group", ArrayList.class);
List<JwtGroupModel> r = new ArrayList<>();
if(groupList!=null) {
for(LinkedHashMap<String, String> map : groupList){
JwtGroupModel model = new JwtGroupModel();
model.setGroupId(map.get("groupId"));
model.setGroupAuthCd(map.get("groupAuthCd"));
r.add(model);
}
if (groupList != null) {
for (LinkedHashMap<String, String> map : groupList) {
JwtGroupModel model = new JwtGroupModel();
model.setGroupId(map.get("groupId"));
model.setGroupAuthCd(map.get("groupAuthCd"));
r.add(model);
}
}
return r;
}
@ -157,7 +170,7 @@ public class JwtTokenUtil implements Serializable {
HttpServletRequest rq = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = rq.getHeader("Authorization");
if(token == null || "".equals(token)) return null;
if (token == null || "".equals(token)) return null;
token = token.substring(JWT_PREFIX.length()).trim();
Claims payload = getAllClaimsFromToken(token);

5
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java

@ -1,12 +1,11 @@
package com.palnet.biz.api.bas.dron.model;
import java.time.Instant;
import java.util.Date;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.palnet.biz.config.convert.InstantDateStrSerializer;
import lombok.Data;
import java.time.Instant;
@Data
public class BasDronModel {

5
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java

@ -1,10 +1,9 @@
package com.palnet.biz.api.bas.dron.model;
import java.time.Instant;
import java.util.Date;
import lombok.Data;
import java.time.Instant;
@Data
public class BasIdntfModel {

5
pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasOwnerModel.java

@ -1,10 +1,9 @@
package com.palnet.biz.api.bas.dron.model;
import java.time.Instant;
import java.util.Date;
import lombok.Data;
import java.time.Instant;
@Data
public class BasOwnerModel {

5
pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupModel.java

@ -1,10 +1,9 @@
package com.palnet.biz.api.bas.group.model;
import java.time.Instant;
import java.util.Date;
import lombok.Data;
import java.time.Instant;
@Data
public class BasGroupModel {

52
pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java

@ -1,13 +1,12 @@
package com.palnet.biz.api.cns.qna.controller;
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.acnt.jwt.utils.JwtTokenUtil;
import com.palnet.biz.api.cns.qna.model.*;
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.code.RSErrorCode;
import com.palnet.comn.exception.CustomException;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -17,6 +16,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.naming.AuthenticationException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -30,13 +30,13 @@ import java.util.Map;
public class CnsQnaController {
private final CnsQnaService cnsQnaService;
private final JwtTokenUtil jwtTokenUtil;
// TODO json 가능 여부
@PostMapping(consumes = "multipart/form-data")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 등록[답변추가]")
public ResponseEntity<? extends BasicResponse> insertQna(QnaInsertRQModel rq){
@ApiOperation(value = "QnA 등록 - 사용자")
public ResponseEntity<? extends BasicResponse> insertQna(QnaInsertRQModel rq) {
boolean result = false;
try {
result = cnsQnaService.insertQna(rq);
@ -59,7 +59,7 @@ public class CnsQnaController {
@GetMapping
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 리스트 조회")
public ResponseEntity<? extends BasicResponse> selectQna(QnaSelectListRQ rq){
public ResponseEntity<? extends BasicResponse> selectQna(QnaSelectListRQ rq) {
List<QnaBasModel> result = new ArrayList<>();
try {
@ -84,8 +84,8 @@ public class CnsQnaController {
@GetMapping("/{qnaSno}")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 상세보기")
public ResponseEntity<? extends BasicResponse> detailQna(@PathVariable int qnaSno){
List<QnaDetailRSModel> result = null;
public ResponseEntity<? extends BasicResponse> detailQna(@PathVariable int qnaSno) {
QnaDetailRSModel result = null;
try {
result = cnsQnaService.getQnaDetail(qnaSno);
} catch (CustomException e) {
@ -106,8 +106,8 @@ public class CnsQnaController {
@PutMapping
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 업데이트")
public ResponseEntity<? extends BasicResponse> updateQna(QnaInsertRQModel rq){
@ApiOperation(value = "QnA 수정 - 사용자")
public ResponseEntity<? extends BasicResponse> updateQna(QnaInsertRQModel rq) {
boolean result = false;
try {
result = cnsQnaService.updateQna(rq);
@ -130,8 +130,8 @@ public class CnsQnaController {
@DeleteMapping("/{qnaSno}")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 삭제하기")
public ResponseEntity<? extends BasicResponse> deleteQna(@PathVariable int qnaSno){
public ResponseEntity<? extends BasicResponse> deleteQna(@PathVariable int qnaSno) {
// TODO 관리자만 삭제 가능 여부인지 확인 필요
boolean result = false;
try {
result = cnsQnaService.deleteQna(qnaSno);
@ -151,21 +151,19 @@ public class CnsQnaController {
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
/**
* Qna Files 개별삭제 TODO:: 파일 업데이트의 기획이 어떻게 되는지 모름
* @param qnaSno
* @param fileSno
* @return
*/
@DeleteMapping("/file/{qnaSno}/{fileSno}")
@PutMapping("/answer")
@Tag(name = "QNA", description = "QNA 관련 API")
@ApiOperation(value = "QnA 파일 개별삭제")
public ResponseEntity<? extends BasicResponse> deleteQnaFile(@PathVariable int qnaSno, @PathVariable int fileSno){
log.warn("CnsQnaController - deleteQnaFile()");
@ApiOperation(value = "QnA 답변 등록 - 관리자")
public ResponseEntity<? extends BasicResponse> insertAnswer(@RequestBody QnaInsertAnserRQModel rq) {
// TODO 추후 auth -> role 체크로 변경
boolean result = false;
try {
result = cnsQnaService.deleteQnaFile(fileSno);
String userAuthByToken = jwtTokenUtil.getUserAuthByToken();
if (!"SUPER".equals(userAuthByToken)) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new ErrorResponse(RSErrorCode.AUTH_ERROR));
}
result = cnsQnaService.insertAnswer(rq);
} catch (CustomException e) {
Map<String, Object> resultMap = new HashMap<>();
log.error("IGNORE : ", e);
@ -180,6 +178,6 @@ public class CnsQnaController {
}
return ResponseEntity.ok().body(new SuccessResponse<>(result));
}
}

12
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java

@ -1,9 +1,9 @@
package com.palnet.biz.api.cns.qna.model;
import java.time.Instant;
import lombok.Data;
import java.time.Instant;
@Data
public class QnaBasModel {
@ -17,6 +17,14 @@ public class QnaBasModel {
private String content;
private String anserContent;
private String anserUserNm;
private Instant anserProcDt;
private String anserStatus;
private int fileGroupNo;
private String expsrYn;

3
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java

@ -3,6 +3,7 @@ package com.palnet.biz.api.cns.qna.model;
import java.time.Instant;
import java.util.List;
import com.palnet.biz.api.comn.file.model.ComnFileModel;
import com.palnet.biz.jpa.entity.ComFileBas;
import lombok.Data;
@ -30,5 +31,5 @@ public class QnaDetailRSModel {
private Instant updateDt;
private List<ComFileBas> files;
private List<ComnFileModel> files;
}

17
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java

@ -0,0 +1,17 @@
package com.palnet.biz.api.cns.qna.model;
import lombok.Data;
@Data
public class QnaInsertAnserRQModel {
private Integer qnaSno;
// private Integer targetSno; // 상위 Qna 번호
private String anserContent;
// private String anserUserNm;
// private Instant anserProcDt;
private String anserStatus;
}

3
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java

@ -2,6 +2,7 @@ package com.palnet.biz.api.cns.qna.model;
import java.util.List;
import com.palnet.biz.api.comn.file.model.ComnFileModel;
import org.springframework.web.multipart.MultipartFile;
import lombok.Data;
@ -19,5 +20,7 @@ public class QnaInsertRQModel {
private String content;
private List<ComnFileModel> fileInfos;
private List<MultipartFile> files;
}

3
pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java

@ -5,7 +5,8 @@ import lombok.Data;
@Data
public class QnaSelectListRQ {
private String searchType;
private String word;
private String category;
}

34
pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaMapper.java

@ -0,0 +1,34 @@
package com.palnet.biz.api.cns.qna.service;
import com.palnet.biz.api.cns.qna.model.QnaDetailRSModel;
import com.palnet.biz.api.cns.qna.model.QnaInsertAnserRQModel;
import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel;
import com.palnet.biz.jpa.entity.CnsQnaBas;
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.qna.service
* fileName : CnsQnaMapper
* 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 CnsQnaMapper {
CnsQnaMapper MAPPER = Mappers.getMapper(CnsQnaMapper.class);
CnsQnaBas toEntity(QnaInsertRQModel rq);
QnaDetailRSModel toModel(CnsQnaBas qnaBasModel);
void merge(@MappingTarget CnsQnaBas entity, QnaInsertRQModel rq);
void merge(@MappingTarget CnsQnaBas entity, QnaInsertAnserRQModel rq);
}

179
pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java

@ -1,30 +1,23 @@
package com.palnet.biz.api.cns.qna.service;
import java.time.Instant;
import java.util.ArrayList;
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.QnaDetailRSModel;
import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel;
import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ;
import com.palnet.biz.api.cns.qna.model.*;
import com.palnet.biz.api.comn.file.model.ComnFileModel;
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 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 org.springframework.web.multipart.MultipartFile;
import javax.transaction.Transactional;
import java.time.Instant;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
@ -35,81 +28,63 @@ public class CnsQnaService {
private final CnsQnaQueryRepository cnsQnaQueryRepository;
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
* @return
*/
@Transactional
public boolean deleteQna(int qnaSno){
public boolean deleteQna(int qnaSno) {
CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(qnaSno, "N", "Y");
if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND);
if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND);
if(entity.getFileGroupNo() != null) comnFileService.deleteFiles(entity.getFileGroupNo());
if (entity.getFileGroupNo() != null) comnFileService.deleteFilesByFileGroupNo(entity.getFileGroupNo());
entity.setDelYn("Y");
List<CnsQnaBas> deleteList = new ArrayList<>();
deleteList.add(entity);
int targetSno = qnaSno;
// 대댓글 불러오기
while(true){
CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSnoAndDelYnAndExpsrYn(targetSno, "N", "Y");
if(cnsQnaBas == null) break;
cnsQnaBas.setDelYn("Y");
deleteList.add(cnsQnaBas);
targetSno = cnsQnaBas.getQnaSno();
}
deleteList = cnsQnaBasRepository.saveAll(deleteList);
cnsQnaBasRepository.save(entity);
return true;
}
/**
* Qna 업데이트하기 TODO :: File 업데이트 기능 아직 구현안함
*
* @param rq
* @return
*/
@Transactional
public boolean updateQna(QnaInsertRQModel rq){
public boolean updateQna(QnaInsertRQModel rq) {
CnsQnaBas entity = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(rq.getQnaSno(), 0, "N", "Y");
if(entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND);
if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND);
// 파일 삭제(논리적 삭제)
List<ComnFileModel> prevFileInfos = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo());
List<Integer> prevFileSnoList = prevFileInfos.stream().map(ComnFileModel::getFileSno).collect(Collectors.toList());
List<Integer> currentFileSnoList = rq.getFileInfos().stream().map(ComnFileModel::getFileSno).collect(Collectors.toList());
boolean isChange = prevFileSnoList.removeAll(currentFileSnoList);
if (isChange) comnFileService.deleteFilesByFileGroupNo(entity.getFileGroupNo()); // File 삭제
List<MultipartFile> files = rq.getFiles();
if(files != null && files.size() > 0) comnFileService.fileUpload(files, entity.getFileGroupNo()); // File 업로드
if (files != null && !files.isEmpty()) 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());
// if(rq.getCategory() != null) entity.setCategory(rq.getCategory());
// if(rq.getContent() != null) entity.setContent(rq.getContent());
// if(rq.getTitle() != null) entity.setTitle(rq.getTitle());
CnsQnaMapper.MAPPER.merge(entity, rq);
String userId = jwtTokenUtil.getUserIdByToken();
if (userId == null) userId = "NONE";
entity.setUpdateDt(Instant.now());
entity.setUpdateUserId(userId);
cnsQnaBasRepository.save(entity);
@ -119,99 +94,62 @@ public class CnsQnaService {
/**
* Qna 상세불러오기
*
* @param qnaSno
* @return
*/
@Transactional // 조회수 증가하기떄문
public List<QnaDetailRSModel> getQnaDetail(int qnaSno){
public QnaDetailRSModel getQnaDetail(int qnaSno) {
cnsQnaBasRepository.pulsViewCount(qnaSno);
CnsQnaBas qnaBasModel = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y");
List<ComFileBas> files = null;
if(qnaBasModel.getFileGroupNo() != 0) files = comFileBasRepository.findByFileGroupNoAndDelYn(qnaBasModel.getFileGroupNo(), "N");
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);
List<QnaDetailRSModel> result = new ArrayList<>();
result.add(node);
int targetSno = qnaSno;
// 대댓글 불러오기
while(true){
CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSnoAndDelYnAndExpsrYn(targetSno, "N", "Y");
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;
List<ComnFileModel> files = null;
if (qnaBasModel.getFileGroupNo() != null && qnaBasModel.getFileGroupNo() != 0)
files = comnFileService.getNormalFileListByGroupNo(qnaBasModel.getFileGroupNo());
QnaDetailRSModel model = CnsQnaMapper.MAPPER.toModel(qnaBasModel);
model.setFiles(files);
return model;
}
/**
* Qna리스트 조회
*
* @param rq
* @return
*/
public List<QnaBasModel> selectQnaList(QnaSelectListRQ rq){
return cnsQnaQueryRepository.getQnaList(rq.getCategory(), rq.getCategory());
public List<QnaBasModel> selectQnaList(QnaSelectListRQ rq) {
return cnsQnaQueryRepository.getQnaList(rq);
}
/**
* QnaInsert
*
* @param rq
* @return
*/
@Transactional
public boolean insertQna(QnaInsertRQModel rq){
public boolean insertQna(QnaInsertRQModel rq) {
List<MultipartFile> files = rq.getFiles();
Integer fileGroupNo = null;
if(files != null && files.size() > 0) fileGroupNo = comnFileService.fileUpload(files, null); // File 업로드
if (files != null && files.size() > 0) fileGroupNo = comnFileService.fileUpload(files, null); // File 업로드
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.setCreateDt(Instant.now());
CnsQnaBas cnsQnaBas = CnsQnaMapper.MAPPER.toEntity(rq);
cnsQnaBas.setCreateUserId(userId);
cnsQnaBas.setUpdateDt(Instant.now());
cnsQnaBas.setUpdateUserId(userId);
cnsQnaBas.setExpsrYn("Y");
cnsQnaBas.setDelYn("N");
cnsQnaBas.setViewCnt(0);
if(fileGroupNo != null) cnsQnaBas.setFileGroupNo(fileGroupNo);
if(rq.getTargetSno() != null) cnsQnaBas.setTargetSno(rq.getTargetSno());
if (fileGroupNo != null) cnsQnaBas.setFileGroupNo(fileGroupNo);
cnsQnaBasRepository.save(cnsQnaBas);
@ -219,4 +157,19 @@ public class CnsQnaService {
}
public boolean insertAnswer(QnaInsertAnserRQModel rq) {
CnsQnaBas entity = cnsQnaBasRepository.findByQnaSnoAndDelYnAndExpsrYn(rq.getQnaSno(), "N", "Y");
if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND);
String userId = jwtTokenUtil.getUserIdByToken();
String userNm = jwtTokenUtil.getUserNmByToken();
CnsQnaMapper.MAPPER.merge(entity, rq);
entity.setCreateUserId(userId);
entity.setAnserUserNm(userNm);
entity.setAnserProcDt(Instant.now());
cnsQnaBasRepository.save(entity);
return true;
}
}

11
pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java

@ -4,6 +4,7 @@ import com.palnet.biz.api.comn.file.service.ComnFileService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -26,6 +27,7 @@ public class ComnFileController {
private final ComnFileService comnFileService;
@Deprecated
@GetMapping("/download")
public void downloadPDF(int fileSno) {
try {
@ -34,4 +36,13 @@ public class ComnFileController {
log.error("ERROR: ", e);
}
}
@GetMapping("/download/{fileSno}")
public void download(@PathVariable("fileSno") int fileSno) {
try {
comnFileService.fileDownload(fileSno);
} catch (Exception e) {
log.error("ERROR: ", e);
}
}
}

27
pav-server/src/main/java/com/palnet/biz/api/comn/file/model/ComnFileModel.java

@ -0,0 +1,27 @@
package com.palnet.biz.api.comn.file.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* packageName : com.palnet.biz.api.comn.file.model
* fileName : ComnFileModel
* author : dhji
* date : 2023-10-17(017)
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2023-10-17(017) dhji 최초 생성
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ComnFileModel {
private Integer fileSno;
private String downloadUrl;
private String fileName;
}

23
pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileMapper.java

@ -0,0 +1,23 @@
package com.palnet.biz.api.comn.file.service;
import org.mapstruct.Mapper;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.factory.Mappers;
/**
* packageName : com.palnet.biz.api.comn.file.service
* fileName : ComnFileMapper
* 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 class ComnFileMapper {
ComnFileMapper MAPPER = Mappers.getMapper(ComnFileMapper.class);
}

81
pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java

@ -19,6 +19,7 @@ import java.util.Objects;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;
import com.palnet.biz.api.comn.file.model.ComnFileModel;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
@ -51,7 +52,7 @@ public class ComnFileService {
@Value("${base-url}")
private String BASE_PATH;
private final String DOWNLOAD_URL = "/api/comn/file/download";
private final String NORMAL_FORDER_PATH = "normal/";
/**
@ -131,12 +132,13 @@ public class ComnFileService {
/**
* 다건 DB 인서트, 최신데이터 가져온 Group NO 1추가함
*
* @param comFileBas
* @return
*/
public List<ComFileBas> saveAll(List<ComFileBas> comFileBas, Integer fileGroupNo){
public List<ComFileBas> saveAll(List<ComFileBas> comFileBas, Integer fileGroupNo) {
for(ComFileBas fileBas : comFileBas){
for (ComFileBas fileBas : comFileBas) {
fileBas.setFileGroupNo(fileGroupNo);
}
@ -200,26 +202,26 @@ public class ComnFileService {
}
public Integer fileUpload(List<MultipartFile> files, Integer fileGroupNo){
public Integer fileUpload(List<MultipartFile> files, Integer fileGroupNo) {
if(!this.validCheck(files)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
if (!this.validCheck(files)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER);
if(fileGroupNo == null || fileGroupNo == 0) fileGroupNo = lastFileGroupNo();
if (fileGroupNo == null || fileGroupNo == 0) fileGroupNo = lastFileGroupNo();
// TODO : 절대경로
String absPath = "/Users/igyeongdo/WokrSpace/";
// String absPath = "/Users/igyeongdo/WokrSpace/";
String fileUrl = new StringBuilder()
.append(absPath)
.append(this.BASE_PATH)
.append(this.NORMAL_FORDER_PATH)
.append(InstantUtils.toDateStringByFormat(Instant.now(), "yyyyMMdd"))
.append("/")
.toString();
// .append(absPath)
.append(this.BASE_PATH)
.append(this.NORMAL_FORDER_PATH)
.append(InstantUtils.toDateStringByFormat(Instant.now(), "yyyyMMdd"))
.append("/")
.toString();
List<ComFileBas> comFileBas = new ArrayList<>();
for(MultipartFile file : files){
for (MultipartFile file : files) {
String oriNm = file.getOriginalFilename();
String extension = oriNm.substring(oriNm.lastIndexOf("."));
String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지
@ -265,12 +267,13 @@ public class ComnFileService {
/**
* 정해진 확장자만 있도록 validation처리,
* TODO :: 혹시 mime 타입으로 확인하여 처리해야 할까요?
*
* @param files
* @return
*/
private boolean validCheck(List<MultipartFile> files){
private boolean validCheck(List<MultipartFile> files) {
for(MultipartFile file : files){
for (MultipartFile file : files) {
try {
String oriNm = file.getOriginalFilename();
@ -279,7 +282,7 @@ public class ComnFileService {
ExtensionConstant constants = ExtensionConstant.fromExtension(extension);
// 허락된 확장자가 아닐 경우 return false
if(constants == null) return false;
if (constants == null) return false;
} catch (Exception e) {
@ -303,7 +306,7 @@ public class ComnFileService {
ext = path.substring(lastIndex + 1);
}
try (InputStream is = resource.getInputStream();){
try (InputStream is = resource.getInputStream();) {
byte[] imageBytes = IOUtils.toByteArray(is);
String encodedString = java.util.Base64.getEncoder().encodeToString(imageBytes);
str
@ -319,9 +322,10 @@ public class ComnFileService {
/**
* 마지막 fileGroupNo 가져와 +1 반환
*
* @return
*/
private Integer lastFileGroupNo(){
private Integer lastFileGroupNo() {
ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileGroupNoDesc();
int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1;
@ -329,7 +333,7 @@ public class ComnFileService {
}
@Transactional
public boolean deleteFiles(int fileGroupNo){
public boolean deleteFilesByFileGroupNo(int fileGroupNo) {
List<ComFileBas> files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N");
@ -337,7 +341,26 @@ public class ComnFileService {
if (userId == null) userId = "NONE";
for(ComFileBas file : files){
for (ComFileBas file : files) {
file.setDelYn("Y");
file.setDelUserId(userId);
file.setDelDt(Instant.now());
}
comFileBasRepository.saveAll(files);
return true;
}
@Transactional
public boolean deleteFiles(List<Integer> fileSnoList){
List<ComFileBas> files = comFileBasRepository.findByFileSnoInAndDelYn(fileSnoList, "N");
String userId = jwtTokenUtil.getUserIdByToken();
if (userId == null) userId = "NONE";
for (ComFileBas file : files) {
file.setDelYn("Y");
file.setDelUserId(userId);
file.setDelDt(Instant.now());
@ -349,7 +372,7 @@ public class ComnFileService {
}
@Transactional
public boolean deleteFile(int fileSno){
public boolean deleteFile(int fileSno) {
ComFileBas file = comFileBasRepository.findByFileSnoAndDelYn(fileSno, "N");
@ -366,4 +389,18 @@ public class ComnFileService {
return true;
}
public List<ComnFileModel> getNormalFileListByGroupNo(Integer fileGroupNo) {
List<ComFileBas> files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N");
List<ComnFileModel> result = new ArrayList<>();
for (ComFileBas file : files) {
result.add(ComnFileModel.builder()
.fileSno(file.getFileSno())
.fileName(file.getFileOriNm())
.downloadUrl(DOWNLOAD_URL + "/" + file.getFileSno())
.build());
}
return result;
}
}

1
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java

@ -3,7 +3,6 @@ package com.palnet.biz.api.ctr.cntrl.model;
import lombok.Data;
import java.time.Instant;
import java.util.Date;
@Data
public class CtrCntrlArcrftWarnModel {

4
pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWarnLogModel.java

@ -3,10 +3,6 @@ package com.palnet.biz.api.ctr.cntrl.model;
import lombok.Data;
import java.time.Instant;
import java.util.Date;
import java.util.List;
import com.palnet.biz.jpa.entity.CtrCntrlWarnLog;
@Data
public class CtrCntrlWarnLogModel {

45
pav-server/src/main/java/com/palnet/biz/jpa/entity/CnsQnaBas.java

@ -10,53 +10,66 @@ import java.time.Instant;
@Entity
@Data
@Table(name="CNS_QNA_BAS")
@NamedQuery(name="CnsQnaBas.findAll", query="SELECT c FROM CnsQnaBas c")
@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")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "QNA_SNO")
private int qnaSno;
@Column(name="TARGET_SNO")
// 안쓸거 같음
@Column(name = "TARGET_SNO")
private int targetSno;
@Column(name="CATEGORY")
@Column(name = "CATEGORY")
private String category;
@Column(name="TITLE")
@Column(name = "TITLE")
private String title;
@Column(name="CONTENT")
@Column(name = "CONTENT")
private String content;
@Column(name="FILE_GROUP_NO")
@Column(name = "ANSER_CONTENT")
private String anserContent;
@Column(name = "ANSER_USER_NM")
private String anserUserNm;
@Column(name = "ANSER_PROC_DT", columnDefinition = "TIMESTAMP")
private Instant anserProcDt;
@Column(name = "ANSER_STATUS")
private String anserStatus;
@Column(name = "FILE_GROUP_NO")
private Integer fileGroupNo;
@Column(name="EXPSR_YN")
@Column(name = "EXPSR_YN")
private String expsrYn = "N";
@Column(name="DEL_YN")
@Column(name = "DEL_YN")
private String delYn = "N";
@Column(name="VIEW_CNT")
@Column(name = "VIEW_CNT")
private int viewCnt = 0;
@Column(name="CREATE_USER_ID")
@Column(name = "CREATE_USER_ID")
private String createUserId;
@CreationTimestamp
@Column(name="CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false)
@Column(name = "CREATE_DT", columnDefinition = "TIMESTAMP", updatable = false)
private Instant createDt;
@Column(name="UPDATE_USER_ID")
@Column(name = "UPDATE_USER_ID")
private String updateUserId;
@UpdateTimestamp
@Column(name="UPDATE_DT", columnDefinition = "TIMESTAMP")
@Column(name = "UPDATE_DT", columnDefinition = "TIMESTAMP")
private Instant updateDt;
}

1
pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java

@ -6,7 +6,6 @@ import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.io.Serializable;
import java.time.Instant;
import java.util.Date;
/**

86
pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java

@ -2,12 +2,11 @@ package com.palnet.biz.jpa.repository.cns;
import java.util.List;
import com.palnet.biz.api.cns.qna.model.QnaSelectListRQ;
import org.springframework.stereotype.Repository;
import com.palnet.biz.api.cns.qna.model.QnaBasModel;
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,50 +19,55 @@ import lombok.extern.slf4j.Slf4j;
@RequiredArgsConstructor
public class CnsQnaQueryRepository {
private final JPAQueryFactory query;
private final JPAQueryFactory query;
/**
* 카테고리와 글로 게시글 검색, 만약 조건 없으면 전체검색
* @param category
* @param word
* @return
*/
public List<QnaBasModel> getQnaList(String category, String word) {
QCnsQnaBas bas = QCnsQnaBas.cnsQnaBas;
/**
* 카테고리와 글로 게시글 검색, 만약 조건 없으면 전체검색
*
* @param rq
* @return
*/
public List<QnaBasModel> getQnaList(QnaSelectListRQ rq) {
QCnsQnaBas bas = QCnsQnaBas.cnsQnaBas;
BooleanBuilder builder = new BooleanBuilder();
builder.and(bas.delYn.eq("N"));
builder.and(bas.expsrYn.eq("Y"));
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 (rq != null) {
if(word != null) {
builder.and(bas.title.contains(word));
}
if (rq.getCategory() != null) {
builder.and(bas.category.eq(rq.getCategory()));
}
List<QnaBasModel> 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();
if (rq.getWord() != null) {
if ("TITLE".equals(rq.getSearchType())) builder.and(bas.title.contains(rq.getWord()));
else if ("CONTENT".equals(rq.getSearchType())) builder.and(bas.content.contains(rq.getWord()));
else builder.and(bas.title.contains(rq.getWord()).or(bas.content.contains(rq.getWord())));
}
}
return r;
}
List<QnaBasModel> 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;
}
}

5
pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java

@ -1,13 +1,14 @@
package com.palnet.biz.jpa.repository.com;
import java.util.List;
import com.palnet.biz.jpa.entity.ComFileBas;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface ComFileBasRepository extends JpaRepository<ComFileBas, Integer>{
List<ComFileBas> findByFileSnoInAndDelYn(List<Integer> fileSnos, String delYn);
ComFileBas findFirstByOrderByFileSnoDesc();

25
pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java

@ -128,25 +128,31 @@ public class PtyCstmrQueryRepository {
}
public JwtUserModel findUserPassword(String userId) {
QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas;
QPtyCstmrGroup groupEntity = QPtyCstmrGroup.ptyCstmrGroup;
QPtyCstmrBas bas = QPtyCstmrBas.ptyCstmrBas;
QPtyCstmrDtl dtl = QPtyCstmrDtl.ptyCstmrDtl;
QPtyCstmrGroup group = QPtyCstmrGroup.ptyCstmrGroup;
BooleanBuilder builder = new BooleanBuilder();
builder.and(basEntity.userId.eq(userId));
builder.and(bas.userId.eq(userId));
PtyCstmrBas entity = query.select(basEntity)
.from(basEntity)
PtyCstmrBas entity = query.select(bas)
.from(bas)
.where(builder)
.fetchFirst();
PtyCstmrDtl dtlEntity = query.select(dtl)
.from(dtl)
.where(dtl.cstmrSno.eq(entity.getCstmrSno()))
.fetchFirst();
List<PtyCstmrGroup> pcgEntityList = null;
if (entity != null) {
BooleanBuilder groupBuilder = new BooleanBuilder();
groupBuilder.and(groupEntity.cstmrSno.eq(entity.getCstmrSno())
.and(groupEntity.joinYn.eq("Y")));
groupBuilder.and(group.cstmrSno.eq(entity.getCstmrSno())
.and(group.joinYn.eq("Y")));
pcgEntityList = query.select(groupEntity)
.from(groupEntity)
pcgEntityList = query.select(group)
.from(group)
.where(groupBuilder)
.fetch();
}
@ -169,6 +175,7 @@ public class PtyCstmrQueryRepository {
}
model.setGroup(groupModelList);
}
model.setUserNm(dtlEntity.getMemberName());
return model;

1
pav-server/src/main/java/com/palnet/comn/code/RSErrorCode.java

@ -8,6 +8,7 @@ public enum RSErrorCode {
PSWD_NOTMATCH("-102" , "Password does not match"),
ACNT_UNAVAIL("-103","Account is unavailable"),
AUTH_ERROR("-401", "auth error"),
INTERNAL_SERVER_ERROR("-500", "Internal system error"),
DATA_DUPLICATE("-104","Duplicate data exists");

Loading…
Cancel
Save