diff --git a/backend/src/db.js b/backend/src/db.js index 2ad86a7..b7fa09f 100644 --- a/backend/src/db.js +++ b/backend/src/db.js @@ -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', diff --git a/docs/history.md b/docs/history.md index 34db0fe..7f8a07c 100644 --- a/docs/history.md +++ b/docs/history.md @@ -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`으로 승격해 이어간다. diff --git a/docs/update.md b/docs/update.md index d6d0ebc..c0402ba 100644 --- a/docs/update.md +++ b/docs/update.md @@ -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 태그/커밋은 히스토리 재작성 위험이 있어 그대로 두고, 문서 기준 버전만 보정했다.