diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java index 8bb65185..0cb758b0 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java +++ b/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 diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java index cab0aa47..b7319b4f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtRsModel.java @@ -13,7 +13,8 @@ public class JwtRsModel implements Serializable { private String refreshToken; private String userId; - + private String userNm; + private Integer cstmrSno; private String auth; diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java index 570b4fd1..03ca37fa 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/model/JwtUserModel.java +++ b/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 group; diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java index dbd65016..0349b1a9 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java +++ b/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 -> { diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java index 68cbba63..141fd075 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/utils/JwtTokenUtil.java +++ b/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,9 +24,9 @@ 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}") private String 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,17 +71,18 @@ 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 claims = new HashMap<>(); - claims.put("userId", userDetails.getUserId()); - claims.put("cstmrSno", userDetails.getCstmrSno()); - return doGenerateRefreshToken(claims, userDetails.getUsername()); + Map claims = new HashMap<>(); + claims.put("userId", userDetails.getUserId()); + claims.put("cstmrSno", userDetails.getCstmrSno()); + return doGenerateRefreshToken(claims, userDetails.getUsername()); } - + //while creating the token - //1. Define claims of the token, like Issuer, Expiration, Subject, and the ID @@ -94,11 +95,11 @@ public class JwtTokenUtil implements Serializable { .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)) .signWith(SignatureAlgorithm.HS512, secret).compact(); } - - private String doGenerateRefreshToken(Map 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 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 groupList = payload.get("group", ArrayList.class); List r = new ArrayList<>(); - - if(groupList!=null) { - for(LinkedHashMap map : groupList){ - JwtGroupModel model = new JwtGroupModel(); - model.setGroupId(map.get("groupId")); - model.setGroupAuthCd(map.get("groupAuthCd")); - r.add(model); - } + + if (groupList != null) { + for (LinkedHashMap 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); diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java index 29e45723..7a7df0aa 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasDronModel.java +++ b/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 { diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java index dd0a8afd..fa542f32 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasIdntfModel.java +++ b/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 { diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasOwnerModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasOwnerModel.java index c6a4a5c3..4ed839b6 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/dron/model/BasOwnerModel.java +++ b/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 { diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupModel.java b/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupModel.java index 21acd19b..0db22afa 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/group/model/BasGroupModel.java +++ b/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 { 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 0a89299e..8f00c291 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,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; - - - // TODO json 가능 여부 + private final JwtTokenUtil jwtTokenUtil; + + @PostMapping(consumes = "multipart/form-data") @Tag(name = "QNA", description = "QNA 관련 API") - @ApiOperation(value = "QnA 등록[답변추가]") - public ResponseEntity insertQna(QnaInsertRQModel rq){ + @ApiOperation(value = "QnA 등록 - 사용자") + public ResponseEntity 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 selectQna(QnaSelectListRQ rq){ + public ResponseEntity selectQna(QnaSelectListRQ rq) { List result = new ArrayList<>(); try { @@ -84,8 +84,8 @@ public class CnsQnaController { @GetMapping("/{qnaSno}") @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 상세보기") - public ResponseEntity detailQna(@PathVariable int qnaSno){ - List result = null; + public ResponseEntity 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 updateQna(QnaInsertRQModel rq){ + @ApiOperation(value = "QnA 수정 - 사용자") + public ResponseEntity 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 deleteQna(@PathVariable int qnaSno){ - + public ResponseEntity 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 deleteQnaFile(@PathVariable int qnaSno, @PathVariable int fileSno){ - log.warn("CnsQnaController - deleteQnaFile()"); - + @ApiOperation(value = "QnA 답변 등록 - 관리자") + public ResponseEntity 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 resultMap = new HashMap<>(); log.error("IGNORE : ", e); @@ -180,6 +178,6 @@ public class CnsQnaController { } return ResponseEntity.ok().body(new SuccessResponse<>(result)); - } + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java index 945df598..1f180c60 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaBasModel.java @@ -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 { @@ -15,7 +15,15 @@ public class QnaBasModel { private String title; - private String content; + private String content; + + private String anserContent; + + private String anserUserNm; + + private Instant anserProcDt; + + private String anserStatus; private int fileGroupNo; diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java index c86bf5c3..17a36ecd 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaDetailRSModel.java @@ -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 files; + private List files; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertAnserRQModel.java new file mode 100644 index 00000000..d7440d65 --- /dev/null +++ b/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; + +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java index a07315d0..813227b4 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaInsertRQModel.java @@ -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 fileInfos; + private List files; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java index ccd1b760..dd267b7b 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/model/QnaSelectListRQ.java @@ -5,7 +5,8 @@ import lombok.Data; @Data public class QnaSelectListRQ { + private String searchType; private String word; - private String category; + } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaMapper.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaMapper.java new file mode 100644 index 00000000..0926eb2b --- /dev/null +++ b/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); +} 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 0d1de3cd..9a668c8f 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java @@ -1,115 +1,90 @@ 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 @RequiredArgsConstructor -public class CnsQnaService { - +public class CnsQnaService { + private final CnsQnaBasRepository cnsQnaBasRepository; 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.getFileGroupNo() != null) comnFileService.deleteFiles(entity.getFileGroupNo()); - - entity.setDelYn("Y"); - - List deleteList = new ArrayList<>(); - deleteList.add(entity); + if (entity == null) throw new CustomException(ErrorCode.DATA_NOTFIND); - int targetSno = qnaSno; + if (entity.getFileGroupNo() != null) comnFileService.deleteFilesByFileGroupNo(entity.getFileGroupNo()); - // 대댓글 불러오기 - while(true){ - - CnsQnaBas cnsQnaBas = cnsQnaBasRepository.findFirstByTargetSnoAndDelYnAndExpsrYn(targetSno, "N", "Y"); - if(cnsQnaBas == null) break; - - cnsQnaBas.setDelYn("Y"); - - deleteList.add(cnsQnaBas); - - targetSno = cnsQnaBas.getQnaSno(); - } + entity.setDelYn("Y"); - 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 prevFileInfos = comnFileService.getNormalFileListByGroupNo(entity.getFileGroupNo()); + List prevFileSnoList = prevFileInfos.stream().map(ComnFileModel::getFileSno).collect(Collectors.toList()); + List currentFileSnoList = rq.getFileInfos().stream().map(ComnFileModel::getFileSno).collect(Collectors.toList()); + boolean isChange = prevFileSnoList.removeAll(currentFileSnoList); + if (isChange) comnFileService.deleteFilesByFileGroupNo(entity.getFileGroupNo()); // File 삭제 + List 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,104 +94,82 @@ public class CnsQnaService { /** * Qna 상세불러오기 + * * @param qnaSno * @return */ @Transactional // 조회수 증가하기떄문 - public List getQnaDetail(int qnaSno){ + public QnaDetailRSModel getQnaDetail(int qnaSno) { cnsQnaBasRepository.pulsViewCount(qnaSno); CnsQnaBas qnaBasModel = cnsQnaBasRepository.findFirstByQnaSnoAndTargetSnoAndDelYnAndExpsrYn(qnaSno, 0, "N", "Y"); - List 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 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 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 selectQnaList(QnaSelectListRQ rq){ - - return cnsQnaQueryRepository.getQnaList(rq.getCategory(), rq.getCategory()); + public List selectQnaList(QnaSelectListRQ rq) { + return cnsQnaQueryRepository.getQnaList(rq); } /** * QnaInsert + * * @param rq * @return */ @Transactional - public boolean insertQna(QnaInsertRQModel rq){ + public boolean insertQna(QnaInsertRQModel rq) { List 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"); - - if(fileGroupNo != null) cnsQnaBas.setFileGroupNo(fileGroupNo); - if(rq.getTargetSno() != null) cnsQnaBas.setTargetSno(rq.getTargetSno()); + cnsQnaBas.setDelYn("N"); + cnsQnaBas.setViewCnt(0); + + if (fileGroupNo != null) cnsQnaBas.setFileGroupNo(fileGroupNo); cnsQnaBasRepository.save(cnsQnaBas); return true; } - + + 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; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java index 04071112..5bc204f5 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/controller/ComnFileController.java +++ b/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); + } + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/model/ComnFileModel.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/model/ComnFileModel.java new file mode 100644 index 00000000..95c842b4 --- /dev/null +++ b/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; +} diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileMapper.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileMapper.java new file mode 100644 index 00000000..94a2f3c0 --- /dev/null +++ b/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); + +} 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 3184499b..6136dcce 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 @@ -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; @@ -45,13 +46,13 @@ public class ComnFileService { private final PdfUtils pdfUtils; private final JwtTokenUtil jwtTokenUtil; - private final ComFileBasRepository comFileBasRepository; + private final ComFileBasRepository comFileBasRepository; private final HttpServletResponse response; @Value("${base-url}") private String BASE_PATH; - + private final String DOWNLOAD_URL = "/api/comn/file/download"; private final String NORMAL_FORDER_PATH = "normal/"; /** @@ -127,16 +128,17 @@ public class ComnFileService { comFileBas.setFileGroupNo(fileGroupNo); return comFileBasRepository.save(comFileBas); - } + } /** * 다건 DB 인서트, 최신데이터 가져온 후 Group NO 1추가함 + * * @param comFileBas * @return */ - public List saveAll(List comFileBas, Integer fileGroupNo){ + public List saveAll(List comFileBas, Integer fileGroupNo) { - for(ComFileBas fileBas : comFileBas){ + for (ComFileBas fileBas : comFileBas) { fileBas.setFileGroupNo(fileGroupNo); } @@ -200,32 +202,32 @@ public class ComnFileService { } - public Integer fileUpload(List files, Integer fileGroupNo){ + public Integer fileUpload(List 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 = new ArrayList<>(); - for(MultipartFile file : files){ - String oriNm = file.getOriginalFilename(); - String extension = oriNm.substring(oriNm.lastIndexOf(".")); + for (MultipartFile file : files) { + String oriNm = file.getOriginalFilename(); + String extension = oriNm.substring(oriNm.lastIndexOf(".")); String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 String fileName = this.getLaancSaveName(ExtensionConstant.fromExtension(extension), fileGroupNo.toString(), "qna", etc); - try { + try { Path directoryPath = Paths.get(fileUrl); if (!Files.exists(directoryPath)) { Files.createDirectories(directoryPath); @@ -251,35 +253,36 @@ public class ComnFileService { node.setFileOriNm(oriNm); node.setFileSize(String.valueOf(fileSize)); - comFileBas.add(node); + comFileBas.add(node); } catch (IOException e) { e.printStackTrace(); - } + } } - - this.saveAll(comFileBas, fileGroupNo); + + this.saveAll(comFileBas, fileGroupNo); return fileGroupNo; } /** - * 정해진 확장자만 올 수 있도록 validation처리, + * 정해진 확장자만 올 수 있도록 validation처리, * TODO :: 혹시 mime 타입으로 확인하여 처리해야 할까요? + * * @param files * @return */ - private boolean validCheck(List files){ + private boolean validCheck(List files) { - for(MultipartFile file : files){ + for (MultipartFile file : files) { - try { + try { String oriNm = file.getOriginalFilename(); String extension = oriNm.substring(oriNm.lastIndexOf(".")); - + 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 @@ -316,12 +319,13 @@ public class ComnFileService { } return str.toString(); } - + /** * 마지막 fileGroupNo 가져와 +1 후 반환 + * * @return */ - private Integer lastFileGroupNo(){ + private Integer lastFileGroupNo() { ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileGroupNoDesc(); int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; @@ -329,34 +333,53 @@ public class ComnFileService { } @Transactional - public boolean deleteFiles(int fileGroupNo){ + public boolean deleteFilesByFileGroupNo(int fileGroupNo) { List files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N"); String userId = jwtTokenUtil.getUserIdByToken(); - + + if (userId == null) userId = "NONE"; + + for (ComFileBas file : files) { + file.setDelYn("Y"); + file.setDelUserId(userId); + file.setDelDt(Instant.now()); + } + + comFileBasRepository.saveAll(files); + + return true; + } + @Transactional + public boolean deleteFiles(List fileSnoList){ + + List files = comFileBasRepository.findByFileSnoInAndDelYn(fileSnoList, "N"); + + String userId = jwtTokenUtil.getUserIdByToken(); + 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 deleteFile(int fileSno){ + public boolean deleteFile(int fileSno) { ComFileBas file = comFileBasRepository.findByFileSnoAndDelYn(fileSno, "N"); String userId = jwtTokenUtil.getUserIdByToken(); - - if (userId == null) userId = "NONE"; - + + if (userId == null) userId = "NONE"; + file.setDelYn("Y"); file.setDelUserId(userId); file.setDelDt(Instant.now()); @@ -366,4 +389,18 @@ public class ComnFileService { return true; } + public List getNormalFileListByGroupNo(Integer fileGroupNo) { + List files = comFileBasRepository.findByFileGroupNoAndDelYn(fileGroupNo, "N"); + List 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; + + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java index 0e761839..6bf36031 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlArcrftWarnModel.java +++ b/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 { diff --git a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWarnLogModel.java b/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWarnLogModel.java index 01baa652..e0ae82fd 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/ctr/cntrl/model/CtrCntrlWarnLogModel.java +++ b/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 { 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 1bca2046..3f88fe37 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 @@ -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; } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java b/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java index 1906497a..a48476ca 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/entity/PtyCrtfyhpBas.java +++ b/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; /** diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java index 32c787b0..81a6ecb7 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/cns/CnsQnaQueryRepository.java @@ -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 getQnaList(String category, String word) { - QCnsQnaBas bas = QCnsQnaBas.cnsQnaBas; + /** + * 카테고리와 글로 게시글 검색, 만약 조건 없으면 전체검색 + * + * @param rq + * @return + */ + public List 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 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; - } + 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()))); + } + } + + List r = query + .select(Projections.bean( + QnaBasModel.class, + bas.qnaSno, + bas.category, + bas.title, + bas.content, + bas.fileGroupNo, + bas.viewCnt, + bas.expsrYn, + bas.delYn, + bas.createUserId, + bas.createDt, + bas.updateUserId, + bas.updateDt + )) + .from(bas) + .where(builder) + .fetch(); + + return r; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java index 3fb74f1f..439f94bf 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java @@ -1,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{ + List findByFileSnoInAndDelYn(List fileSnos, String delYn); ComFileBas findFirstByOrderByFileSnoDesc(); diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java index 6d9e06a7..18be4a6c 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java +++ b/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 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; diff --git a/pav-server/src/main/java/com/palnet/comn/code/RSErrorCode.java b/pav-server/src/main/java/com/palnet/comn/code/RSErrorCode.java index 2ef4d831..635d2512 100644 --- a/pav-server/src/main/java/com/palnet/comn/code/RSErrorCode.java +++ b/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");