diff --git a/src/tracker/api/projects.py b/src/tracker/api/projects.py index 869fd4b..f55bff0 100644 --- a/src/tracker/api/projects.py +++ b/src/tracker/api/projects.py @@ -11,6 +11,7 @@ from sqlalchemy.orm import selectinload from ..database import get_db from ..enums import ChatKind, MemberRole, ProjectStatus from ..models import Project, Chat, Member, ProjectMember +from ..ws.manager import manager from .schemas import ProjectOut router = APIRouter(tags=["projects"]) @@ -107,7 +108,16 @@ async def create_project(req: ProjectCreate, db: AsyncSession = Depends(get_db)) db.add(chat) await db.commit() - return await _project_out(project, db) + + out = await _project_out(project, db) + + # Broadcast project.created to all connected clients + await manager.broadcast_all({ + "type": "project.created", + "project": out.model_dump(), + }) + + return out @router.patch("/projects/{project_id}", response_model=ProjectOut) diff --git a/src/tracker/init_db.py b/src/tracker/init_db.py index 4559ae5..3b3f480 100644 --- a/src/tracker/init_db.py +++ b/src/tracker/init_db.py @@ -92,6 +92,21 @@ async def seed_dev_data(session: AsyncSession): session.add(ProjectMember(project_id=project.id, member_id=coder.id, role=MemberRole.MEMBER)) session.add(ProjectMember(project_id=project.id, member_id=architect.id, role=MemberRole.MEMBER)) + # Bridge (Telegram) + bridge = Member( + name="Telegram Bridge", + slug="bridge", + type=MemberType.BRIDGE, + role=MemberRole.MEMBER, + auth_method=AuthMethod.TOKEN, + token="tb-bridge-dev-token", + status=MemberStatus.OFFLINE, + ) + session.add(bridge) + await session.flush() + + session.add(ProjectMember(project_id=project.id, member_id=bridge.id, role=MemberRole.MEMBER)) + # Lobby chat lobby = Chat(kind=ChatKind.LOBBY, project_id=None) session.add(lobby) diff --git a/src/tracker/ws/manager.py b/src/tracker/ws/manager.py index dc0ccc0..13e2057 100644 --- a/src/tracker/ws/manager.py +++ b/src/tracker/ws/manager.py @@ -122,6 +122,7 @@ class ConnectionManager: # Humans/bridges get ALL messages if client.member_type in (MemberType.HUMAN, MemberType.BRIDGE): + logger.info("Sending message to %s (%s, type=%s)", client.member_slug, session_id[:8], client.member_type) await self.send_to_session(session_id, payload) continue