memi-board 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -8
- package/dist/composables/useMemiBoardAuth.d.ts +2 -0
- package/dist/composables/useMemiBoardUsers.d.ts +11 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +206 -145
- package/dist/index.js.map +1 -1
- package/dist/module.mjs +4 -0
- package/dist/module.mjs.map +1 -1
- package/dist/runtime/components/Settings.vue +24 -4
- package/dist/runtime/components/Users.vue +64 -0
- package/dist/types.d.ts +12 -2
- package/docs/firestore.rules.example +24 -11
- package/docs/storage.rules.example +6 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -222,7 +222,7 @@ const router = useRouter()
|
|
|
222
222
|
### 제공하는 API
|
|
223
223
|
|
|
224
224
|
**컴포넌트 (auto-import):**
|
|
225
|
-
`MemiBoardList`, `MemiBoardDetail`, `MemiBoardEditor`, `MemiBoardCommentList`, `MemiBoardCommentForm`, `MemiBoardAttachments`, `MemiBoardSignIn`, `MemiBoardVersionHistory`
|
|
225
|
+
`MemiBoardList`, `MemiBoardDetail`, `MemiBoardEditor`, `MemiBoardCommentList`, `MemiBoardCommentForm`, `MemiBoardAttachments`, `MemiBoardSignIn`, `MemiBoardSettings`, `MemiBoardUsers`, `MemiBoardVersionHistory`
|
|
226
226
|
|
|
227
227
|
**List props:** `pageSize`, `category`, `postLinkBase`, `getPostLink(post)`, `linkBase`(deprecated)
|
|
228
228
|
|
|
@@ -234,13 +234,13 @@ const router = useRouter()
|
|
|
234
234
|
본문 HTML에는 원본 URL. 수정 중 버려진 파일은 호스트 스케줄러로 정리 (`extractEditorImageUrls` 로 본문 참조 비교).
|
|
235
235
|
|
|
236
236
|
**composables:**
|
|
237
|
-
`useMemiBoardAuth`, `useMemiBoardPosts`, `useMemiBoardComments`, `useMemiBoardStorage`, `useMemiBoardModeration`, `useMemiBoardSettings`
|
|
237
|
+
`useMemiBoardAuth`, `useMemiBoardPosts`, `useMemiBoardComments`, `useMemiBoardStorage`, `useMemiBoardModeration`, `useMemiBoardSettings`, `useMemiBoardUsers`
|
|
238
238
|
|
|
239
239
|
### 카테고리
|
|
240
240
|
|
|
241
|
-
- 문서: `{prefix}Settings/config/categories/{categoryId}` → `{ label, listView, order, updatedAt }`
|
|
241
|
+
- 문서: `{prefix}Settings/config/categories/{categoryId}` → `{ label, listView, writeRole, order, updatedAt }`
|
|
242
242
|
- 설정이 없으면 빈 목록이며 기본 카테고리를 자동 생성하지 않음
|
|
243
|
-
- `MemiBoardSettings`에서 관리자가 카테고리별
|
|
243
|
+
- `MemiBoardSettings`에서 관리자가 카테고리별 저장·삭제·순서·리스트뷰·글쓰기 최소 역할 관리
|
|
244
244
|
- `categoryId`는 문서 ID이자 게시글의 `category` 참조값이므로 생성 후 변경하지 않는 것을 권장
|
|
245
245
|
|
|
246
246
|
### 로그인 공급자
|
|
@@ -263,10 +263,11 @@ const router = useRouter()
|
|
|
263
263
|
| 동작 | 조건 |
|
|
264
264
|
|------|------|
|
|
265
265
|
| 글/댓글 읽기 | 공개 |
|
|
266
|
-
|
|
|
267
|
-
|
|
|
268
|
-
|
|
|
269
|
-
|
|
|
266
|
+
| 글 작성 | 로그인 + 카테고리 `writeRole` 충족 + `moderationStatus == 'approved'` |
|
|
267
|
+
| 댓글 작성 | 로그인 + `moderationStatus == 'approved'` (클라가 항상 approved 로 씀 — 검열 통과 후에만 write) |
|
|
268
|
+
| 글 수정·삭제 | 작성자 또는 `{prefix}Users/{uid}.role in ['admin', 'staff']` |
|
|
269
|
+
| 댓글 삭제 | 댓글 작성자 · 글 작성자 · admin · staff |
|
|
270
|
+
| 역할 관리 | `MemiBoardUsers`에서 admin이 `admin`·`staff`·`user` 변경 |
|
|
270
271
|
|
|
271
272
|
**알려진 한계:** AI 검열은 클라이언트 전용. SDK로 직접 write 하면 우회 가능. 중요 서비스면 Cloud Functions 검증을 호스트가 추가(패키지 범위 밖).
|
|
272
273
|
|
|
@@ -6,6 +6,8 @@ export interface UseMemiBoardAuthReturn {
|
|
|
6
6
|
user: ReturnType<typeof useCurrentUser>;
|
|
7
7
|
isSignedIn: ComputedRef<boolean>;
|
|
8
8
|
isAdmin: ComputedRef<boolean>;
|
|
9
|
+
isStaff: ComputedRef<boolean>;
|
|
10
|
+
canManageContent: ComputedRef<boolean>;
|
|
9
11
|
rolePending: Ref<boolean>;
|
|
10
12
|
/** 유효 검열 차단 누적 (lazy decay 반영) */
|
|
11
13
|
moderationBlockCount: ComputedRef<number>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BoardUserModel, BoardUserRole } from '../types';
|
|
2
|
+
export declare const BOARD_USER_ROLES: Array<{
|
|
3
|
+
value: BoardUserRole;
|
|
4
|
+
label: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function useMemiBoardUsers(): {
|
|
8
|
+
users: import('vuefire')._RefFirestore<import('vuefire').VueFirestoreQueryData<BoardUserModel>>;
|
|
9
|
+
usersPending: import('vue').Ref<boolean, boolean>;
|
|
10
|
+
updateUserRole: (uid: string, role: BoardUserRole) => Promise<void>;
|
|
11
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -9,12 +9,13 @@ export type { AddCommentInput } from './composables/useMemiBoardComments';
|
|
|
9
9
|
export { useMemiBoardModeration } from './composables/useMemiBoardModeration';
|
|
10
10
|
export { useMemiBoardStorage } from './composables/useMemiBoardStorage';
|
|
11
11
|
export { useMemiBoardSettings, DEFAULT_CATEGORIES } from './composables/useMemiBoardSettings';
|
|
12
|
+
export { useMemiBoardUsers, BOARD_USER_ROLES } from './composables/useMemiBoardUsers';
|
|
12
13
|
export { versionHistory } from './data/versionHistory';
|
|
13
14
|
export type { VersionHistoryEntry } from './data/versionHistory';
|
|
14
15
|
export { formatDate } from './utils/formatDate';
|
|
15
16
|
export { slugify } from './utils/slugify';
|
|
16
17
|
export { DEFAULT_BLOCK_BAN_THRESHOLD, DEFAULT_BLOCK_BAN_DECAY_MS, effectiveModerationBlockCount, isModerationWriteRestricted, moderationWriteRestrictedUntilMs, formatRestrictedUntilLabel, } from './utils/moderation-strike';
|
|
17
|
-
export type { Attachment, EditorImageEntry, ModerationStatus, PostModel, PostDetail, CommentModel, BoardUserRole, BoardCategory, BoardListView, BoardSettingsModel, ModerationResult, } from './types';
|
|
18
|
+
export type { Attachment, EditorImageEntry, ModerationStatus, PostModel, PostDetail, CommentModel, BoardUserRole, BoardUserModel, BoardCategory, BoardListView, BoardWriteRole, BoardSettingsModel, ModerationResult, } from './types';
|
|
18
19
|
export { compressImage } from './utils/compressImage';
|
|
19
20
|
export { extractEditorImageUrls } from './utils/extractEditorImageUrls';
|
|
20
21
|
export { renderMarkdownToHtml } from './utils/renderMarkdown';
|