릴리스: v0.1.42 관리자 티어표 관리 추가

This commit is contained in:
2026-03-26 19:02:46 +09:00
parent b9aa714501
commit 3bd9751621
10 changed files with 625 additions and 8 deletions

View File

@@ -71,6 +71,7 @@ function mapTierListRow(row) {
authorAccountName: getUserAccountName(row),
authorAvatarSrc: row.avatar_src || '',
gameId: row.game_id,
gameName: row.game_name || '',
title: row.title,
thumbnailSrc: row.thumbnail_src || '',
description: row.description || '',
@@ -689,13 +690,44 @@ async function listUserTierLists(userId) {
}))
}
async function findTierListById(id) {
function uniqueTierListItems(poolItems) {
const map = new Map()
;(poolItems || []).forEach((item) => {
if (!item?.id || map.has(item.id)) return
map.set(item.id, {
id: item.id,
src: item.src || '',
label: item.label || 'item',
origin: item.origin || 'game',
})
})
return Array.from(map.values())
}
async function listAdminTierLists({ queryText = '', page = 1, limit = 50 } = {}) {
const normalizedLimit = Math.min(Math.max(Number(limit) || 50, 1), 200)
const normalizedPage = Math.max(Number(page) || 1, 1)
const hasQuery = !!(queryText || '').trim()
const search = `%${(queryText || '').trim()}%`
const whereClause = hasQuery
? `
WHERE
t.title LIKE ?
OR g.name LIKE ?
OR g.id LIKE ?
OR u.email LIKE ?
OR u.nickname LIKE ?
`
: ''
const params = hasQuery ? [search, search, search, search, search] : []
const rows = await query(
`
SELECT
t.id,
t.author_id,
t.game_id,
g.name AS game_name,
t.title,
t.thumbnail_src,
t.description,
@@ -709,6 +741,57 @@ async function findTierListById(id) {
u.avatar_src
FROM tierlists t
INNER JOIN users u ON u.id = t.author_id
INNER JOIN games g ON g.id = t.game_id
${whereClause}
ORDER BY t.updated_at DESC, t.created_at DESC
`,
params
)
const allItems = rows.map((row) => {
const tierList = mapTierListRow(row)
const poolItems = uniqueTierListItems(tierList.pool)
const extraItems = poolItems.filter((item) => item.origin === 'custom')
return {
...tierList,
itemCount: poolItems.length,
extraItemCount: extraItems.length,
extraItems,
}
})
const total = allItems.length
const offset = (normalizedPage - 1) * normalizedLimit
return {
tierLists: allItems.slice(offset, offset + normalizedLimit),
total,
page: normalizedPage,
limit: normalizedLimit,
}
}
async function findTierListById(id) {
const rows = await query(
`
SELECT
t.id,
t.author_id,
t.game_id,
g.name AS game_name,
t.title,
t.thumbnail_src,
t.description,
t.is_public,
t.groups_json,
t.pool_json,
t.created_at,
t.updated_at,
u.nickname,
u.email,
u.avatar_src
FROM tierlists t
INNER JOIN users u ON u.id = t.author_id
INNER JOIN games g ON g.id = t.game_id
WHERE t.id = ?
LIMIT 1
`,
@@ -805,6 +888,7 @@ module.exports = {
findUnusedCustomItems,
listPublicTierLists,
listUserTierLists,
listAdminTierLists,
findTierListById,
deleteTierList,
findCustomItemsByIds,