Compare commits

...

1 Commits

Author SHA1 Message Date
9b265c070b admin: count actual item placements 2026-04-06 15:15:18 +09:00
3 changed files with 14 additions and 14 deletions

View File

@@ -1725,7 +1725,7 @@ async function countTierListsUsingTopicItem(itemId) {
const rows = await query(
`
SELECT id, is_public, groups_json, pool_json
SELECT id, is_public, groups_json
FROM tierlists
`
)
@@ -1736,10 +1736,8 @@ async function countTierListsUsingTopicItem(itemId) {
rows.forEach((row) => {
const groups = parseJson(row.groups_json, [])
const pool = parseJson(row.pool_json, [])
const inGroups = groups.some((group) => (group?.itemIds || []).includes(itemId))
const inPool = pool.some((item) => item?.id === itemId)
if (!inGroups && !inPool) return
if (!inGroups) return
totalCount += 1
if (row.is_public) publicCount += 1
else privateCount += 1
@@ -1819,7 +1817,7 @@ async function findCustomItemById(id) {
async function getCustomItemUsageMeta() {
const rows = await query(
`
SELECT t.topic_id, tp.name AS topic_name, t.groups_json, t.pool_json
SELECT t.topic_id, tp.name AS topic_name, t.groups_json
FROM tierlists t
LEFT JOIN topics tp ON tp.id = t.topic_id
`
@@ -1829,7 +1827,6 @@ async function getCustomItemUsageMeta() {
rows.forEach((row) => {
const groups = parseJson(row.groups_json, [])
const pool = parseJson(row.pool_json, [])
const seenItemIds = new Set()
groups.forEach((group) => {
@@ -1839,13 +1836,6 @@ async function getCustomItemUsageMeta() {
})
})
pool.forEach((item) => {
if (item?.id) {
usageMap.set(item.id, (usageMap.get(item.id) || 0) + 1)
seenItemIds.add(item.id)
}
})
if (!row.topic_id) return
seenItemIds.forEach((itemId) => {
@@ -2013,7 +2003,7 @@ async function listCustomItems({ queryText = '', page = 1, limit = 50, filterMod
createdAt: Number(row.created_at),
ownerName: row.topic_name || row.topic_id,
ownerEmail: '',
usageCount: (templateLinkedBySrc.get(row.src) || new Map()).size,
usageCount: usageMeta.usageMap.get(row.id) || 0,
linkedTemplates: Array.from((templateLinkedBySrc.get(row.src) || new Map()).values()),
assetKind: resolveLibraryAssetKind(row.src),
sourceType: 'template',

View File

@@ -1,5 +1,9 @@
# 의사결정 이력
## 2026-04-06 v1.0.104
- 아이템 사용 횟수는 “템플릿에 포함되어 선택 가능했던 횟수”가 아니라 “사용자가 실제 티어표 보드에 배치한 횟수”가 운영 지표로 더 의미 있다고 정리했다. 따라서 `pool_json`은 미사용 후보로 보고 제외하고, `groups_json`에 들어간 item id만 사용 횟수로 집계한다.
- 템플릿 아이템도 같은 이미지가 몇 개 템플릿에 연결됐는지와 실제 저장 티어표에서 사용됐는지는 별도 개념이므로, `usageCount`는 실제 배치 기준으로 바꾸고 템플릿 연결 정보는 별도 `linkedTemplates`로 유지한다.
## 2026-04-06 v1.0.103
- 기존 Git 태그와 커밋 메시지를 직접 재작성하면 원격 히스토리와 배포 참조가 꼬일 수 있으므로, 실제 태그는 그대로 두고 문서 기준 버전만 보정하기로 정리했다.
- 다음 작업자와 AI에게 전달할 기준은 다음과 같다. `v0.1`은 개발 시작, `v0.2`는 Figma 기반 리디자인, `v0.3`은 이미지 최적화와 운영 기능 구현, `v0.4`는 게임 티어 중심 구조에서 범용 티어 메이커로 전환한 단계이며, 이 흐름을 공개 기준 `v1.0`으로 승격해 이어간다.

View File

@@ -1,5 +1,11 @@
# 업데이트 로그
## 2026-04-06 v1.0.104
- 관리자 아이템 사용 횟수 기준을 실제 티어표 배치 기준으로 정리했다. 이제 `pool_json`에 남아 있는 미사용 후보는 사용 횟수에 포함하지 않고, `groups_json`에 실제 배치된 아이템만 사용된 것으로 계산한다.
- 템플릿 아이템 사용 횟수도 같은 이미지가 연결된 템플릿 개수가 아니라, 해당 기본 아이템이 저장된 티어표 보드에 실제로 배치된 횟수를 기준으로 계산한다.
- 템플릿 기본 아이템 삭제 영향 안내도 실제 배치된 티어표 기준으로 맞췄다.
- 확인: `node --check backend/src/db.js`, `npm run build`
## 2026-04-06 v1.0.103
- 문서상의 버전 표기 기준을 정리했다. 기존에 공개 전 개발 흐름에서 잘못 올라간 `v1.2.x``v0.2.x`, `v1.3.x``v0.3.x`, `v1.4.x``v1.0.x` 흐름으로 해석한다.
- 다음 작업자와 AI는 이 문서 기준으로 현재 최신 버전을 `v1.0.103`로 이어가야 한다. 기존 Git 태그/커밋은 히스토리 재작성 위험이 있어 그대로 두고, 문서 기준 버전만 보정했다.