Cloud admin: user and access management panel
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 35/100
- issue の種類
- 機能追加
- 明瞭さ
- おおむね明確
- 活発さ
- 活発
- 技術スタック
- firebase, typescript
調査の方向性
Start by reading src/App.tsx and src/App.test.tsx for route registration and MemoryRouter tests, then inspect the GlyphDebug route, AddWorkspaceDialog, ConfirmDialog, and the existing config/defaults and security-rule paths. The work is done when the /admin flow covers the listed allowlist, domain, user, quota, account, and defaults operations, with visible errors, confirmations, mutation coverage, and a clean TypeScript check.
索引モデルが issue の本文から書いたものです。
説明
Summary
Admin panel for managing who may sign in and what limits they get. All operations are plain
Firestore writes gated by isAdmin() in the security rules — no Cloud Functions required.
Scope
- New
/adminroute registered insrc/App.tsx. Must be declared before the*catch-all,
which currently redirects everything unmatched to/editor. Lazy-loaded, following the existing
src/routes/GlyphDebug.tsxpattern (that route plus its CSS module are the only members of
src/routes/today). - Guarded on
role === 'admin'; non-admins are redirected to/editor. The route guard is
convenience only — the security rules are the actual enforcement. - Manage the email allowlist: add, remove, list. Emails normalised to lowercase on write.
- Manage allowed domains: add, remove, list (e.g.
adventuresinlua.com), so a whole
organisation can be admitted without listing individuals. - Manage users: set per-user
quotaBytes(default 25 MB) andmaxFiles(default 2000),
disable/enable an account, promote/demote admin. - Editing
config/defaultsso new users get a different default quota and file cap.
Acceptance criteria
-
/adminroute added before the*catch-all inApp.tsx, lazy-loaded - Non-admins cannot reach the panel and are redirected
- Allowlist entries can be added, listed, and removed; emails are lowercased
- Allowed domains can be added, listed, and removed
- Per-user
quotaBytesandmaxFilesare editable and take effect without the user re-signing-in - Accounts can be disabled and re-enabled; a disabled user loses access
- Admin can be granted and revoked; an admin cannot demote themselves into lockout
-
config/defaultsis editable from the panel - Destructive actions (remove user, revoke admin, disable) confirm first
- Errors surface visibly rather than failing silently
- Route wiring tested with the
MemoryRouterpattern insrc/App.test.tsx -
npx tsc -p lua-learning-website/tsconfig.app.json --noEmitclean - Scoped mutation coverage >= 80%
Implementation notes
src/App.test.tsxis the template for route tests:<MemoryRouter initialEntries={[...]}>
with the heavy componentvi.mocked to a stub.- There is no shared UI primitives directory in this repo. Reuse
src/components/AddWorkspaceDialog/AddWorkspaceDialog.tsxas the form pattern (controlled
inputs with<label htmlFor>,role="alert"errors,isFormValidgating a disabled submit)
andsrc/components/ConfirmDialog/for destructive confirmations. - Use theme custom properties from
src/styles/themes.css. - Keep business logic in hooks, not components —
CLAUDE.mdrequires UI components stay pure.
Watch the 400-line-per-file lint cap; split the panel into sub-components early. e2e/tab-persistence.spec.ts:233navigates to/docs, which is not a declared route and
silently redirects. Harmless, but a reminder that route order matters here.
Depends on
- #789
Branching
This issue is part of the Cloud Accounts & Storage
milestone, which uses feat/cloud as its integration branch.
Branch from feat/cloud, and open the PR against feat/cloud. Never against main.
Create the branch (the --base flag also sets the default PR target for this branch):
gh issue develop <number> --base feat/cloud --checkout
Open the PR:
python3 scripts/issue-review.py <number> --base feat/cloud \
--summary "<summary>" --test-plan "<test-plan>"
feat/cloud merges to main in a single PR once the milestone is complete.
Why both flags are required: gh issue develop without --base branches from the repository
default branch (main), and scripts/issue-review.py falls back to main when --base is
omitted — both for the gh pr create target and for the changed-file list in the PR body.
- 主要言語
- TypeScript
- スター
- 1
- フォーク
- 0
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
jcollard/LuaInTheWeb のほかの issue
-
tech-debt
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
jcollard/LuaInTheWeb#752 ·
-
tech-debt
難易度 1/5 1時間未満 初心者へのやさしさ 68/100
jcollard/LuaInTheWeb#690 ·
-
tech-debt
難易度 1/5 1時間未満 初心者へのやさしさ 75/100
jcollard/LuaInTheWeb#590 ·
-
tech-debt
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
jcollard/LuaInTheWeb#518 ·
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
jcollard/LuaInTheWeb#235 ·
jcollard/LuaInTheWeb の issue をすべて見る
似ている issue
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
lingdojo/kana-dojo#33286 · コメント 1 件 · リアクション 5 件 ·
メンテナーはふだん 1 日以内に返信
-
friction
難易度 1/5 1時間未満 初心者へのやさしさ 77/100
kentcdodds/kody#4499 ·
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
hemilabs/ui-monorepo#2605 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 6 日以内に返信
-
build.yml: macOS arm64 DMG fails, cargo missing on the macos-26 runner image対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
getopenscreen/openscreen#1423 ·
メンテナーはふだん 1 日以内に返信