Member invites, gallery resync, content and operator docs
- Invite flow: admin issue/revoke on join requests, public single-use claim links (hash-only tokens, 7-day expiry, no state reveal), claim creates the Member account and marks the request accepted - Gallery: admin status page plus resync endpoint; sync refreshes thumbnails whose content changed; tools/gallery contract and checker - Docs: public content page, admin-only operator runbook, api.md invite/gallery sections, all routes in the live API docs, docs reachability gate test - Screenshots cover the new pages; version 1.0.18
This commit is contained in:
@@ -10,6 +10,14 @@ class AdminIndexOut(OutModel):
|
||||
open_joins: int = 0
|
||||
user_count: int = 0
|
||||
deleted_count: int = 0
|
||||
flyer_count: int = 0
|
||||
meme_count: int = 0
|
||||
|
||||
|
||||
class GalleryStatusOut(OutModel):
|
||||
flyers: int = 0
|
||||
memes: int = 0
|
||||
missing: list[str] = []
|
||||
|
||||
|
||||
class AdminPostsOut(OutModel):
|
||||
|
||||
@@ -16,7 +16,16 @@ class JoinRequestOut(OutModel):
|
||||
link_title: str | None = None
|
||||
link_status: str | None = None
|
||||
created_at: str | None = None
|
||||
invite_open: bool = False
|
||||
invite_expires_at: str | None = None
|
||||
|
||||
|
||||
class JoinListOut(OutModel):
|
||||
requests: list[JoinRequestOut] = []
|
||||
|
||||
|
||||
class InvitePageOut(OutModel):
|
||||
valid: bool = False
|
||||
username: str = ""
|
||||
email: str = ""
|
||||
email_locked: bool = False
|
||||
|
||||
Reference in New Issue
Block a user