v1.12.23 대시보드 간소화 및 멤버 작성 이력 탭 추가
This commit is contained in:
@@ -331,10 +331,10 @@ export const toggleCommentLike = async (input) => {
|
||||
|
||||
/**
|
||||
* 관리자 댓글을 작성자 조건과 최신순 페이지 단위로 조회한다.
|
||||
* @param {{ memberId?: string, page: number, pageSize: number }} options - 조회 조건
|
||||
* @param {{ memberId?: string, q?: string, page: number, pageSize: number }} options - 조회 조건
|
||||
* @returns {Promise<Object>} 댓글과 페이지 정보
|
||||
*/
|
||||
export const listAdminComments = async ({ memberId = null, page, pageSize }) => {
|
||||
export const listAdminComments = async ({ memberId = null, q = '', page, pageSize }) => {
|
||||
const sql = getSql()
|
||||
const empty = { items: [], pagination: { page: 1, pageSize, total: 0, pageCount: 1 } }
|
||||
if (!sql) return empty
|
||||
@@ -343,7 +343,9 @@ export const listAdminComments = async ({ memberId = null, page, pageSize }) =>
|
||||
await transaction`SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ ONLY`
|
||||
const [count] = await transaction`
|
||||
SELECT COUNT(*)::int AS total FROM comments
|
||||
WHERE (${memberId}::uuid IS NULL OR user_id = ${memberId}::uuid)
|
||||
INNER JOIN posts ON posts.id = comments.post_id
|
||||
WHERE (${memberId}::uuid IS NULL OR comments.user_id = ${memberId}::uuid)
|
||||
AND (${q} = '' OR strpos(lower(concat_ws(' ', comments.body, posts.title)), lower(${q})) > 0)
|
||||
`
|
||||
const total = Number(count.total)
|
||||
const pageCount = Math.max(1, Math.ceil(total / pageSize))
|
||||
@@ -358,6 +360,7 @@ export const listAdminComments = async ({ memberId = null, page, pageSize }) =>
|
||||
INNER JOIN users ON users.id = comments.user_id
|
||||
INNER JOIN posts ON posts.id = comments.post_id
|
||||
WHERE (${memberId}::uuid IS NULL OR comments.user_id = ${memberId}::uuid)
|
||||
AND (${q} = '' OR strpos(lower(concat_ws(' ', comments.body, posts.title)), lower(${q})) > 0)
|
||||
ORDER BY comments.created_at DESC, comments.id DESC
|
||||
LIMIT ${pageSize} OFFSET ${(currentPage - 1) * pageSize}
|
||||
`
|
||||
|
||||
@@ -2906,3 +2906,34 @@ export const deleteAdminTag = async (id) => {
|
||||
|
||||
return Boolean(rows[0])
|
||||
}
|
||||
|
||||
/**
|
||||
* 회원이 작성한 전체 게시물을 최신 작성순으로 검색·페이지 조회한다.
|
||||
* @param {{ memberId: string, q: string, page: number, pageSize: number }} options - 조회 조건
|
||||
* @returns {Promise<Object>} 게시물 요약과 페이지 정보
|
||||
*/
|
||||
export const listAdminMemberPosts = async ({ memberId, q, page, pageSize }) => {
|
||||
const sql = getPostgresClient()
|
||||
if (!sql) return { items: [], pagination: { page: 1, pageSize, total: 0, pageCount: 1 } }
|
||||
|
||||
return sql.begin(async (transaction) => {
|
||||
await transaction`SET TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ ONLY`
|
||||
const [count] = await transaction`
|
||||
SELECT COUNT(*)::int AS total FROM posts
|
||||
WHERE author_id = ${memberId}
|
||||
AND (${q} = '' OR strpos(lower(concat_ws(' ', title, slug, excerpt, content)), lower(${q})) > 0)
|
||||
`
|
||||
const total = Number(count.total)
|
||||
const pageCount = Math.max(1, Math.ceil(total / pageSize))
|
||||
const currentPage = Math.min(page, pageCount)
|
||||
const items = await transaction`
|
||||
SELECT id, title, slug, status, created_at AS "createdAt", published_at AS "publishedAt"
|
||||
FROM posts
|
||||
WHERE author_id = ${memberId}
|
||||
AND (${q} = '' OR strpos(lower(concat_ws(' ', title, slug, excerpt, content)), lower(${q})) > 0)
|
||||
ORDER BY created_at DESC, id DESC
|
||||
LIMIT ${pageSize} OFFSET ${(currentPage - 1) * pageSize}
|
||||
`
|
||||
return { items, pagination: { page: currentPage, pageSize, total, pageCount } }
|
||||
})
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import { listAdminComments } from '../../../repositories/comment-repository'
|
||||
|
||||
const querySchema = z.object({
|
||||
memberId: z.string().uuid().optional(),
|
||||
q: z.string().trim().max(200).default(''),
|
||||
page: z.coerce.number().int().min(1).max(1000000).default(1),
|
||||
pageSize: z.coerce.number().int().min(1).max(100).default(10)
|
||||
})
|
||||
|
||||
25
server/routes/admin/api/members/[id]/posts.get.js
Normal file
25
server/routes/admin/api/members/[id]/posts.get.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import { createError, getQuery, getRouterParam } from 'h3'
|
||||
import { z } from 'zod'
|
||||
import { requireAdminSession } from '../../../../../utils/admin-auth'
|
||||
import { listAdminMemberPosts } from '../../../../../repositories/content-repository'
|
||||
|
||||
const querySchema = z.object({
|
||||
memberId: z.string().uuid(),
|
||||
q: z.string().trim().max(200).default(''),
|
||||
page: z.coerce.number().int().min(1).max(1000000).default(1),
|
||||
pageSize: z.coerce.number().int().min(1).max(100).default(10)
|
||||
})
|
||||
|
||||
/**
|
||||
* 관리자 전용 회원 작성 글 목록을 조회한다.
|
||||
* @param {import('h3').H3Event} event - 요청 이벤트
|
||||
* @returns {Promise<Object>} 작성 글 페이지
|
||||
*/
|
||||
export default defineEventHandler((event) => {
|
||||
requireAdminSession(event)
|
||||
const result = querySchema.safeParse({ ...getQuery(event), memberId: getRouterParam(event, 'id') })
|
||||
if (!result.success) {
|
||||
throw createError({ statusCode: 400, message: '작성 글 조회 조건이 올바르지 않습니다.' })
|
||||
}
|
||||
return listAdminMemberPosts(result.data)
|
||||
})
|
||||
Reference in New Issue
Block a user