Snapshot of in-progress work across local_backend, manager_dashboard, and waiter_pwa (pricing, chat, fiscal, prep zones, recovery codes, CRM, inventory, permissions), plus the nginx/docker-compose deploy fixes for the Unraid + NPM reverse-proxy setup. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
89 lines
2.3 KiB
Python
89 lines
2.3 KiB
Python
"""
|
|
Chat service — system group bootstrap helpers.
|
|
"""
|
|
from datetime import datetime, timezone
|
|
from sqlalchemy.orm import Session
|
|
|
|
from models.chat import Conversation, ConversationParticipant
|
|
from models.user import User
|
|
|
|
|
|
def _utcnow() -> datetime:
|
|
return datetime.now(timezone.utc)
|
|
|
|
|
|
def ensure_system_group(db: Session) -> Conversation:
|
|
"""
|
|
Guarantee that the single system-wide 'Ομάδα' group conversation exists.
|
|
If it is missing, create it and add all currently active users as participants.
|
|
Returns the (possibly freshly created) Conversation.
|
|
"""
|
|
existing = (
|
|
db.query(Conversation)
|
|
.filter(Conversation.is_system == True) # noqa: E712
|
|
.first()
|
|
)
|
|
if existing:
|
|
return existing
|
|
|
|
# Determine creator — first admin/manager user, or user id=1 as fallback
|
|
creator = (
|
|
db.query(User)
|
|
.filter(User.perm_access_dashboard == True, User.is_active == True) # noqa: E712
|
|
.order_by(User.id)
|
|
.first()
|
|
)
|
|
creator_id = creator.id if creator else 1
|
|
|
|
conv = Conversation(
|
|
type="group",
|
|
name="Ομάδα",
|
|
is_system=True,
|
|
created_by=creator_id,
|
|
)
|
|
db.add(conv)
|
|
db.flush() # get conv.id before adding participants
|
|
|
|
active_users = (
|
|
db.query(User).filter(User.is_active == True).all() # noqa: E712
|
|
)
|
|
now = _utcnow()
|
|
for u in active_users:
|
|
participant = ConversationParticipant(
|
|
conversation_id=conv.id,
|
|
user_id=u.id,
|
|
joined_at=now,
|
|
)
|
|
db.add(participant)
|
|
|
|
db.commit()
|
|
db.refresh(conv)
|
|
return conv
|
|
|
|
|
|
def add_user_to_system_group(db: Session, user_id: int) -> None:
|
|
"""
|
|
Add a user to the system group if not already a participant.
|
|
Safe to call even when the system group does not exist yet (it will be created).
|
|
"""
|
|
conv = ensure_system_group(db)
|
|
|
|
already = (
|
|
db.query(ConversationParticipant)
|
|
.filter(
|
|
ConversationParticipant.conversation_id == conv.id,
|
|
ConversationParticipant.user_id == user_id,
|
|
)
|
|
.first()
|
|
)
|
|
if already:
|
|
return
|
|
|
|
participant = ConversationParticipant(
|
|
conversation_id=conv.id,
|
|
user_id=user_id,
|
|
joined_at=_utcnow(),
|
|
)
|
|
db.add(participant)
|
|
db.commit()
|