You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
4.1 KiB

12 months ago
  1. const boardModel = {};
  2. boardModel.tableName = 'tbl_board'
  3. boardModel.postTableName = 'tbl_board_posts'
  4. /**
  5. * 게시판 키를 이용하여 게시판 정보를 가져옵니다.
  6. */
  7. boardModel.getBoard = async ( key )=>{
  8. // 반환할 객체 선언
  9. let result = {}
  10. const db = database()
  11. try {
  12. await db(boardModel.tableName)
  13. .where('key', key)
  14. .limit(1)
  15. .then((rows) => {
  16. if(rows.length >0 && rows[0])
  17. {
  18. result = rows[0]
  19. }
  20. })
  21. }
  22. catch {
  23. result = {}
  24. }
  25. return result;
  26. }
  27. /**
  28. * 게시글 또는 댓글 목록 불러오기
  29. */
  30. boardModel.getPost = async( params ) => {
  31. // 게시판 고유 키
  32. const boardKey = params?.key ?? ''
  33. // 게시글인지, 댓글인지 여부
  34. const type = params?.type ?? 'POST'
  35. const parent_id = params?.parent_id ?? 0 // 댓글일 경우 부모 게시글 PK
  36. // 검색 조건
  37. const isNotice = params?.isNotice ? 'Y' : 'N'
  38. const searchColumn = params?.searchColumn ?? ''
  39. const searchQuery = params?.searchQuery ?? ''
  40. const page = params?.page ?? 1
  41. const pageRows = params?.page_rows ?? 10
  42. const start = (page - 1) * pageRows
  43. const db = database()
  44. const t = db(boardModel.postTableName)
  45. .select(db.raw(`SQL_CALC_FOUND_ROWS ${boardModel.postTableName}.*`))
  46. .select('tbl_members.nickname AS created_user_name')
  47. .leftJoin('tbl_members', `${boardModel.postTableName}.created_user`, 'tbl_members.id')
  48. .where(`${boardModel.postTableName}.status`, 'Y')
  49. .where(`${boardModel.postTableName}.type`, type)
  50. .where(`${boardModel.postTableName}.is_notice`, isNotice)
  51. // 게시판 키가 있는 경우 조건에 추가한다.
  52. if(boardKey) {
  53. t.where(`${boardModel.postTableName}.board_key`, boardKey)
  54. }
  55. // 댓글 불러오기의 경우 부모 게시글 PK를 조건에 추가한다.
  56. if(type === 'COMMENT') {
  57. t.where(`${boardModel.postTableName}.parent_id`, parent_id)
  58. }
  59. // 공지글 불러오기가 아니면서, 검색어 값이 있는 경우
  60. if(isNotice !== 'Y' && searchColumn && searchQuery )
  61. {
  62. if(searchColumn === 'title') {
  63. t.whereLike(`${boardModel.postTableName}.title`, searchQuery);
  64. }
  65. else if (searchColumn === 'author') {
  66. t.where('tbl_members.nickname', searchQuery);
  67. }
  68. else if (searchColumn === 'title+content') {
  69. t.where(function() {
  70. this.where(`${boardModel.postTableName}.title`, searchQuery)
  71. .orWhere(`${boardModel.postTableName}.content`, searchQuery)
  72. });
  73. }
  74. }
  75. // 공지가 아닐 경우 페이징 처리
  76. if(isNotice !== 'Y')
  77. {
  78. t.limit(pageRows).offset(start);
  79. }
  80. // 반환할 객체 만들기
  81. const result = {
  82. result : [],
  83. totalCount: 0
  84. }
  85. // 정렬 순서 설정
  86. t.orderBy('num','desc').orderBy('reply','asc')
  87. // 리스트 불러오기
  88. console.log(t.toSQL());
  89. await t.then((rows) => {
  90. result.result = rows;
  91. })
  92. // 검색된 총 게시글수 불러오기
  93. await db.raw('SELECT FOUND_ROWS() AS `cnt`')
  94. .then(res => {
  95. result.totalCount = res[0][0]?.cnt * 1 ?? 0
  96. })
  97. // 각 게시글의 번호를 달아준다.
  98. for(let i=0; i<result.result.length; i++) {
  99. result.result[i].num = result.totalCount - start - i;
  100. }
  101. return result;
  102. }
  103. /**
  104. * 게시글 한개 가져오기
  105. */
  106. boardModel.getPostOne = async(postId) => {
  107. let result = {}
  108. const db = database()
  109. await db
  110. .select(db.raw(`${boardModel.postTableName}.*`))
  111. .select(db.raw(`IFNULL(tbl_members.nickname, ${boardModel.postTableName}.author_name) AS created_user_name`))
  112. .from(boardModel.postTableName)
  113. .leftJoin('tbl_members', `${boardModel.postTableName}.created_user`, 'tbl_members.id')
  114. .where(boardModel.postTableName+'.id', postId)
  115. .then((rows) => {
  116. if(rows && rows[0]) {
  117. result = rows[0]
  118. }
  119. })
  120. return result;
  121. }
  122. module.exports = boardModel