전체Admin과 SiteAdmin의 권한에 따라 /Admin 네비게이션 메뉴를 다르게 표시한다.
[전체 관리] ← 전체Admin만 표시. Sites 블록보다 위에 온다
Dashboard
User
RecentChanges
AccessLog
Crawler Cache
S3 Browser
API Keys
Nickname Requests
[Sites]
▼ AhaWiki (#1) ← 현재 사이트(request.host): 자동 펼침. 강조(filled)는 URL 의 site seq 를 따른다
Config
Page
Cache
Permission
AccessLog ← 전체Admin만 표시
SiteAdmins ← 전체Admin만 표시
▶ OtherSite (#2) ← 전체Admin만 표시 (접힌 상태)이 그림은 app/assets/js/admin/navigation.jsx 를 옮긴 것이다. 항목을 더하거나 이름을 바꾸면 여기도 바꾼다 — 2026-05-24 이후 넉 달 동안 이 그림은 없어진 "Meta목록" 을 그리고 있었고, 나중에 붙은 API Keys·Nickname Requests 는 없었다.
request.host로 판별 (/api/me의 currentSiteSeq 활용)GET /api/me 추가: loggedIn, seq, nickname, loginEmail, profileImageUrl, isAdmin, siteAdminSeqs, currentSiteSeq 반환. 로그아웃 상태면 {"loggedIn": false} 만 돌려주고, 내비게이션은 loggedIn 이 참일 때만 site 목록을 가져온다SiteAdmin.selectByUser(userSeq) 추가/api/Admin/Sites: SiteAdmin은 담당 사이트만 반환하도록 수정Admin.scala: isAdmin || isSiteAdmin 기준으로 접근 허용AdminLayout에서 me fetch 후 Navigation에는 prop으로, 각 페이지에는 AdminContext.Provider로 전달SiteNavItem 컴포넌트 분리로 사이트별 서브메뉴 재사용me.isAdmin이 false 이면 Dashboard 는 담당 사이트 목록만 보여준다. 전체Admin 전용 페이지는 프론트에서 막지 않는다 — API 의 403 이 HTTP 403 오류 문구로 보이거나(S3 Browser·API Keys·Nickname Requests) 빈 화면으로 남는다(User·RecentChanges·AccessLog·Crawler Cache). 2026-05-24 에 넣었던 접근 불가 메시지는 같은 날 뺐다실제 보안은 API 레벨(isAdmin / isSiteAdmin)에서 처리한다. 프론트 메뉴 분기는 UX 목적으로만 사용한다.
Similar pages by cosine similarity. Words after page name are term frequency.