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)