From e6928a8d61b7a12c3500daaaf082f768eea19e33 Mon Sep 17 00:00:00 2001 From: Hyemin Lee Date: Mon, 29 Jun 2026 17:27:09 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20PLANS=20=EC=A7=84=ED=96=89=EC=83=81?= =?UTF-8?q?=ED=99=A9=20=EA=B0=B1=EC=8B=A0=20(Phase=204=C2=B75=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EC=B2=B4=ED=81=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- PLANS.md | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/PLANS.md b/PLANS.md index 9af5926..5b2905c 100644 --- a/PLANS.md +++ b/PLANS.md @@ -54,21 +54,25 @@ - [x] 검색/정렬/필터용 data-* 속성(`data-search`/`data-created`/`data-pop`/`data-starred`/`data-vis`) 부여 → `app.js` 가 클라이언트 처리. - [x] 모의 데이터로 EJS 렌더 검증 통과(헤더 include 포함). 모달/공유모달/상세저장소는 Phase 5. -## Phase 4 — 라우트(`server.js`) -- [ ] `GET /` — 도구(role 필터)+내 프로젝트+피드 데이터 렌더. `?open=:id` 면 해당 모달 자동 오픈. -- [ ] `POST /projects` — 생성(visibility, 태그에서 lang 추론). 완료 후 리다이렉트. -- [ ] `POST /projects/:id/heart` · `POST /projects/:id/star` — 토글. JS(fetch)면 JSON `{on,count}`, 아니면 리다이렉트. -- [ ] `POST /projects/:id/visibility` — 공개/비공개 전환(본인). -- [ ] `POST /projects/:id/delete` — 본인 프로젝트 삭제. -- [ ] `POST /projects/:id/comments` — 댓글/대댓글(`parent_id` 옵션, 1뎁스 검증). JSON/리다이렉트 분기. -- [ ] `POST /comments/:id/delete` — 본인 댓글 삭제. -- [ ] `GET /projects/:id` — 모달 내용과 동일 정보의 단독 페이지(비-JS·공유 링크용). +## Phase 4 — 라우트(`server.js`) ✅ +- [x] 공통: res.locals 에 `icon`/`identicon`/`langColor` 노출, `isAjax`/`safeBack` 헬퍼. +- [x] `GET /` — `listProjects(me)` → 내 프로젝트/피드 분리, 도구 role 필터. `?open`/`?toast`/`?egg` → body 신호. +- [x] `POST /projects` — 태그 정리·lang 추론·visibility 반영 후 toast 리다이렉트. +- [x] `POST /projects/:id/heart` · `/star` — 토글. AJAX 면 JSON `{on,count}`, 아니면 Referer 복귀. +- [x] `POST /projects/:id/visibility` — 공개/비공개 전환(본인). +- [x] `POST /projects/:id/delete` — 본인 프로젝트 삭제. +- [x] `POST /projects/:id/comments` — 댓글/대댓글(`parent_id`), LGTM/🚀 egg 신호, `return_to` 복귀. +- [x] `POST /comments/:id/delete` — 본인 댓글 삭제. +- [x] `GET /projects/:id` — 단독 페이지(비공개는 본인만). `_header` body 신호용 typeof 가드 추가. +- [x] 크로스 모듈 import/export 해석 검증 통과(서버 부팅 가능 상태 복구). -## Phase 5 — 상세 모달 · 공유 모달 · 단독 페이지 -- [ ] 대시보드에 상세 모달 마크업: 헤더(제목·가시성·작성자·날짜·언어)·태그·설명·❤️/⭐/바로가기/저장소 버튼·댓글 스레드(대댓글 들여쓰기·LGTM 스탬프·답글/삭제)·댓글 입력(Enter 등록). -- [ ] 공유 모달 마크업: 제목*·설명·태그·배포 URL·공개범위(공개/비공개) 토글 + 안내문. -- [ ] `app.js` 로 모달 데이터 바인딩(렌더된 프로젝트 데이터 사용) + 폼 제출 처리. -- [ ] `views/project.ejs` 단독 페이지를 새 디자인에 맞게 갱신. +## Phase 5 — 상세 모달 · 공유 모달 · 단독 페이지 ✅ +- [x] `views/_project_detail.ejs` 신설 — 헤더(제목·가시성·작성자·날짜·언어)·태그·설명·❤️/⭐/바로가기/저장소·소유자 삭제·댓글 스레드(대댓글 들여쓰기·LGTM 스탬프·답글/삭제)·댓글 입력(Enter 등록). 모달/단독 페이지 공용(`modal` 플래그). +- [x] 대시보드: `#detailModal` 오버레이 + `#detailStore`(프로젝트별 `