docs: PRD·CLAUDE 보강과 PLANS 마무리 (Phase 6)

- PRD: 반응 2종(heart/star)·공개여부·lang·대댓글·라우트·다크모드/검색/토스트·role 확정 반영
- CLAUDE: 구조 맵(app.js·helpers.js·_project_detail·hearts)·role 인증 모델 갱신
- 부팅 스모크 테스트(/healthz) 통과, 실 DB 기능 점검만 잔여

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyemin Lee
2026-06-29 17:31:47 +09:00
parent e6928a8d61
commit e174fccef2
3 changed files with 66 additions and 33 deletions

View File

@@ -16,7 +16,8 @@ AI DEV — 사내 개발 포털. 직원이 한 곳에서 **사내 개발 사이
- **Express 4 + EJS** — 서버 사이드 렌더링, 빌드 없음.
- **Postgres** (`pg`) — OpenEverest `appdb`, schema `portal`.
- **Keycloak OIDC** (`openid-client` v5) — Authorization Code.
- 정적 CSS 한 장: `public/style.css`. 로고: `public/logo.svg`.
- 정적 CSS 한 장: `public/style.css`(라이트/다크 CSS 변수). 가벼운 바닐라 JS: `public/app.js`. 로고: `public/logo.svg`.
- 프레임워크/번들러 없이 **점진적 향상**: 폼 POST 기본 동작 + JS 있으면 fetch 로 즉시 반영.
## 명령
- `npm run dev``node --watch`, http://localhost:3000
@@ -30,16 +31,20 @@ AI DEV — 사내 개발 포털. 직원이 한 곳에서 **사내 개발 사이
- `src/server.js` — Express 앱, 라우트, 부팅
- `src/config.js` — 환경변수 설정
- `src/auth.js` — Keycloak OIDC (로그인 리다이렉트 / 콜백 / `requireAuth` 가드)
- `src/db.js` — Postgres 풀 + 쿼리 함수
- `src/sites.js`대시보드 "사이트 바로가기" 카탈로그
- `views/``_header`, `dashboard`, `login`, `project` (EJS)
- `public/``style.css`, `logo.svg`
- `src/db.js` — Postgres 풀 + 쿼리 함수 (`hearts`❤️/`stars`⭐/`comments`/`projects`)
- `src/sites.js`도구 카탈로그(개발/인프라) + `toolsForUser(isAdmin)` role 필터
- `src/helpers.js` — 뷰 헬퍼: `icon`(Octicon SVG)·`identicon`(아바타 SVG)·`langColor`·`langFromTags` (res.locals 노출)
- `views/``_header`, `_project_detail`(모달/단독 공용 상세), `dashboard`, `login`, `project` (EJS)
- `public/``style.css`(CSS 변수 라이트/다크 단일 파일), `app.js`(테마·모달·검색/정렬·반응 fetch·이스터에그), `logo.svg`
- `schema.sql` — DB 스키마(멱등), `scripts/init-db.js` 가 적용
- `deploy/portal-route.yaml` — Gateway HTTPRoute (portal.bokdev.in)
- `design-refs/` — 디자인 레퍼런스(.dc.html). 화면 변경 시 시각 기준.
- `.claude/` — Claude Code 훅·설정
## 인증 모델
- **사번 = Keycloak `preferred_username`.** 세션에 `req.session.user = { sabun, name, email }`.
- **사번 = Keycloak `preferred_username`.** 세션에 `req.session.user = { sabun, name, email, roles, isAdmin }`.
- **관리자 = `realm_access.roles``ADMIN_ROLE`(기본 `admin`) 포함.** 인프라 도구(OpenEverest/MinIO/
Keycloak/LiteLLM)는 관리자에게만 렌더(`sites.js``adminOnly` + `toolsForUser`).
- 미인증으로 보호 페이지 진입 시 중간 화면 없이 곧장 Keycloak 로그인으로 리다이렉트
(`requireAuth``loginRedirect`). OIDC discovery 실패 시에만 `login.ejs` 폴백.
- ⚠️ **알려진 문제**: `/logout` 은 로컬 세션만 파기 → Keycloak SSO 세션이 남아 재진입 시 자동
@@ -51,7 +56,7 @@ AI DEV — 사내 개발 포털. 직원이 한 곳에서 **사내 개발 사이
- `Dockerfile` 은 Kubero buildpack 의 harbor push 실패를 우회하는 **수동 push 용**.
- 도메인 `portal.bokdev.in` (`deploy/portal-route.yaml`). 도메인 추가 시 Keycloak `portal`
client redirect 에 `https://<도메인>/auth/callback` 등록 필요.
- Kubero Env: `BASE_URL`, `DATABASE_URL`, `OIDC_*`, `SESSION_SECRET`, `PORTAL_BRAND`.
- Kubero Env: `BASE_URL`, `DATABASE_URL`, `OIDC_*`, `SESSION_SECRET`, `PORTAL_BRAND`, `ADMIN_ROLE`, (선택) 도구 `*_URL`.
## 컨벤션
- 라우트는 `src/server.js` 에, DB 접근은 `src/db.js` 의 함수로만 (인라인 SQL 산재 금지).