104 lines
2.7 KiB
TypeScript
104 lines
2.7 KiB
TypeScript
import { query } from '../../utils/db'
|
|
|
|
/**
|
|
* 개선의견 목록 조회
|
|
* GET /api/feedback/list
|
|
*/
|
|
export default defineEventHandler(async (event) => {
|
|
const userId = getCookie(event, 'user_id')
|
|
if (!userId) {
|
|
throw createError({ statusCode: 401, message: '로그인이 필요합니다.' })
|
|
}
|
|
|
|
const q = getQuery(event)
|
|
const page = parseInt(q.page as string) || 1
|
|
const limit = parseInt(q.limit as string) || 12
|
|
const category = q.category as string || ''
|
|
const offset = (page - 1) * limit
|
|
|
|
// 조건 구성
|
|
let whereClause = ''
|
|
const countParams: any[] = []
|
|
|
|
if (category) {
|
|
whereClause = 'WHERE f.category = $1'
|
|
countParams.push(category)
|
|
}
|
|
|
|
// 전체 개수
|
|
const countResult = await query<any>(`
|
|
SELECT COUNT(*) as total FROM wr_feedback f ${whereClause}
|
|
`, countParams)
|
|
const total = parseInt(countResult[0].total)
|
|
|
|
// 목록 조회
|
|
let feedbacks: any[]
|
|
|
|
if (category) {
|
|
feedbacks = await query<any>(`
|
|
SELECT
|
|
f.feedback_id,
|
|
f.author_id,
|
|
e.employee_name as author_name,
|
|
f.category,
|
|
f.content,
|
|
f.like_count,
|
|
f.is_resolved,
|
|
f.created_at,
|
|
f.updated_at,
|
|
EXISTS(
|
|
SELECT 1 FROM wr_feedback_like fl
|
|
WHERE fl.feedback_id = f.feedback_id AND fl.employee_id = $1
|
|
) as is_liked
|
|
FROM wr_feedback f
|
|
JOIN wr_employee_info e ON f.author_id = e.employee_id
|
|
WHERE f.category = $2
|
|
ORDER BY f.created_at DESC
|
|
LIMIT $3 OFFSET $4
|
|
`, [userId, category, limit, offset])
|
|
} else {
|
|
feedbacks = await query<any>(`
|
|
SELECT
|
|
f.feedback_id,
|
|
f.author_id,
|
|
e.employee_name as author_name,
|
|
f.category,
|
|
f.content,
|
|
f.like_count,
|
|
f.is_resolved,
|
|
f.created_at,
|
|
f.updated_at,
|
|
EXISTS(
|
|
SELECT 1 FROM wr_feedback_like fl
|
|
WHERE fl.feedback_id = f.feedback_id AND fl.employee_id = $1
|
|
) as is_liked
|
|
FROM wr_feedback f
|
|
JOIN wr_employee_info e ON f.author_id = e.employee_id
|
|
ORDER BY f.created_at DESC
|
|
LIMIT $2 OFFSET $3
|
|
`, [userId, limit, offset])
|
|
}
|
|
|
|
return {
|
|
feedbacks: feedbacks.map((f: any) => ({
|
|
feedbackId: f.feedback_id,
|
|
authorId: f.author_id,
|
|
authorName: f.author_name,
|
|
category: f.category,
|
|
content: f.content,
|
|
likeCount: f.like_count,
|
|
isResolved: f.is_resolved,
|
|
createdAt: f.created_at,
|
|
updatedAt: f.updated_at,
|
|
isLiked: f.is_liked,
|
|
isOwner: f.author_id === parseInt(userId)
|
|
})),
|
|
pagination: {
|
|
page,
|
|
limit,
|
|
total,
|
|
totalPages: Math.ceil(total / limit)
|
|
}
|
|
}
|
|
})
|