← デモ入口に戻る
🛡 ロール・権限体系
誰が・何を・どう使えるか
琴平デジタル町民の機能は 3軸のロール で制御されています。 以下にそれぞれのロールの 取得方法・条件・できること を実装仕様そのままで整理しました。
🎯 3軸分離の考え方
Tier(会員ランク)
guest / citizen / premium
ユーザーが「何を使える状態か」。町民登録・プレミアム購入で昇格する。
Staff Role(運営権限)
MEMBER / ORGANIZER / ADMIN / OWNER
「運営側として何を操作できるか」。OWNER が最高権限、MEMBER が一般町民。
Custom Role(特化権限)
shop / events / points …
「特定の仕事だけ任せる」。お店オーナーには shop だけ渡す、など細かく分ける。
Staff Role と Custom Role は 併用可能。たとえば「ADMIN かつ shop も持つ」ことも成立する。
🗾Tier — 会員ランク(ユーザー側)
👋 ゲストゲスト(LINE友だちのみ)
LINE 公式アカウントを友だち追加しただけの状態。まだ琴平デジタル町民ではない。
- 登録方法
- 琴平デジタル町民の LINE QR を読むか、URL から友だち追加するだけ。
- 登録条件
- LINE アカウントを持っていること。町外の観光客・未登録者はここ。
- 付与する側
- 自動(LINE の follow イベントを受信した時点)
- 使える機能
- リッチメニュー(ゲスト用3タブ)/イベント・お店の閲覧(申込不可)/プレミアム制度の説明ページ
- 実装上の判定
- getMemberTier() が CommunityMember 無し or User.lineUserId 無し のとき 'guest' を返す
🗾 町民琴平デジタル町民
LINE 連携+氏名・住所・生年月日を登録した『琴平デジタル町民』。町の経済循環の主役。
- 登録方法
- ゲスト用リッチメニュー下段の『LINE連携で町民登録』→ LIFF フォームで氏名・住所・生年月日を入力して送信。完了で 100pt 進呈。
- 登録条件
- 氏名・住所・生年月日の3項目必須。住所は町内外どちらでも可(町外町民も受け入れる方針)。LINE 連携済みであること。
- 付与する側
- 自動(フォーム送信時に CommunityMember + User.lineUserId が作成される)
- 使える機能
- マイページ・残高・履歴/イベント参加とチェックイン/クーポン利用/お店マップ/町内移動 mobi/町民同士のポイント送金(KOTO_10)/プレミアム購入 入口
- 実装上の判定
- getMemberTier() が CommunityMember あり + User.lineUserId あり のとき 'citizen' を返す
👑 プレミアム琴平デジタル町民 プレミアム(住民証NFT保有)
住民証 NFT を保有する上位会員。選挙権・立候補・限定特典などの特別権利を持つ。
- 登録方法
- マイページ →『プレミアムへ』→ Shopify チェックアウトで住民証 NFT を購入。決済確定後、Cardano 上で NFT が発行され、確定通知 webhook 経由で自動的に Entitlement が付与される。
- 登録条件
- まず citizen であること(町民登録済)。住民証 NFT の年額を支払い、Entitlement の sku = 'membership-nft' が ACTIVE 状態であること。
- 付与する側
- 自動(Shopify webhook → NftMintRecord(PENDING) → Railway mint queue → 確定 webhook → Entitlement 作成)/運営が手動付与する場合もあり
- 使える機能
- citizen の全機能+プレミアム特典一覧・Discordサロン・限定クーポン・町長選挙の投票権(KOTO_12/13)/将来的に立候補権も
- 実装上の判定
- getMemberTier() が citizen 条件 + Entitlement(sku=membership-nft, source=NFT, status=ACTIVE) あり のとき 'premium' を返す。NFT 発行は非同期のため、決済直後は PENDING/PROCESSING 状態を経て MINTED に遷移する。
🛡運営ロール — 管理者・店舗オーナー側
🏪 お店お店管理者(Custom Role: shop)
お店のオーナー/店員。自店のクーポン発行・注文管理・売上確認ができる。
- 登録方法
- 運営(ADMIN)がメンバー管理画面で該当ユーザーに Custom Role『ショップ管理(shop)』を割り当てる。本人側の手続きは不要。
- 登録条件
- 琴平コミュニティのメンバー(citizen)であること。お店として登録されており、運営が審査して付与を判断する。
- 付与する側
- コミュニティの ADMIN/OWNER(= 琴平では三好さん・髙木さん)
- 使える機能
- お店管理画面 (KOTO_14) /クーポン発行 (merchant-coupon flow) /自店の注文管理
- 実装上の判定
- CommunityMember.roleId が CustomRole(slug='shop', permissions=['MANAGE_SHOP','MANAGE_ORDERS']) を指す。hasPermission(userId, communityId, 'MANAGE_SHOP') で判定
✨ 運営運営スタッフ(ORGANIZER)
運営スタッフ。イベント運営・メンバー管理などの中核操作ができる(所有権操作は除く)。
- 登録方法
- 既存の ADMIN/OWNER がメンバー管理画面で Staff Role を『ORGANIZER』に変更する。
- 登録条件
- コミュニティのメンバー(citizen)であること。運営チームとして信頼できる人物であること。
- 付与する側
- コミュニティの ADMIN/OWNER
- 使える機能
- admin-blast flow(お知らせ配信)/イベントチェックイン受付/メンバー管理の大半(追放や OWNER 変更を除く)
- 実装上の判定
- CommunityMember.role === 'ORGANIZER'。isStaffRole() で ADMIN/OWNER と同等の管理者として扱われる
🛡 管理者管理者(ADMIN)
管理者。ORGANIZER の全権限+メンバー追放・設定変更・ロール付与などの強権を持つ。
- 登録方法
- OWNER がメンバー管理画面で Staff Role を『ADMIN』に変更する(初期メンバーはここで指名)。
- 登録条件
- コミュニティのメンバー(citizen)で、信頼できる運営責任者であること。琴平では三好さん・髙木さんが該当。
- 付与する側
- OWNER(または既存 ADMIN が別 ADMIN を指名するケースもあり)
- 使える機能
- ORGANIZER の全権限+メンバー管理全般・Custom Role 付与(shop を誰に渡すか決める)・コミュニティ設定変更・全監査ログ閲覧
- 実装上の判定
- CommunityMember.role === 'ADMIN'。isAdminOrAbove() で true
👑 オーナーコミュニティオーナー(OWNER)
コミュニティの所有者。最高権限。課金・コミュニティ廃止・所有権移譲ができる。
- 登録方法
- コミュニティ作成時に自動で OWNER。所有権を譲りたい場合は既存 OWNER が別ユーザーに譲渡する(実装は限定的)。
- 登録条件
- 通常 1 人。複数 OWNER は技術的には可能だが推奨しない。
- 付与する側
- 作成時に自動付与/既存 OWNER による譲渡
- 使える機能
- ADMIN の全権限+コミュニティ廃止・所有権移譲・(将来)課金設定の変更
- 実装上の判定
- CommunityMember.role === 'OWNER'、もしくは Community.ownerOrganizerId === userId(後者は単一オーナー参照)。isOwner() で true
📊機能 × ロール マトリクス
〇 = 操作可能 / △ = 閲覧のみ / 空欄 = アクセス不可。各シーンは KOTO 番号で対応。
| KOTO | シーン | 👋 ゲスト | 🗾 町民 | 👑 プレミアム | 🏪 お店 | ✨ 運営 | 🛡 管理者 | 👑 オーナー |
|---|---|---|---|---|---|---|---|---|
| KOTO_1 | ① LINE友だち追加〜あいさつ | 〇 | 〇 | 〇 | — | — | — | — |
| KOTO_2 | ② リッチメニュー9面 | 〇 | 〇 | 〇 | — | — | — | — |
| KOTO_3 | ③ LINE連携〜町民登録 | 〇 | — | — | — | — | — | — |
| KOTO_4 | ④ マイページ(会員証・残高) | — | 〇 | 〇 | — | — | — | — |
| KOTO_5 | ⑤ イベント一覧・詳細 | △ | 〇 | 〇 | — | — | — | — |
| KOTO_6 | ⑥ イベントチェックイン | — | 〇 | 〇 | — | 〇 | 〇 | — |
| KOTO_7 | ⑦ お店一覧・クーポン利用 | △ | 〇 | 〇 | — | — | — | — |
| KOTO_8 | ⑧ お店マップ | 〇 | 〇 | 〇 | — | — | — | — |
| KOTO_9 | ⑨ 町内移動(mobi配車) | — | 〇 | 〇 | — | — | — | — |
| KOTO_10 | ⑩ 町民どうしでお礼pt送金 | — | 〇 | 〇 | — | — | — | — |
| KOTO_10B | ⑩B 未会員にもリンクで贈れる琴デジポイント | — | 〇 | 〇 | — | — | — | — |
| KOTO_11 | ⑪ プレミアム購入(Stripe風決済) | — | 〇 | — | — | — | — | — |
| KOTO_12 | ⑫ プレミアム特典一覧 | — | — | 〇 | — | — | — | — |
| KOTO_13 | ⑬ 町長選挙(候補者・投票) | △ | △ | 〇 | — | — | — | — |
| KOTO_14 | ⑭ お店オーナー管理画面 | — | — | — | 〇 | — | 〇 | 〇 |
| KOTO_15 | ⑮ スポットワーク(地域版タイミー) | — | 〇 | 〇 | 〇 | — | — | — |
| KOTO_16 | ⑯ お問い合わせフォーム | 〇 | 〇 | 〇 | — | — | — | — |
📝 補足
- 実装の SSoT は
src/lib/roles/。 設計書はdocs/reference/role-design.md。 - 琴平コミュニティの Custom Role は既に 7 種投入済み (shop / events / quests / members / points / orders / ops)。 実運用のロール割当はこれから(琴平お店オーナー 11 名に shop を割り当てる等)。
- 本ページの内容は現時点の実装と同期。変更があれば本ページと
role-design.mdを同時更新する。