The app supports real-time messaging, where users can send personal messages to each other, or create group chats to have conversations between multiple team members.
📘 Backend Documentation: Group and Personal Chat System
Overview
This backend supports:
Personal and group messaging
Real-time-like polling with intelligent refresh
Group creation via modal with user search
Chat UI state preservation via query param (currentChatId)
Profile image, message state (sent, delivered, read)
PostgreSQL ENUMs and relationships via SQLAlchemy
🗂️ Database Models
User
Standard user model with profile data. Fields typically include:
@view_config(route_name='get_group_chat_messages', renderer='json')
def get_group_chat_messages(request):
chat_id = request.matchdict['chat_id']
chat = DBSession.query(Chat).get(chat_id)
if not chat or not chat.is_group:
raise HTTPNotFound
verify_chat_access(request.user.id, chat_id)
messages = DBSession.query(Message)...filter_by(chat_id=chat_id).order_by(Message.date_sent).all()
members = DBSession.query(User)...join(ChatUser).filter(ChatUser.chat_id == chat_id).all()
return {
'messages': serialize_group_messages(messages),
'chat_name': chat.groupmeta.name,
'description': chat.groupmeta.description,
'image_route': chat.groupmeta.image_route,
'creation_date': chat.created_at,
'members': serialize_users(members)
}
@view_config(route_name='search_global', renderer='json')
def search_global(request):
q = request.params.get('q', '').strip()
if not q or len(q) < 2:
return []
users = DBSession.query(User)...filter(...ilike(f'%{q}%')).limit(10).all()
return [serialize_user(u) for u in users]
@view_config(route_name='create_group_chat', request_method='POST')
def create_group_chat(request):
user_ids = request.POST.getall('user_ids')
if len(user_ids) < 2:
return HTTPBadRequest
chat = Chat(is_group=True, created_at=datetime.utcnow())
DBSession.add(chat)
DBSession.flush()
for uid in user_ids + [request.user.id]: # Include creator
link = ChatUser(chat_id=chat.id, user_id=uid)
DBSession.add(link)
groupmeta = GroupMeta(
chat_id=chat.id,
name=request.POST.get('group_name') or "Unnamed Group",
description=request.POST.get('group_description') or "",
image_route=request.POST.get('group_image_route') or ""
)
DBSession.add(groupmeta)
return HTTPFound(location=f'/chat?currentChatId={chat.id}')