Private
Public Access
Add #roomname references in chat messages (#47)
Mirrors the existing @-mention system's shape: a regex finds #roomname tokens, extract_referenced_room_ids validates them against rooms the *sender* actually belongs to (mirrors mentions' "must be a real member" rule -- referencing a private room the sender isn't in would otherwise leak its existence), and a MessageRoomReference join row is stored per match in create_message. No notification/unread layer, unlike mentions -- referencing a room has no "you were referenced" semantics. Rendering is the same markdown-link rewrite trick MessageContent.tsx already uses for mentions (#username -> [#username](mention:username)), but resolved against the *viewer's* own room list (threaded down from ChatShellPage's room state through ChatPane/MessageList) rather than the stored server-side reference -- a reference to a room the current viewer isn't in quietly renders as plain text instead of a link, same as an @mention of someone outside the room does. The href scheme renders a real react-router Link instead of mentions' inert span, since a room reference is meant to be navigable. mention_service.strip_code_spans (was _strip_code_spans) is now shared between both extraction paths rather than private to one module. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,10 +6,11 @@ from sqlalchemy import or_, select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
from app.models import Message, MessageMention, MessageReaction
|
||||
from app.models import Message, MessageMention, MessageReaction, MessageRoomReference
|
||||
from app.schemas.message import ReactionSummary
|
||||
from app.services.link_preview_service import extract_first_url
|
||||
from app.services.mention_service import extract_mentioned_user_ids
|
||||
from app.services.room_reference_service import extract_referenced_room_ids
|
||||
|
||||
|
||||
class MessageNotFoundError(Exception):
|
||||
@@ -43,6 +44,9 @@ async def create_message(
|
||||
mentioned_ids = await extract_mentioned_user_ids(db, room_id, content)
|
||||
for mentioned_id in mentioned_ids:
|
||||
db.add(MessageMention(message_id=message.id, user_id=mentioned_id))
|
||||
referenced_room_ids = await extract_referenced_room_ids(db, user_id, content)
|
||||
for referenced_room_id in referenced_room_ids:
|
||||
db.add(MessageRoomReference(message_id=message.id, room_id=referenced_room_id))
|
||||
await db.commit()
|
||||
await db.refresh(message)
|
||||
return message
|
||||
|
||||
Reference in New Issue
Block a user