|
import pymongo |
|
|
|
from info import DATABASE_URL, DATABASE_NAME |
|
|
|
import logging |
|
logger = logging.getLogger(__name__) |
|
logger.setLevel(logging.INFO) |
|
|
|
myclient = pymongo.MongoClient(DATABASE_URL) |
|
mydb = myclient[DATABASE_NAME] |
|
mycol = mydb['CONNECTION'] |
|
|
|
async def add_connection(group_id, user_id): |
|
""" |
|
Add a connection between a user and a group. |
|
""" |
|
logger.info(f"Adding connection for user {user_id} to group {group_id}.") |
|
query = mycol.find_one( |
|
{ "_id": user_id }, |
|
{ "_id": 0, "active_group": 0 } |
|
) |
|
if query is not None: |
|
group_ids = [x["group_id"] for x in query["group_details"]] |
|
if group_id in group_ids: |
|
logger.info(f"Connection already exists for user {user_id} to group {group_id}.") |
|
return False |
|
|
|
group_details = { |
|
"group_id" : group_id |
|
} |
|
|
|
data = { |
|
'_id': user_id, |
|
'group_details' : [group_details], |
|
'active_group' : group_id, |
|
} |
|
|
|
if mycol.count_documents( {"_id": user_id} ) == 0: |
|
try: |
|
mycol.insert_one(data) |
|
logger.info(f"New connection inserted for user {user_id} to group {group_id}.") |
|
return True |
|
except Exception as e: |
|
logger.exception(f"Error inserting new connection for user {user_id} to group {group_id}: {e}") |
|
else: |
|
try: |
|
mycol.update_one( |
|
{'_id': user_id}, |
|
{ |
|
"$push": {"group_details": group_details}, |
|
"$set": {"active_group" : group_id} |
|
} |
|
) |
|
logger.info(f"Existing connection updated for user {user_id} to group {group_id}.") |
|
return True |
|
except Exception as e: |
|
logger.exception(f"Error updating existing connection for user {user_id} to group {group_id}: {e}") |
|
|
|
async def active_connection(user_id): |
|
""" |
|
Get the active connection for a user. |
|
""" |
|
logger.info(f"Getting active connection for user {user_id}.") |
|
query = mycol.find_one( |
|
{ "_id": user_id }, |
|
{ "_id": 0, "group_details": 0 } |
|
) |
|
if not query: |
|
logger.info(f"No active connection found for user {user_id}.") |
|
return None |
|
|
|
group_id = query['active_group'] |
|
if group_id is not None: |
|
logger.info(f"Active connection found for user {user_id}: group {group_id}.") |
|
return int(group_id) |
|
else: |
|
logger.info(f"No active group set for user {user_id}.") |
|
return None |
|
|
|
async def all_connections(user_id): |
|
""" |
|
Get all connections for a user. |
|
""" |
|
logger.info(f"Getting all connections for user {user_id}.") |
|
query = mycol.find_one( |
|
{ "_id": user_id }, |
|
{ "_id": 0, "active_group": 0 } |
|
) |
|
if query is not None: |
|
group_ids = [x["group_id"] for x in query["group_details"]] |
|
logger.info(f"All connections for user {user_id}: {group_ids}.") |
|
return group_ids |
|
else: |
|
logger.info(f"No connections found for user {user_id}.") |
|
return None |
|
|
|
async def if_active(user_id, group_id): |
|
""" |
|
Check if a specific group is the active connection for a user. |
|
""" |
|
logger.info(f"Checking if group {group_id} is active for user {user_id}.") |
|
query = mycol.find_one( |
|
{ "_id": user_id }, |
|
{ "_id": 0, "group_details": 0 } |
|
) |
|
is_active = query is not None and query['active_group'] == group_id |
|
if is_active: |
|
logger.info(f"Group {group_id} is active for user {user_id}.") |
|
else: |
|
logger.info(f"Group {group_id} is not active for user {user_id}.") |
|
return is_active |
|
|
|
async def make_active(user_id, group_id): |
|
""" |
|
Set a specific group as the active connection for a user. |
|
""" |
|
logger.info(f"Making group {group_id} active for user {user_id}.") |
|
update = mycol.update_one( |
|
{'_id': user_id}, |
|
{"$set": {"active_group" : group_id}} |
|
) |
|
if update.modified_count != 0: |
|
logger.info(f"Group {group_id} set as active for user {user_id}.") |
|
else: |
|
logger.info(f"No active group modified for user {user_id}.") |
|
return update.modified_count != 0 |
|
|
|
async def make_inactive(user_id): |
|
""" |
|
Make a user's connection inactive. |
|
""" |
|
logger.info(f"Making connection inactive for user {user_id}.") |
|
update = mycol.update_one( |
|
{'_id': user_id}, |
|
{"$set": {"active_group" : None}} |
|
) |
|
if update.modified_count != 0: |
|
logger.info(f"Connection made inactive for user {user_id}.") |
|
else: |
|
logger.info(f"No active group modified for user {user_id}.") |
|
return update.modified_count != 0 |
|
|
|
async def delete_connection(user_id, group_id): |
|
""" |
|
Delete a specific connection between a user and a group. |
|
""" |
|
logger.info(f"Deleting connection for user {user_id} from group {group_id}.") |
|
try: |
|
update = mycol.update_one( |
|
{"_id": user_id}, |
|
{"$pull" : { "group_details" : {"group_id":group_id} } } |
|
) |
|
if update.modified_count == 0: |
|
logger.info(f"No connection found to delete for user {user_id} from group {group_id}.") |
|
return False |
|
query = mycol.find_one( |
|
{ "_id": user_id }, |
|
{ "_id": 0 } |
|
) |
|
if len(query["group_details"]) >= 1: |
|
if query['active_group'] == group_id: |
|
prvs_group_id = query["group_details"][len(query["group_details"]) - 1]["group_id"] |
|
mycol.update_one( |
|
{'_id': user_id}, |
|
{"$set": {"active_group" : prvs_group_id}} |
|
) |
|
logger.info(f"Active group changed to previous group {prvs_group_id} for user {user_id}.") |
|
else: |
|
mycol.update_one( |
|
{'_id': user_id}, |
|
{"$set": {"active_group" : None}} |
|
) |
|
logger.info(f"No group details left, active group set to None for user {user_id}.") |
|
logger.info(f"Connection deleted for user {user_id} from group {group_id}.") |
|
return True |
|
except Exception as e: |
|
logger.exception(f"Error deleting connection for user {user_id} from group {group_id}: {e}") |
|
return False |