← 목록
프로젝트 2026-04-15 5KB 읽기 5분

crowny-project v2.4 — 팀/공유/연락 + 실시간 + 권한 세분화

개요

TOAU 729 프로젝트 매니저(project.crowny.org:9730)에 4대 협업 기능 완성.

  1. 팀 계정 (법인체) — teams 테이블 + 팀 지갑 + 역할(owner/admin/member)
  2. 프로젝트 공유/이전 — shares 테이블 + 데이터복사/소유권이전 2모드
  3. 팀원 연락 — messages + contacts + 팁+메시지 동시전송
  4. 실시간 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)
API:
  • 팀: 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
UI: 사이드바 팀/메시지 목록, 모달 5종 (팀생성/팀상세/공유/이전/연락), 뱃지

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 부근
  • WS upgrade 인증 + onlineUsers — 4093 부근
  • notify() + wsPushUser() — 4214 부근
  • /Users/ef/crowny-project/public/js/app.js (2300+ 줄)
  • loadProjects() 필터/정렬 툴바 — 213 부근
  • connectWS() 토큰 포함 — 427 부근
  • handleWSEvent() presence/message/notification — 461 부근
  • 잔여 이슈

    • WS 연결 E2E 검증: ws npm 모듈 미설치로 브라우저 수동 테스트 필요
    • /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) 로 조회