package com.takensoft.cms.bbs.web; import com.takensoft.cms.bbs.service.BbsCnService; import com.takensoft.cms.bbs.service.BbsMngService; import com.takensoft.cms.bbs.service.CmntService; import com.takensoft.cms.bbs.vo.BbsCnVO; import com.takensoft.cms.bbs.vo.BbsMngVO; import com.takensoft.cms.bbs.vo.CmntVO; import com.takensoft.common.file.service.FileService; import com.takensoft.common.file.vo.FileVO; import com.takensoft.common.message.MessageCode; import com.takensoft.common.util.ResponseData; import com.takensoft.common.util.ResponseUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.Charset; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author 하석형 * @since 2024.05.09 * @modification * since | author | description * 2024.05.09 | 하석형 | 최초 등록 * * 게시판 내용 관련 컨트롤러 */ @RestController @RequiredArgsConstructor @Slf4j @RequestMapping(value="/sys/bbsCn") public class BbsCnController { private final ResponseUtil resUtil; private final BbsCnService bbsCnService; private final BbsMngService bbsMngService; private final FileService fileService; /** * @author 하석형 * @since 2024.05.09 * @param bbsCnVO * @return * @throws Exception * * 게시판 내용 등록 */ // @PostMapping("/saveProc.json") // public ResponseEntity saveProc(@RequestBody BbsCnVO bbsCnVO) throws Exception { // // 응답 처리 // HttpHeaders headers = new HttpHeaders(); // headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); // ResponseData responseData = new ResponseData(); // // // 게시판 내용 등록 // int result = bbsCnService.saveBbsCn(bbsCnVO); // if(result > 0) { // responseData.setStatus(HttpStatus.OK); // responseData.setMessage("정상적으로 등록 처리되었습니다."); // responseData.setData(result); // return new ResponseEntity<>(responseData, headers, HttpStatus.OK); // } else { // responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR); // responseData.setMessage("등록에 실패하였습니다.\n담당자에게 문의하세요."); // return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR); // } // } /** * @author 방선주 * @since 2024.05.21 * @param bbsCn, multipartFileList * @return * @throws Exception * * 게시판 내용 등록 */ @PostMapping(path = "/saveBbsCn.file") public ResponseEntity saveBbsCn(@RequestPart BbsCnVO bbsCn, List multipartFileList, List multipartImgList) throws Exception { // 응답 처리 HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); ResponseData responseData = new ResponseData(); // 게시판 내용 등록 HashMap result = bbsCnService.saveBbsCn(bbsCn, multipartFileList, multipartImgList); int insertResult = (int) result.get("result"); if (insertResult > 0) { return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } else if (insertResult == -1){ responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR); responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word")); return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR); } else { return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL); } } /** * @author 하석형 * @since 2024.05.09 * @param params * @return * @throws Exception * * 게시판 내용 목록 조회 */ @PostMapping("/findAll.json") public ResponseEntity findAll(@RequestBody HashMap params) throws Exception { // 게시판 내용 목록 조회 Map result = bbsCnService.findAllBbsCn(params); // 응답처리 return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } /** * @author 하석형 * @since 2024.05.09 * @param bbsCnVO * @return * @throws Exception * * 게시판 내용 상세 조회 */ @PostMapping("/findByBbsCn.json") public ResponseEntity findByBbsCn(@RequestBody BbsCnVO bbsCnVO) throws Exception { // 게시판 관리 정보 조회 BbsMngVO bbsMng = bbsMngService.findByBbsMngId(bbsCnVO.getBbsMngId()); // 게시판 내용 상세 조회 BbsCnVO bbsCn = bbsCnService.findByBbsId(bbsCnVO.getBbsId()); // 첨부파일 목록 조회 String fileMngId = bbsCn.getAtchFileMngId(); List> fileList = bbsCnService.fileListPathChange(fileMngId); //이미지 파일 목록 조회 String imgFileMngId = bbsCn.getImgFileMngId(); List> imgFileList = bbsCnService.fileListPathChange(imgFileMngId); // 이전글 다음글 조회 BbsCnVO prevBbsCn = bbsCnService.findPrevBbsCn(bbsCnVO); BbsCnVO nextBbsCn = bbsCnService.findNextBbsCn(bbsCnVO); Map result = new HashMap(); result.put("bbsMng", bbsMng); result.put("bbsCn", bbsCn); result.put("fileList", fileList); result.put("imgFileList", imgFileList); result.put("prevBbsCn", prevBbsCn); result.put("nextBbsCn", nextBbsCn); // 응답 처리 return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } // /** // * @author 하석형 // * @since 2024.05.09 // * @param bbsCnVO // * @return // * @throws Exception // * // * 게시판 내용 수정 // */ // @PostMapping("/updateProc.json") // public ResponseEntity updateProc(@RequestBody BbsCnVO bbsCnVO) throws Exception { // HttpHeaders headers = new HttpHeaders(); // headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); // ResponseData responseData = new ResponseData(); // // // 게시판 내용 수정 // int result = bbsCnService.updateBbsCn(bbsCnVO); // // // 응답 처리 // if(result > 0) { // responseData.setStatus(HttpStatus.OK); // responseData.setMessage("정상적으로 수정 처리되었습니다."); // return new ResponseEntity<>(responseData, headers, HttpStatus.OK); // } else { // responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR); // responseData.setMessage("수정에 실패하였습니다.\n담당자에게 문의하세요."); // return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR); // } // } /** * @author 방선주 * @since 2024.05.21 * @param params, multipartFileList * @return * @throws Exception * * 게시판 내용 수정 */ @PostMapping(path = "/updateBbsCn.file") public ResponseEntity updateBbsCn(@RequestPart HashMap params, @RequestPart List> deleteFileList, List multipartFileList, @RequestPart List> deleteImgFileList, List multipartImgList) throws Exception { // 게시판 내용 수정 HashMap result = bbsCnService.updateBbsCn(params, deleteFileList, multipartFileList, deleteImgFileList, multipartImgList); int updateResult = (int) result.get("result"); // 응답 처리 HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); ResponseData responseData = new ResponseData(); if (updateResult > 0) { return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } else if (updateResult == -1){ responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR); responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word")); return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR); } else { return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL); } } /** * @author 하석형 * @since 2024.05.09 * @param bbsCnVO * @return * @throws Exception * * 게시판 내용 삭제 */ @PostMapping("/deleteProc.json") public ResponseEntity deleteProc(@RequestBody BbsCnVO bbsCnVO) throws Exception { // 게시판 내용 수정 int result = bbsCnService.deleteBbsCn(bbsCnVO); // 응답 처리 if(result > 0) { return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } else { return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL); } } /** * @author 방선주 * @since 2024.05.22 * @param params * @return * @throws Exception * * 조회수 증가 */ @PostMapping("/updateVwCnt.json") public ResponseEntity updateVwCnt(@RequestBody HashMap params) throws Exception { // 조회수 증가 int result = bbsCnService.updateVwCnt(params); // 응답 처리 if(result > 0) { return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } else { return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL); } } /** * @author 방선주 * @since 2024.05.21 * @param fileId * @return * @throws Exception * * 게시판 첨부 파일 다운로드 */ @PostMapping("/fileDownload.json") public void fileDownload(@RequestBody int fileId, HttpServletResponse response) throws Exception { // 파일 정보 조회 FileVO file = fileService.fileSelectOne(fileId); File downloadFile = null; // 받은 파일 정보로 파일 다운로드 생성 if(file != null){ String filePath = file.getAbsltPath(); downloadFile = new File(filePath); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(file.getFileNm(), "UTF-8") + "\""); response.setHeader("Content-Transfer-Encoding", "binary"); try (OutputStream out = response.getOutputStream(); FileInputStream fis = new FileInputStream(downloadFile)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } } } /********* 질의형 게시판 **********/ /** * @author 방선주 * @since 2024.05.31 * @param bbsCnVO * @return * @throws Exception * * 질의형 게시판 답변 등록 */ @PostMapping("/ansSaveProc.json") public ResponseEntity ansSaveProc(@RequestBody BbsCnVO bbsCnVO) throws Exception { // 응답 처리 HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); ResponseData responseData = new ResponseData(); // int result = 1; HashMap result = bbsCnService.saveAnswer(bbsCnVO); int insertResult = (int) result.get("result"); if(insertResult > 0) { return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } else if (insertResult == -1){ responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR); responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word")); return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR); } else { return resUtil.errorRes(MessageCode.COMMON_INSERT_FAIL); } } /** * @author 방선주 * @since 2024.05.31 * @param bbsCnVO * @return * @throws Exception * * 질의형 게시판 답변 수정 */ @PostMapping("/ansUpdateProc.json") public ResponseEntity ansUpdateProc(@RequestBody BbsCnVO bbsCnVO) throws Exception { // 응답 처리 HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("application", "json", Charset.forName("UTF-8"))); ResponseData responseData = new ResponseData(); // int result = 1; HashMap result = bbsCnService.updateAnswer(bbsCnVO); int updateResult = (int) result.get("result"); if(updateResult > 0) { return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } else if (updateResult == -1){ responseData.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); responseData.setStatusText(HttpStatus.INTERNAL_SERVER_ERROR); responseData.setMessage("아래의 금지어가 포함되어 있습니다.\n* " + result.get("word")); return new ResponseEntity<>(responseData, headers, HttpStatus.INTERNAL_SERVER_ERROR); } else { return resUtil.errorRes(MessageCode.COMMON_UPDATE_FAIL); } } /** * @author 방선주 * @since 2024.06.07 * @param bbsCnVO * @return * @throws Exception * * 질의형 게시판 답변 삭제 */ @PostMapping("/ansDeleteProc.json") public ResponseEntity ansDeleteProc(@RequestBody BbsCnVO bbsCnVO) throws Exception { // 응답 처리 // int result = 1; int result = bbsCnService.deleteAns(bbsCnVO); if(result > 0) { return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } else { return resUtil.errorRes(MessageCode.COMMON_DELETE_FAIL); } } /** * @author 방선주 * @since 2024.06.13 * @param * @return * @throws Exception * * 공지사항 최신 5개 조회 */ @PostMapping("/findFiveNotice.json") public ResponseEntity findFiveNotice(@RequestBody BbsCnVO bbsCn) throws Exception { // 공지사항 최신 5개 조회 List result = bbsCnService.findFiveNotice(bbsCn); // 응답 처리 return resUtil.successRes(result, MessageCode.COMMON_SUCCESS); } }