Neda/Back/domains/groups/service.py
2026-03-07 19:09:49 +03:30

134 lines
3.7 KiB
Python

from sqlalchemy.ext.asyncio import AsyncSession
import uuid
from domains.users.repo import get_user_by_id
from domains.groups.models import Group, GroupMember, GroupType, GroupMemberRole
from domains.groups.repo import (
create_group,
get_group_by_id,
add_group_member,
get_user_groups,
get_group_members_with_details,
delete_group_member,
get_all_groups as repo_get_all_groups
)
from domains.realtime.presence_service import list_online_users
async def create_new_group(
db: AsyncSession,
name: str,
creator_id,
is_admin: bool
):
group_type = GroupType.PUBLIC if is_admin else GroupType.PRIVATE
group = Group(
name=name,
type=group_type
)
await create_group(db, group)
# Creator becomes Manager
membership = GroupMember(
group_id=group.id,
user_id=creator_id,
role=GroupMemberRole.MANAGER
)
await add_group_member(db, membership)
return group
async def invite_member_to_group(
db: AsyncSession,
group_id,
sender_id,
target_username: str
):
from domains.users.repo import get_user_by_username
from domains.notifications.service import send_join_request
# 1. Check if group exists
group = await get_group_by_id(db, group_id)
if not group:
raise ValueError("Group not found")
# 2. Check if target user exists
target_user = await get_user_by_username(db, target_username)
if not target_user:
raise ValueError("User not found")
# 3. Send notification (Req 12)
return await send_join_request(
db,
sender_id=str(sender_id),
receiver_id=str(target_user.id),
group_id=str(group.id),
title="Group Invitation",
description=f"You have been invited to join group {group.name}"
)
async def add_member_to_group(
db: AsyncSession,
group_id,
user_id,
role: GroupMemberRole = GroupMemberRole.MEMBER
):
membership = GroupMember(
group_id=group_id,
user_id=user_id,
role=role
)
return await add_group_member(db, membership)
async def list_user_groups(
db: AsyncSession,
user_id
):
return await get_user_groups(db, user_id)
async def list_all_groups_admin(db: AsyncSession):
return await repo_get_all_groups(db)
async def list_group_members_api(db: AsyncSession, group_id: str):
group_id_uuid = uuid.UUID(group_id)
members_data = await get_group_members_with_details(db, group_id_uuid)
online_users = await list_online_users(str(group_id))
result = []
for member_info in members_data:
member, username = member_info
result.append({
"user_id": member.user_id,
"username": username,
"role": member.role,
"is_online": str(member.user_id) in online_users
})
return result
async def remove_member_from_group(
db: AsyncSession,
group_id,
target_user_id,
requesting_user
):
group_id_uuid = group_id if isinstance(group_id, uuid.UUID) else uuid.UUID(group_id)
target_user_id_uuid = target_user_id if isinstance(target_user_id, uuid.UUID) else uuid.UUID(target_user_id)
# Req 13: Admin or Group Manager can remove
if not requesting_user.is_admin:
# Check if requesting user is manager of this group
from domains.groups.repo import get_group_member
membership = await get_group_member(db, group_id_uuid, requesting_user.id)
if not membership or membership.role != GroupMemberRole.MANAGER:
raise ValueError("Permission denied. Only admin or group manager can remove members.")
# For now, let's assume we implement the check here or in repo.
await delete_group_member(db, group_id_uuid, target_user_id_uuid)