crowny-project v2.4 — 팀/공유/연락 + 실시간 + 권한 세분화
개요
TOAU 729 프로젝트 매니저(project.crowny.org:9730)에 4대 협업 기능 완성.
- 팀 계정 (법인체) — teams 테이블 + 팀 지갑 + 역할(owner/admin/member)
- 프로젝트 공유/이전 — shares 테이블 + 데이터복사/소유권이전 2모드
- 팀원 연락 — messages + contacts + 팁+메시지 동시전송
- 실시간 WebSocket 협업 — WS 인증, 개인 알림, 온라인 프레즌스
무엇을 했는가
A. 4대 기능 기본 구현
서버 테이블 추가:
teams(id, name, ownerId, members[{userId,role,joinedAt}], wallet, contact)shares(id, projectId, targetId, targetType, permission, sharedBy, at)messages(id, from, to, toType, projectId, text, type, read, at)
- 팀:
GET/POST /api/teams,GET/PUT/DELETE /api/teams/:id,/members,/role,/projects - 공유:
POST /api/projects/:id/share,/unshare,GET /api/shared-projects - 이전:
POST /api/projects/:id/transfer(복사/소유권 모드) - 메시지:
POST/GET /api/messages,/read,/thread/:userId - 연락:
GET /api/projects/:id/contacts,POST /api/projects/:id/tip-message
B. 공유 권한 세분화 (보안)
projectPermission(pj, uname) → owner | admin | write | read | null
- PM = owner
- 팀 프로젝트: 팀 내 role 기반 (owner/admin→admin, member→write)
- 직접 공유 / 팀 경유 공유 / 기존 project.members 폴백
hasPermission() 확장 — 멤버 역할 + 공유 권한 폴백으로 모든 기존 write 엔드포인트 자동 적용:
- PATCH /api/projects/:id → manager 이상 (share admin 포함)
- PUT /api/projects/:id/meta → manager 이상
- GET /api/projects/:id → canReadProject 체크 +
myPermission응답 추가 - split/toau/assign/reward는 기존 hasPermission 호출 활용
C. WebSocket 사용자 인증 + 개인 알림
- WS upgrade 핸드셰이크 전에
auth(token)검증 (쿼리?token=또는 Authorization 헤더) - 클라이언트에
userId바인딩 onlineUsers: Map<username, Set<client>>프레즌스 추적notify()→ DB 저장 + 해당 사용자 WS 실시간 푸시wsPushUser(userId, event)헬퍼- 메시지 전송 시 수신자+발신자 직접 푸시 (전체 브로드캐스트 제거)
- 프레즌스 변경(온/오프라인) 모든 클라이언트에 브로드캐스트
D. 온라인 상태 실시간
/api/projects/:id/contacts:online: onlineUsers.has(uname),lastSeen포함/api/presence신규 — 현재 온라인 유저 목록- 프론트
handleWSEvent— presence/message/notification 타입 분기
E. 프로젝트 필터/정렬 (프론트엔드)
사이드바 툴바: 전체/내 것/팀/공유 필터 + 이름/생성일 정렬 토글
검증 결과 (curl 테스트)
[1] 공유 전 user2 접근 → HTTP 403 ✅
[2] read 권한 공유 → share id 반환 ✅
[3] 공유 후 user2 접근 → myPermission=read ✅
[4] user2 PATCH (read) → HTTP 403 "관리자 이상" ✅
[5] admin 권한 업그레이드 → ok ✅
[6] user2 PATCH 재시도 → HTTP 200 ✅
[7] /api/presence → {"online":[]} ✅
관련 파일
/Users/ef/crowny-project/server.js (4200+ 줄)projectPermission(), permAtLeast(), canReadProject() — 427 부근hasPermission() 확장 — 1162 부근/api/projects/:id GET 권한 체크 — 3267 부근notify() + wsPushUser() — 4214 부근/Users/ef/crowny-project/public/js/app.js (2300+ 줄)loadProjects() 필터/정렬 툴바 — 213 부근connectWS() 토큰 포함 — 427 부근handleWSEvent() presence/message/notification — 461 부근잔여 이슈
- WS 연결 E2E 검증:
wsnpm 모듈 미설치로 브라우저 수동 테스트 필요 /api/presence온라인 목록: HTTP 테스트 시 WS 미연결로 빈 배열 — 프론트 통합 후 검증 필요- 팀 프로젝트 세밀 필터 (tag, 상태별) — 현재 4종 카테고리만
- 모바일 UI 반응형 조정 미완
- v2.4 버전업은
CROWNY_VERSIONS.md에 자동 반영 예정
다음 세션 참고
- 공유 권한 체크 헬퍼
canReadProject(pj, uname)/hasPermission(pj, uname, role)— 모든 새 엔드포인트에 적용할 것 - WS 개인 푸시는
wsPushUser(userId, event)사용 - 프레즌스는
onlineUsers.has(username)로 조회