package nlib.bbs.web; import java.util.HashMap; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import nlib.bbs.service.BoardService; import nlib.cmm.NlibCommonController; import nlib.cmm.crypto.AriaCrypto; import nlib.cmm.crypto.NlibPasswordEncoder; import nlib.cmm.service.CodeService; import nlib.restful.service.DataApiReqVO; import nlib.restful.service.DataApiResVO; import nlib.user.service.NlibLoginVO; import nlib.util.StringUtil; @Controller public class BoardController extends NlibCommonController { private static final Logger log = LoggerFactory.getLogger(BoardController.class); @Resource(name = "boardService") private BoardService boardService; @Resource(name = "nlibPasswordEncoder") private NlibPasswordEncoder nlibPasswordEncoder; @Resource(name = "ariaCrypto") private AriaCrypto ariaCrypto; @Resource(name = "codeService") private CodeService codeService; @Autowired private AuthenticationManager authenticationManager; /** * 공지사항 목록 조회한다. * * @param req * @return */ @SuppressWarnings("deprecation") @RequestMapping("/board/listNotices.do") public String listNotices(HttpServletRequest req) { return "nlib/board/listNotices"; } /** * 공지사항 상세 내용 조회한다. * @param req * @return */ @RequestMapping("/board/selectNotice.do") public String selectNotice(HttpServletRequest req) { return "nlib/board/selectNotice"; } /** * FAQ 목록 조회한다. * * @param req * @return */ @RequestMapping("/board/listFAQs.do") public String listFAQs(HttpServletRequest req) { return "nlib/board/listFAQs"; } /** * 묻고답하기 목록 조회 화면을 구성한다. * * @param req * @return */ @RequestMapping("/board/listQnAs.do") public String listQnAs(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) { String searchKeyword = paramMap.get("searchKeyword"); String pageIndex = paramMap.get("pageIndex"); String pageSize = paramMap.get("pageSize"); log.debug("listQnAs > pageIndex = " + pageIndex); log.debug("listQnAs > pageSize = " + pageSize); log.debug("listQnAs > searchKeyword = " + searchKeyword); // 페이징 사이즈 코드 목록 조회 DataApiReqVO reqVOforPageSize = new DataApiReqVO(); reqVOforPageSize.setAuthKey(createAuthKey(req, authentication)); reqVOforPageSize.setPageSize(0); reqVOforPageSize.addInfoItem("codeUpperId", "PAGE_SIZE"); DataApiResVO resVOforPageSize = codeService.listCodes(reqVOforPageSize); // 반환 정보 model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageSize" , pageSize); model.addAttribute("searchKeyword", searchKeyword); model.addAttribute("pageSizeCodes", resVOforPageSize.getList()); //log.debug("listQnAs > pageSizeCodes : " + resVOforPageSize.getList()); return "nlib/board/listQnAs"; } /** * 묻고답하기 목록 조회한다. * * @param req * @return */ @RequestMapping(value="/board/listQnAsAjax.do") public ResponseEntity listQnAsAjax(HttpServletRequest req, Authentication authentication, @RequestBody Map paramMap) { String searchKeyword = paramMap.get("searchKeyword"); String pageIndex = paramMap.get("pageIndex"); String pageSize = paramMap.get("pageSize"); log.debug("listQnAsAjax > pageIndex = " + pageIndex); log.debug("listQnAsAjax > pageSize = " + pageSize); log.debug("listQnAsAjax > searchKeyword = " + searchKeyword); //------------------------------- // REQ VO 구성 //------------------------------- DataApiReqVO reqVO = new DataApiReqVO(); reqVO.setAuthKey(createAuthKey(req, authentication)); reqVO.setPageIndex(pageIndex); reqVO.setPageSize(pageSize); // 추가 정보 설정 HashMap info = new HashMap(); info.put("searchKeyword", searchKeyword); reqVO.setInfo(info); // 요청 DataApiResVO resVO = boardService.listQnAs(reqVO); //------------------------------- // JSON변환 응답 처리 //------------------------------- // JS-GRID 페이징 처리를 포함한 응답값 처리 // {data: [{...}], // itemsCount: 255 // } HashMap retMap = new HashMap(); retMap.put("data", resVO.getList()); retMap.put("itemsCount", resVO.getRecordTotCount()); return makeResponseEntityJson(retMap); } /** * 묻고답하기 상세 내용 조회한다. * * @param req * @return */ @RequestMapping("/board/selectQnA.do") public String selectQnA(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) { // 목록 이동시 전달할 매개변수 String searchKeyword = paramMap.get("searchKeyword"); String pageIndex = paramMap.get("pageIndex"); String pageSize = paramMap.get("pageSize"); // 게시물 번호 String articleNo = paramMap.get("articleNo"); log.debug("selectQnA > pageIndex = " + pageIndex); log.debug("selectQnA > pageSize = " + pageSize); log.debug("selectQnA > searchKeyword = " + searchKeyword); log.debug("selectQnA > articleNo = " + articleNo); //------------------------------- // REQ VO 구성 //------------------------------- DataApiReqVO reqVO = new DataApiReqVO(); reqVO.setAuthKey(createAuthKey(req, authentication)); reqVO.setPageIndex(pageIndex); reqVO.setPageSize(pageSize); // 추가 정보 설정 : 게시판ID, 게시물번호 HashMap info = new HashMap(); info.put("boardNo", "QNA"); info.put("articleNo", articleNo); reqVO.setInfo(info); // 요청 DataApiResVO resVO = boardService.selectQnA(reqVO); // 반환 정보 model.addAttribute("articleNo" , articleNo); model.addAttribute("article" , resVO.getInfo()); model.addAttribute("preArticle" , resVO.getList().get(0)); model.addAttribute("nextArticle" , resVO.getList().get(1)); model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageSize" , pageSize); model.addAttribute("searchKeyword", searchKeyword); return "nlib/board/selectQnA"; } /** * 묻고답하기 글작성화면을 표출한다. * * @param req * @return */ @RequestMapping("/board/insertQnAForm.do") public String insertQnAForm(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) { NlibLoginVO loginVO = getNlibLoginVO(authentication); model.addAttribute("regUserName", loginVO.getName()); model.addAttribute("email", loginVO.getEmail()); return "nlib/board/insertQnAForm"; } @RequestMapping("/board/insertQnA.do") public String insertQnA(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) { NlibLoginVO loginVO = getNlibLoginVO(authentication); log.debug("paramMap > " + paramMap); String message = null; String authKey = createAuthKey(req, authentication); //------------------------------- // REQ VO 구성 //------------------------------- DataApiReqVO reqVO = new DataApiReqVO(); reqVO.setAuthKey(authKey); reqVO.addInfoItem("boardNo" , "QNA"); reqVO.addInfoItem("title" , paramMap.get("title")); reqVO.addInfoItem("regUserName" , paramMap.get("regUserName")); reqVO.addInfoItem("email" , paramMap.get("email")); reqVO.addInfoItem("contentQeust", paramMap.get("contentQeust")); // 요청 DataApiResVO resVO = boardService.insertQnA(reqVO); // 처리결과 확인 if(!resVO.isSuccess()) { message = resVO.getResultMessage(); return "redirect:/board/insertQnAForm.do"; } return "redirect:nlib/board/listQnAs"; } @RequestMapping("/board/verifyWriter.do") public String verifyWriter(HttpServletRequest req) { return "nlib/board/verifyWriter"; } @RequestMapping("/board/updateQnAForm.do") public String updateQnAForm(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) { // 목록 이동시 전달할 매개변수 String searchKeyword = paramMap.get("searchKeyword"); String pageIndex = paramMap.get("pageIndex"); String pageSize = paramMap.get("pageSize"); // 게시물 번호 String articleNo = paramMap.get("articleNo"); String articlePassword = paramMap.get("articlePassword"); log.debug("updateQnAForm > pageIndex = " + pageIndex); log.debug("updateQnAForm > pageSize = " + pageSize); log.debug("updateQnAForm > searchKeyword = " + searchKeyword); log.debug("updateQnAForm > articleNo = " + articleNo); log.debug("updateQnAForm > articlePassword = " + articlePassword); if(StringUtil.isEmpty(articlePassword)) { model.addAttribute("message", "비밀빈호가 올바르지 않습니다.(1)"); return "redirect:/board/selectQnA.do"; } //------------------------------- // REQ VO 구성 //------------------------------- DataApiReqVO reqVO = new DataApiReqVO(); reqVO.setAuthKey(createAuthKey(req, authentication)); reqVO.setPageIndex(pageIndex); reqVO.setPageSize(pageSize); // 추가 정보 설정 : 게시판ID, 게시물번호 HashMap info = new HashMap(); info.put("boardNo", "QNA"); info.put("articleNo", articleNo); reqVO.setInfo(info); // 요청 DataApiResVO resVO = boardService.selectQnA(reqVO); // 비밀번호 확인 HashMap article = resVO.getInfo(); if(!articlePassword.equals(article.get("articlePassword"))) { model.addAttribute("message", "비밀빈호가 올바르지 않습니다.(1)"); return "redirect:/board/selectQnA.do"; } // 반환 정보 model.addAttribute("articleNo" , articleNo); model.addAttribute("article" , resVO.getInfo()); // 게시글 비밀번호 처리 String shaArticlePassword = nlibPasswordEncoder.encode(articlePassword); String encArticlePassword = ariaCrypto.encode(shaArticlePassword, createAuthKey(req, authentication)); model.addAttribute("encArticlePassword", encArticlePassword); // 검색 정보 model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageSize" , pageSize); model.addAttribute("searchKeyword", searchKeyword); return "nlib/board/updateQnAForm"; } @RequestMapping("/board/updateQnA.do") public String updateQnA(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) { log.debug("paramMap > " + paramMap); String message = null; String authKey = createAuthKey(req, authentication); // 목록 이동시 전달할 매개변수 String searchKeyword = paramMap.get("searchKeyword"); String pageIndex = paramMap.get("pageIndex"); String pageSize = paramMap.get("pageSize"); // 게시물 번호 String articleNo = paramMap.get("articleNo"); String encArticlePassword = paramMap.get("encArticlePassword"); String checkArticlePassword = ariaCrypto.decode(encArticlePassword, authKey); //------------------------------- // 비밀번호 유효 체크 //------------------------------- // 기존 정보 조회 DataApiReqVO reqVO = new DataApiReqVO(); reqVO.setAuthKey(authKey); reqVO.addInfoItem("articleNo", articleNo); DataApiResVO resVO = boardService.selectQnA(reqVO); String oldArticlePassword = resVO.getInfoItem("articlePassword"); if(checkArticlePassword == null || !checkArticlePassword.equals(oldArticlePassword)) { message = "잘못된 접근입니다."; // TODO 수정화면으로 다시 redirect 시킬것 return "redirect:/board/updateQnAForm.do"; } //------------------------------- // REQ VO 구성 //------------------------------- DataApiReqVO updateReqVO = new DataApiReqVO(); updateReqVO.setAuthKey(authKey); updateReqVO.addInfoItem("boardNo" , "QNA"); updateReqVO.addInfoItem("articleNo" , articleNo); updateReqVO.addInfoItem("title" , paramMap.get("title")); updateReqVO.addInfoItem("regUserName" , paramMap.get("regUserName")); updateReqVO.addInfoItem("email" , paramMap.get("email")); updateReqVO.addInfoItem("contentQeust", paramMap.get("contentQeust")); // 요청 DataApiResVO updateResVO = boardService.updateQnA(updateReqVO); // 처리결과 확인 if(!updateResVO.isSuccess()) { message = updateResVO.getResultMessage(); return "redirect:/board/updateQnAForm.do"; } // 반환 정보 model.addAttribute("articleNo" , updateResVO.getInfoItem("articleNo")); // 신규등록된 게시물 ID model.addAttribute("article" , resVO.getInfo()); // 검색 정보 model.addAttribute("pageIndex" , pageIndex); model.addAttribute("pageSize" , pageSize); model.addAttribute("searchKeyword", searchKeyword); return "redirect:nlib/board/selectQnA"; } @RequestMapping("/board/deleteQnA.do") public String deleteQnA(HttpServletRequest req) { return "nlib/board/deleteQnA"; } }