docs: add block/mute user relations, emoji-sync CLI, and uid indexes
DevPlace CI / test (push) Failing after 2m7s

- Add `/block`, `/mute` endpoints with block/unblock and mute/unmute functionality in `routers/relations.py`, hiding blocked users' content everywhere except their own profile while muting only suppresses notifications
- Introduce `devplace emoji-sync` CLI command to regenerate `static/js/emoji-shortcodes.js` from the emoji library, documented in `CLAUDE.md` and wired in `cli.py`
- Create `get_blocked_uids()` database helper and apply it in `content.py` `load_detail()` to filter blocked users' posts from detail views
- Implement `_uid_index()` and `_drop_index()` helpers in `database.py` for unique uid indexes across tables, with `user_relations` added to `SOFT_DELETE_TABLES`
- Document new routes in `AGENTS.md` and `README.md`, including emoji shortcodes rendering behavior distinct from the emoji picker
This commit is contained in:
2026-06-19 08:06:09 +00:00
parent f3a4667fce
commit 741d7aade6
136 changed files with 3025 additions and 564 deletions
@@ -46,3 +46,34 @@ def test_seo_report_is_public_read_only_http_action():
assert "seo_report" not in CONFIRM_REQUIRED
names = {p.name for p in action.params}
assert "uid" in names
def test_block_mute_tools_exist_as_http_actions():
expected = {
"block_user": "/block/{username}",
"unblock_user": "/block/unblock/{username}",
"mute_user": "/mute/{username}",
"unmute_user": "/mute/unmute/{username}",
}
for name, path in expected.items():
action = BY_NAME[name]
assert action.handler == "http"
assert action.method == "POST"
assert action.path == path
assert action.requires_auth is True
assert action.requires_admin is False
assert "username" in {p.name for p in action.params}
def test_block_mute_tools_visible_to_authenticated_user():
schemas = PLATFORM_CATALOG.tool_schemas_for(authenticated=True, is_admin=False)
names = {s["function"]["name"] for s in schemas}
for name in ("block_user", "unblock_user", "mute_user", "unmute_user"):
assert name in names
def test_block_mute_tools_hidden_from_guests():
schemas = PLATFORM_CATALOG.tool_schemas_for(authenticated=False)
names = {s["function"]["name"] for s in schemas}
for name in ("block_user", "unblock_user", "mute_user", "unmute_user"):
assert name not in names