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.
 
 
 

144 lines
4.1 KiB

const boardModel = {};
boardModel.tableName = 'tbl_board'
boardModel.postTableName = 'tbl_board_posts'
/**
* 게시판 키를 이용하여 게시판 정보를 가져옵니다.
*/
boardModel.getBoard = async ( key )=>{
// 반환할 객체 선언
let result = {}
const db = database()
try {
await db(boardModel.tableName)
.where('key', key)
.limit(1)
.then((rows) => {
if(rows.length >0 && rows[0])
{
result = rows[0]
}
})
}
catch {
result = {}
}
return result;
}
/**
* 게시글 또는 댓글 목록 불러오기
*/
boardModel.getPost = async( params ) => {
// 게시판 고유 키
const boardKey = params?.key ?? ''
// 게시글인지, 댓글인지 여부
const type = params?.type ?? 'POST'
const parent_id = params?.parent_id ?? 0 // 댓글일 경우 부모 게시글 PK
// 검색 조건
const isNotice = params?.isNotice ? 'Y' : 'N'
const searchColumn = params?.searchColumn ?? ''
const searchQuery = params?.searchQuery ?? ''
const page = params?.page ?? 1
const pageRows = params?.page_rows ?? 10
const start = (page - 1) * pageRows
const db = database()
const t = db(boardModel.postTableName)
.select(db.raw(`SQL_CALC_FOUND_ROWS ${boardModel.postTableName}.*`))
.select('tbl_members.nickname AS created_user_name')
.leftJoin('tbl_members', `${boardModel.postTableName}.created_user`, 'tbl_members.id')
.where(`${boardModel.postTableName}.status`, 'Y')
.where(`${boardModel.postTableName}.type`, type)
.where(`${boardModel.postTableName}.is_notice`, isNotice)
// 게시판 키가 있는 경우 조건에 추가한다.
if(boardKey) {
t.where(`${boardModel.postTableName}.board_key`, boardKey)
}
// 댓글 불러오기의 경우 부모 게시글 PK를 조건에 추가한다.
if(type === 'COMMENT') {
t.where(`${boardModel.postTableName}.parent_id`, parent_id)
}
// 공지글 불러오기가 아니면서, 검색어 값이 있는 경우
if(isNotice !== 'Y' && searchColumn && searchQuery )
{
if(searchColumn === 'title') {
t.whereLike(`${boardModel.postTableName}.title`, searchQuery);
}
else if (searchColumn === 'author') {
t.where('tbl_members.nickname', searchQuery);
}
else if (searchColumn === 'title+content') {
t.where(function() {
this.where(`${boardModel.postTableName}.title`, searchQuery)
.orWhere(`${boardModel.postTableName}.content`, searchQuery)
});
}
}
// 공지가 아닐 경우 페이징 처리
if(isNotice !== 'Y')
{
t.limit(pageRows).offset(start);
}
// 반환할 객체 만들기
const result = {
result : [],
totalCount: 0
}
// 정렬 순서 설정
t.orderBy('num','desc').orderBy('reply','asc')
// 리스트 불러오기
console.log(t.toSQL());
await t.then((rows) => {
result.result = rows;
})
// 검색된 총 게시글수 불러오기
await db.raw('SELECT FOUND_ROWS() AS `cnt`')
.then(res => {
result.totalCount = res[0][0]?.cnt * 1 ?? 0
})
// 각 게시글의 번호를 달아준다.
for(let i=0; i<result.result.length; i++) {
result.result[i].num = result.totalCount - start - i;
}
return result;
}
/**
* 게시글 한개 가져오기
*/
boardModel.getPostOne = async(postId) => {
let result = {}
const db = database()
await db
.select(db.raw(`${boardModel.postTableName}.*`))
.select(db.raw(`IFNULL(tbl_members.nickname, ${boardModel.postTableName}.author_name) AS created_user_name`))
.from(boardModel.postTableName)
.leftJoin('tbl_members', `${boardModel.postTableName}.created_user`, 'tbl_members.id')
.where(boardModel.postTableName+'.id', postId)
.then((rows) => {
if(rows && rows[0]) {
result = rows[0]
}
})
return result;
}
module.exports = boardModel