feat: Phase 5 View 분할 + RBAC 2차원 권한 + 게시판 CRUD API 연동 #29
@ -1387,21 +1387,22 @@ export async function createBoardPost(input: CreateBoardPostInput): Promise<{ sn
|
||||
|
||||
#### 권한 기반 UI 분기
|
||||
|
||||
**파일**: `frontend/src/tabs/board/components/BoardListTable.tsx`
|
||||
**파일**: `frontend/src/tabs/board/components/BoardView.tsx`
|
||||
|
||||
```tsx
|
||||
import { useAuthStore } from '@common/store/authStore';
|
||||
|
||||
const hasPermission = useAuthStore((s) => s.hasPermission);
|
||||
|
||||
// 카테고리별 서브리소스 CREATE 권한 확인
|
||||
const canWrite = selectedCategory
|
||||
? hasPermission(`board:${selectedCategory.toLowerCase()}`, 'CREATE')
|
||||
: hasPermission('board', 'CREATE');
|
||||
// 서브탭 기준 글쓰기 권한 리소스 결정
|
||||
const getWriteResource = () => {
|
||||
if (activeSubTab === 'all') return 'board';
|
||||
return `board:${activeSubTab}`;
|
||||
};
|
||||
|
||||
// 글쓰기 버튼 조건부 렌더링
|
||||
{canWrite && (
|
||||
<button onClick={onWriteClick}>글쓰기</button>
|
||||
{hasPermission(getWriteResource(), 'CREATE') && (
|
||||
<button onClick={handleWriteClick}>글쓰기</button>
|
||||
)}
|
||||
```
|
||||
|
||||
@ -1430,4 +1431,6 @@ const canWrite = selectedCategory
|
||||
| 백엔드 | `backend/src/board/boardRouter.ts` | 라우터 + requirePermission |
|
||||
| 백엔드 | `backend/src/server.ts` | boardRouter 등록 |
|
||||
| 프론트 | `frontend/src/tabs/board/services/boardApi.ts` | API 서비스 |
|
||||
| 프론트 | `frontend/src/tabs/board/components/BoardListTable.tsx` | 목록 UI (API 연동) |
|
||||
| 프론트 | `frontend/src/tabs/board/components/BoardView.tsx` | 목록/상세/작성 통합 뷰 (API 연동) |
|
||||
| 프론트 | `frontend/src/tabs/board/components/BoardWriteForm.tsx` | 게시글 작성/수정 폼 (API 호출) |
|
||||
| 프론트 | `frontend/src/tabs/board/components/BoardDetailView.tsx` | 게시글 상세 보기 (API 호출) |
|
||||
|
||||
불러오는 중...
Reference in New Issue
Block a user