Compare commits

...

2 Commits

Author SHA1 Message Date
9b265c070b admin: count actual item placements 2026-04-06 15:15:18 +09:00
7de4452fb6 docs: advance normalized version marker 2026-04-06 14:22:44 +09:00
3 changed files with 18 additions and 18 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,9 +1,13 @@
# 의사결정 이력
## 2026-04-06 v1.0.102
## 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`으로 승격해 이어간다.
- 따라서 기존 문서의 `v1.2.x``v0.2.x`, `v1.3.x``v0.3.x`, `v1.4.x``v1.0.x`로 읽어야 하며, 현재 최신 문서 기준 버전은 `v1.0.102`다.
- 따라서 기존 문서의 `v1.2.x``v0.2.x`, `v1.3.x``v0.3.x`, `v1.4.x``v1.0.x`로 읽어야 하며, 현재 최신 문서 기준 버전은 `v1.0.103`다.
## 2026-04-06 v1.0.101
- 실제 문제는 `editorCanvas` 자체보다 그 아래 `workspaceBody--localRail`의 하단 패딩까지 문서가 더 스크롤되는 구간에서 발생했다. 편집 캔버스 자체에도 하단 여백이 있으므로, 데스크톱의 `workspaceBody--localRail` 하단 패딩과 오른쪽 sticky 래퍼의 추가 보정 패딩은 제거하는 편이 더 단순하고 정확하다고 판단했다.

View File

@@ -1,8 +1,14 @@
# 업데이트 로그
## 2026-04-06 v1.0.102
## 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.102`로 이어가야 한다. 기존 Git 태그/커밋은 히스토리 재작성 위험이 있어 그대로 두고, 문서 기준 버전만 보정했다.
- 다음 작업자와 AI는 이 문서 기준으로 현재 최신 버전을 `v1.0.103`로 이어가야 한다. 기존 Git 태그/커밋은 히스토리 재작성 위험이 있어 그대로 두고, 문서 기준 버전만 보정했다.
- 버전 흐름 요약: `v0.1` 개발 시작, `v0.2` Figma 기반 리디자인, `v0.3` 이미지 최적화 등 운영 기능 구현, `v0.4` 게임 티어 중심 구조에서 범용 티어 메이커로 전환, 이후 이 흐름을 공개 기준 `v1.0`으로 승격.
## 2026-04-06 v1.0.101